cleanups
[unix-history] / usr / src / sbin / XNSrouted / output.c
index ebb67b0..a74c2f2 100644 (file)
@@ -1,5 +1,14 @@
+/*
+ * Copyright (c) 1985 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * Includes material written at Cornell University by Bill Nesheim,
+ * by permission of the author.
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)output.c   4.5 (Berkeley) 4/9/84";
+static char sccsid[] = "@(#)output.c   5.5 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -57,12 +66,14 @@ supply(dst, flags, ifp)
        struct interface *ifp;
 {
        register struct rt_entry *rt;
        struct interface *ifp;
 {
        register struct rt_entry *rt;
-       struct netinfo *n = msg->rip_nets;
        register struct rthash *rh;
        register struct rthash *rh;
+       register struct netinfo *nn;
+       register struct netinfo *n = msg->rip_nets;
        struct rthash *base = hosthash;
        struct rthash *base = hosthash;
-       int doinghost = 1, size;
        struct sockaddr_ns *sns =  (struct sockaddr_ns *) dst;
        int (*output)() = afswitch[dst->sa_family].af_output;
        struct sockaddr_ns *sns =  (struct sockaddr_ns *) dst;
        int (*output)() = afswitch[dst->sa_family].af_output;
+       int doinghost = 1, size, metric;
+       union ns_net net;
 
        msg->rip_cmd = ntohs(RIPCMD_RESPONSE);
 again:
 
        msg->rip_cmd = ntohs(RIPCMD_RESPONSE);
 again:
@@ -75,9 +86,26 @@ again:
                        n = msg->rip_nets;
                }
                sns = (struct sockaddr_ns *)&rt->rt_dst;
                        n = msg->rip_nets;
                }
                sns = (struct sockaddr_ns *)&rt->rt_dst;
-               xnnet(n->rip_dst[0]) = ns_netof(sns->sns_addr);
-               n->rip_metric = htons(min(rt->rt_metric + 1, HOPCNT_INFINITY));
+               if ((rt->rt_flags & (RTF_HOST|RTF_GATEWAY)) == RTF_HOST)
+                       sns = (struct sockaddr_ns *)&rt->rt_router;
+               metric = min(rt->rt_metric + 1, HOPCNT_INFINITY);
+               net = sns->sns_addr.x_net;
+               /*
+                * Make sure that we don't put out a two net entries
+                * for a pt to pt link (one for the G route, one for the if)
+                * This is a kludge, and won't work if there are lots of nets.
+                */
+               for (nn = msg->rip_nets; nn < n; nn++) {
+                       if (ns_neteqnn(net, nn->rip_dst)) {
+                               if (metric < ntohs(nn->rip_metric))
+                                       nn->rip_metric = htons(metric);
+                               goto next;
+                       }
+               }
+               n->rip_dst = net;
+               n->rip_metric = htons(metric);
                n++;
                n++;
+       next:;
        }
        if (doinghost) {
                doinghost = 0;
        }
        if (doinghost) {
                doinghost = 0;