careful about deleting route to interface in addrouteforif
[unix-history] / usr / src / sbin / routed / main.c
index a3d8aa8..b605783 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)main.c     4.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)main.c     4.11 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -7,15 +7,20 @@ static char sccsid[] = "@(#)main.c    4.5 (Berkeley) %G%";
  */
 #include "defs.h"
 #include <sys/ioctl.h>
  */
 #include "defs.h"
 #include <sys/ioctl.h>
+#include <sys/time.h>
+
 #include <net/if.h>
 #include <net/if.h>
+
 #include <errno.h>
 #include <nlist.h>
 #include <signal.h>
 #include <errno.h>
 #include <nlist.h>
 #include <signal.h>
-#include <time.h>
+#include <syslog.h>
 
 int    supplier = -1;          /* process should supply updates */
 
 int    supplier = -1;          /* process should supply updates */
+extern int gateway;
 
 struct rip *msg = (struct rip *)packet;
 
 struct rip *msg = (struct rip *)packet;
+int    hup();
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -29,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");
@@ -64,7 +70,18 @@ main(argc, argv)
                        argv++, argc--;
                        continue;
                }
                        argv++, argc--;
                        continue;
                }
-               fprintf(stderr, "usage: routed [ -s ] [ -q ] [ -t ]\n");
+               if (strcmp(*argv, "-g") == 0) {
+                       gateway = 1;
+                       argv++, argc--;
+                       continue;
+               }
+               if (strcmp(*argv, "-l") == 0) {
+                       gateway = -1;
+                       argv++, argc--;
+                       continue;
+               }
+               fprintf(stderr,
+                       "usage: routed [ -s ] [ -q ] [ -t ] [ -g ] [ -l ]\n");
                exit(1);
        }
 #ifndef DEBUG
                exit(1);
        }
 #ifndef DEBUG
@@ -111,12 +128,12 @@ main(argc, argv)
        msg->rip_vers = RIPVERSION;
        msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
        msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
        msg->rip_vers = RIPVERSION;
        msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
        msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
-#ifdef notyet
        msg->rip_nets[0].rip_dst.sa_family = htons(AF_UNSPEC);
        msg->rip_nets[0].rip_metric = htonl(HOPCNT_INFINITY);
        msg->rip_nets[0].rip_dst.sa_family = htons(AF_UNSPEC);
        msg->rip_nets[0].rip_metric = htonl(HOPCNT_INFINITY);
-#endif
        toall(sendmsg);
        toall(sendmsg);
-       sigset(SIGALRM, timer);
+       signal(SIGALRM, timer);
+       signal(SIGHUP, hup);
+       signal(SIGTERM, hup);
        timer();
 
        for (;;) {
        timer();
 
        for (;;) {
@@ -144,7 +161,7 @@ process(fd)
        int fd;
 {
        struct sockaddr from;
        int fd;
 {
        struct sockaddr from;
-       int fromlen = sizeof (from), cc;
+       int fromlen = sizeof (from), cc, omask;
 
        cc = recvfrom(fd, packet, sizeof (packet), 0, &from, &fromlen);
        if (cc <= 0) {
 
        cc = recvfrom(fd, packet, sizeof (packet), 0, &from, &fromlen);
        if (cc <= 0) {
@@ -154,16 +171,17 @@ process(fd)
        }
        if (fromlen != sizeof (struct sockaddr_in))
                return;
        }
        if (fromlen != sizeof (struct sockaddr_in))
                return;
-       sighold(SIGALRM);
+#define        mask(s) (1<<((s)-1))
+       omask = sigblock(mask(SIGALRM));
        rip_input(&from, cc);
        rip_input(&from, cc);
-       sigrelse(SIGALRM);
+       sigsetmask(omask);
 }
 
 getsocket(domain, type, sin)
        int domain, type;
        struct sockaddr_in *sin;
 {
 }
 
 getsocket(domain, type, 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) {
@@ -171,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);
 }