syslog for interface transitions; broadcast all unreachable before exit
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Fri, 21 Dec 1984 10:04:43 +0000 (02:04 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Fri, 21 Dec 1984 10:04:43 +0000 (02:04 -0800)
SCCS-vsn: sbin/routed/main.c 4.11
SCCS-vsn: sbin/routed/startup.c 4.7
SCCS-vsn: sbin/routed/tables.c 4.10

usr/src/sbin/routed/main.c
usr/src/sbin/routed/startup.c
usr/src/sbin/routed/tables.c

index a68a3a0..b605783 100644 (file)
@@ -14,6 +14,7 @@ static char sccsid[] = "@(#)main.c    4.11 (Berkeley) %G%";
 #include <errno.h>
 #include <nlist.h>
 #include <signal.h>
 #include <errno.h>
 #include <nlist.h>
 #include <signal.h>
+#include <syslog.h>
 
 int    supplier = -1;          /* process should supply updates */
 extern int gateway;
 
 int    supplier = -1;          /* process should supply updates */
 extern int gateway;
@@ -33,6 +34,7 @@ main(argc, argv)
 #endif
        
        argv0 = argv;
 #endif
        
        argv0 = argv;
+       openlog("routed", LOG_PID, 0);
        sp = getservbyname("router", "udp");
        if (sp == NULL) {
                fprintf(stderr, "routed: router/udp: unknown service\n");
        sp = getservbyname("router", "udp");
        if (sp == NULL) {
                fprintf(stderr, "routed: router/udp: unknown service\n");
@@ -131,6 +133,7 @@ main(argc, argv)
        toall(sendmsg);
        signal(SIGALRM, timer);
        signal(SIGHUP, hup);
        toall(sendmsg);
        signal(SIGALRM, timer);
        signal(SIGHUP, hup);
+       signal(SIGTERM, hup);
        timer();
 
        for (;;) {
        timer();
 
        for (;;) {
@@ -178,7 +181,7 @@ getsocket(domain, type, sin)
        int domain, type;
        struct sockaddr_in *sin;
 {
        int domain, type;
        struct sockaddr_in *sin;
 {
-       int retry, s;
+       int retry, s, on = 1;
 
        retry = 1;
        while ((s = socket(domain, type, 0, 0)) < 0 && retry) {
 
        retry = 1;
        while ((s = socket(domain, type, 0, 0)) < 0 && retry) {
@@ -186,14 +189,22 @@ getsocket(domain, type, sin)
                sleep(5 * retry);
                retry <<= 1;
        }
                sleep(5 * retry);
                retry <<= 1;
        }
-       if (retry == 0)
+       if (retry == 0) {
+               syslog(LOG_ERR, "socket: %m");
                return (-1);
                return (-1);
+       }
+       if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on)) < 0) {
+               syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m");
+               exit(1);
+       }
        while (bind(s, sin, sizeof (*sin), 0) < 0 && retry) {
                perror("bind");
                sleep(5 * retry);
                retry <<= 1;
        }
        while (bind(s, sin, sizeof (*sin), 0) < 0 && retry) {
                perror("bind");
                sleep(5 * retry);
                retry <<= 1;
        }
-       if (retry == 0)
+       if (retry == 0) {
+               syslog(LOG_ERR, "bind: %m");
                return (-1);
                return (-1);
+       }
        return (s);
 }
        return (s);
 }
index f6f01fe..86d91b3 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)startup.c  4.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)startup.c  4.7 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -9,6 +9,7 @@ static char sccsid[] = "@(#)startup.c   4.6 (Berkeley) %G%";
 #include <sys/ioctl.h>
 #include <net/if.h>
 #include <nlist.h>
 #include <sys/ioctl.h>
 #include <net/if.h>
 #include <nlist.h>
+#include <syslog.h>
 
 struct interface *ifnet;
 int    kmem = -1;
 
 struct interface *ifnet;
 int    kmem = -1;
@@ -150,6 +151,8 @@ addrouteforif(ifp)
                net.sin_addr = inet_makeaddr(ifp->int_net, INADDR_ANY);
                dst = (struct sockaddr *)&net;
        }
                net.sin_addr = inet_makeaddr(ifp->int_net, INADDR_ANY);
                dst = (struct sockaddr *)&net;
        }
+       if (ifp->int_transitions++ > 0)
+               syslog(LOG_ERR, "re-installing interface %s", ifp->int_name);
        rt = rtlookup(dst);
        rtadd(dst, &ifp->int_addr, ifp->int_metric,
                ifp->int_flags & (IFF_INTERFACE|IFF_PASSIVE|IFF_REMOTE));
        rt = rtlookup(dst);
        rtadd(dst, &ifp->int_addr, ifp->int_metric,
                ifp->int_flags & (IFF_INTERFACE|IFF_PASSIVE|IFF_REMOTE));
index 098ceee..a4c6b11 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)tables.c   4.9 (Berkeley) %G%";
+static char sccsid[] = "@(#)tables.c   4.10 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -8,6 +8,7 @@ static char sccsid[] = "@(#)tables.c    4.9 (Berkeley) %G%";
 #include "defs.h"
 #include <sys/ioctl.h>
 #include <errno.h>
 #include "defs.h"
 #include <sys/ioctl.h>
 #include <errno.h>
+#include <syslog.h>
 
 #ifndef DEBUG
 #define        DEBUG   0
 
 #ifndef DEBUG
 #define        DEBUG   0
@@ -162,7 +163,12 @@ rtchange(rt, gate, metric)
                        rt->rt_router = *gate;
                }
                rt->rt_metric = metric;
                        rt->rt_router = *gate;
                }
                rt->rt_metric = metric;
-               rt->rt_state &= ~RTS_INTERFACE;
+               if ((rt->rt_state & RTS_INTERFACE) && metric) {
+                       rt->rt_state &= ~RTS_INTERFACE;
+                       syslog(LOG_ERR,
+                               "deleting route to interface %s (timed out)",
+                               rt->rt_ifp->int_name);
+               }
                if (metric)
                        rt->rt_state |= RTF_GATEWAY;
                rt->rt_state |= RTS_CHANGED;
                if (metric)
                        rt->rt_state |= RTF_GATEWAY;
                rt->rt_state |= RTS_CHANGED;
@@ -180,6 +186,9 @@ rtdelete(rt)
        struct rt_entry *rt;
 {
 
        struct rt_entry *rt;
 {
 
+       if (rt->rt_state & RTS_INTERFACE)
+               syslog(LOG_ERR, "deleting route to interface %s (timed out)",
+                       rt->rt_ifp->int_name);
        TRACE_ACTION(DELETE, rt);
        if (install && ioctl(s, SIOCDELRT, (char *)&rt->rt_rt))
                perror("SIOCDELRT");
        TRACE_ACTION(DELETE, rt);
        if (install && ioctl(s, SIOCDELRT, (char *)&rt->rt_rt))
                perror("SIOCDELRT");