Annotation of 43BSD/etc/routed/main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)main.c     5.7 (Berkeley) 4/20/86";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * Routing Table Management Daemon
                     19:  */
                     20: #include "defs.h"
                     21: #include <sys/ioctl.h>
                     22: #include <sys/time.h>
                     23: 
                     24: #include <net/if.h>
                     25: 
                     26: #include <errno.h>
                     27: #include <signal.h>
                     28: #include <syslog.h>
                     29: 
                     30: int    supplier = -1;          /* process should supply updates */
                     31: int    gateway = 0;            /* 1 if we are a gateway to parts beyond */
                     32: 
                     33: struct rip *msg = (struct rip *)packet;
                     34: int    hup();
                     35: 
                     36: main(argc, argv)
                     37:        int argc;
                     38:        char *argv[];
                     39: {
                     40:        int cc;
                     41:        struct sockaddr from;
                     42:        u_char retry;
                     43:        
                     44:        argv0 = argv;
                     45:        openlog("routed", LOG_PID | LOG_ODELAY, LOG_DAEMON);
                     46:        setlogmask(LOG_UPTO(LOG_WARNING));
                     47:        sp = getservbyname("router", "udp");
                     48:        if (sp == NULL) {
                     49:                fprintf(stderr, "routed: router/udp: unknown service\n");
                     50:                exit(1);
                     51:        }
                     52:        addr.sin_family = AF_INET;
                     53:        addr.sin_port = sp->s_port;
                     54:        s = getsocket(AF_INET, SOCK_DGRAM, &addr);
                     55:        if (s < 0)
                     56:                exit(1);
                     57:        argv++, argc--;
                     58:        while (argc > 0 && **argv == '-') {
                     59:                if (strcmp(*argv, "-s") == 0) {
                     60:                        supplier = 1;
                     61:                        argv++, argc--;
                     62:                        continue;
                     63:                }
                     64:                if (strcmp(*argv, "-q") == 0) {
                     65:                        supplier = 0;
                     66:                        argv++, argc--;
                     67:                        continue;
                     68:                }
                     69:                if (strcmp(*argv, "-t") == 0) {
                     70:                        tracepackets++;
                     71:                        setlogmask(LOG_UPTO(LOG_DEBUG));
                     72:                        argv++, argc--;
                     73:                        continue;
                     74:                }
                     75:                if (strcmp(*argv, "-d") == 0) {
                     76:                        setlogmask(LOG_UPTO(LOG_DEBUG));
                     77:                        argv++, argc--;
                     78:                        continue;
                     79:                }
                     80:                if (strcmp(*argv, "-g") == 0) {
                     81:                        gateway = 1;
                     82:                        argv++, argc--;
                     83:                        continue;
                     84:                }
                     85:                fprintf(stderr,
                     86:                        "usage: routed [ -s ] [ -q ] [ -t ] [ -g ]\n");
                     87:                exit(1);
                     88:        }
                     89: #ifndef DEBUG
                     90:        if (!tracepackets) {
                     91:                int t;
                     92: 
                     93:                if (fork())
                     94:                        exit(0);
                     95:                for (t = 0; t < 20; t++)
                     96:                        if (t != s)
                     97:                                (void) close(t);
                     98:                (void) open("/", 0);
                     99:                (void) dup2(0, 1);
                    100:                (void) dup2(0, 2);
                    101:                t = open("/dev/tty", 2);
                    102:                if (t >= 0) {
                    103:                        ioctl(t, TIOCNOTTY, (char *)0);
                    104:                        (void) close(t);
                    105:                }
                    106:        }
                    107: #endif
                    108:        /*
                    109:         * Any extra argument is considered
                    110:         * a tracing log file.
                    111:         */
                    112:        if (argc > 0)
                    113:                traceon(*argv);
                    114:        /*
                    115:         * Collect an initial view of the world by
                    116:         * checking the interface configuration and the gateway kludge
                    117:         * file.  Then, send a request packet on all
                    118:         * directly connected networks to find out what
                    119:         * everyone else thinks.
                    120:         */
                    121:        rtinit();
                    122:        gwkludge();
                    123:        ifinit();
                    124:        if (gateway > 0)
                    125:                rtdefault();
                    126:        if (supplier < 0)
                    127:                supplier = 0;
                    128:        msg->rip_cmd = RIPCMD_REQUEST;
                    129:        msg->rip_vers = RIPVERSION;
                    130:        msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
                    131:        msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
                    132:        msg->rip_nets[0].rip_dst.sa_family = htons(AF_UNSPEC);
                    133:        msg->rip_nets[0].rip_metric = htonl(HOPCNT_INFINITY);
                    134:        toall(sendmsg);
                    135:        signal(SIGALRM, timer);
                    136:        signal(SIGHUP, hup);
                    137:        signal(SIGTERM, hup);
                    138:        timer();
                    139: 
                    140:        for (;;) {
                    141:                int ibits;
                    142:                register int n;
                    143: 
                    144:                ibits = 1 << s;
                    145:                n = select(20, &ibits, 0, 0, 0);
                    146:                if (n < 0)
                    147:                        continue;
                    148:                if (ibits & (1 << s))
                    149:                        process(s);
                    150:                /* handle ICMP redirects */
                    151:        }
                    152: }
                    153: 
                    154: process(fd)
                    155:        int fd;
                    156: {
                    157:        struct sockaddr from;
                    158:        int fromlen = sizeof (from), cc, omask;
                    159: 
                    160:        cc = recvfrom(fd, packet, sizeof (packet), 0, &from, &fromlen);
                    161:        if (cc <= 0) {
                    162:                if (cc < 0 && errno != EINTR)
                    163:                        perror("recvfrom");
                    164:                return;
                    165:        }
                    166:        if (fromlen != sizeof (struct sockaddr_in))
                    167:                return;
                    168:        omask = sigblock(sigmask(SIGALRM));
                    169:        rip_input(&from, cc);
                    170:        sigsetmask(omask);
                    171: }
                    172: 
                    173: getsocket(domain, type, sin)
                    174:        int domain, type;
                    175:        struct sockaddr_in *sin;
                    176: {
                    177:        int s, on = 1;
                    178: 
                    179:        if ((s = socket(domain, type, 0)) < 0) {
                    180:                perror("socket");
                    181:                syslog(LOG_ERR, "socket: %m");
                    182:                return (-1);
                    183:        }
                    184:        if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on)) < 0) {
                    185:                syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m");
                    186:                close(s);
                    187:                return (-1);
                    188:        }
                    189:        if (bind(s, sin, sizeof (*sin), 0) < 0) {
                    190:                perror("bind");
                    191:                syslog(LOG_ERR, "bind: %m");
                    192:                close(s);
                    193:                return (-1);
                    194:        }
                    195:        return (s);
                    196: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.