many cleanups; avoid interface timing out; put it back asap
[unix-history] / usr / src / sbin / routed / main.c
index 21f4c27..dc045bb 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)main.c     4.2 %G%";
+static char sccsid[] = "@(#)main.c     4.9 (Berkeley) %G%";
 #endif
 
 /*
 #endif
 
 /*
@@ -7,15 +7,18 @@ static char sccsid[] = "@(#)main.c    4.2 %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>
 
 int    supplier = -1;          /* process should supply updates */
 
 struct rip *msg = (struct rip *)packet;
 
 int    supplier = -1;          /* process should supply updates */
 
 struct rip *msg = (struct rip *)packet;
+int    hup();
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -29,21 +32,6 @@ main(argc, argv)
 #endif
        
        argv0 = argv;
 #endif
        
        argv0 = argv;
-#ifndef DEBUG
-       if (fork())
-               exit(0);
-       for (cc = 0; cc < 10; cc++)
-               (void) close(cc);
-       (void) open("/", 0);
-       (void) dup2(0, 1);
-       (void) dup2(0, 2);
-       { int t = open("/dev/tty", 2);
-         if (t >= 0) {
-               ioctl(t, TIOCNOTTY, (char *)0);
-               (void) close(t);
-         }
-       }
-#endif
        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,19 +52,46 @@ main(argc, argv)
 #endif
        argv++, argc--;
        while (argc > 0 && **argv == '-') {
 #endif
        argv++, argc--;
        while (argc > 0 && **argv == '-') {
-               if (!strcmp(*argv, "-s") == 0) {
+               if (strcmp(*argv, "-s") == 0) {
                        supplier = 1;
                        argv++, argc--;
                        continue;
                }
                        supplier = 1;
                        argv++, argc--;
                        continue;
                }
-               if (!strcmp(*argv, "-q") == 0) {
+               if (strcmp(*argv, "-q") == 0) {
                        supplier = 0;
                        argv++, argc--;
                        continue;
                }
                        supplier = 0;
                        argv++, argc--;
                        continue;
                }
-               fprintf(stderr, "usage: routed [ -s ] [ -q ]\n");
+               if (strcmp(*argv, "-t") == 0) {
+                       tracepackets++;
+                       argv++, argc--;
+                       continue;
+               }
+               fprintf(stderr, "usage: routed [ -s ] [ -q ] [ -t ]\n");
                exit(1);
        }
                exit(1);
        }
+#ifndef DEBUG
+       if (!tracepackets) {
+               int t;
+
+               if (fork())
+                       exit(0);
+               for (t = 0; t < 20; t++)
+                       if (t != s)
+#ifdef COMPAT
+                               if (t != snoroute)
+#endif
+                               (void) close(cc);
+               (void) open("/", 0);
+               (void) dup2(0, 1);
+               (void) dup2(0, 2);
+               t = open("/dev/tty", 2);
+               if (t >= 0) {
+                       ioctl(t, TIOCNOTTY, (char *)0);
+                       (void) close(t);
+               }
+       }
+#endif
        /*
         * Any extra argument is considered
         * a tracing log file.
        /*
         * Any extra argument is considered
         * a tracing log file.
@@ -96,10 +111,14 @@ main(argc, argv)
        if (supplier < 0)
                supplier = 0;
        msg->rip_cmd = RIPCMD_REQUEST;
        if (supplier < 0)
                supplier = 0;
        msg->rip_cmd = RIPCMD_REQUEST;
+       msg->rip_vers = RIPVERSION;
        msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
        msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
        msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
        msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
+       msg->rip_nets[0].rip_dst.sa_family = htons(AF_UNSPEC);
+       msg->rip_nets[0].rip_metric = htonl(HOPCNT_INFINITY);
        toall(sendmsg);
        toall(sendmsg);
-       sigset(SIGALRM, timer);
+       signal(SIGALRM, timer);
+       signal(SIGHUP, hup);
        timer();
 
        for (;;) {
        timer();
 
        for (;;) {
@@ -127,7 +146,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) {
@@ -137,9 +156,10 @@ 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)
 }
 
 getsocket(domain, type, sin)