Commit | Line | Data |
---|---|---|
5ff67f98 | 1 | /* |
71d47350 | 2 | * Copyright (c) 1983, 1988 Regents of the University of California. |
0eb85d71 KB |
3 | * All rights reserved. |
4 | * | |
5 | * Redistribution and use in source and binary forms are permitted | |
b8c620d6 KB |
6 | * provided that the above copyright notice and this paragraph are |
7 | * duplicated in all such forms and that any documentation, | |
8 | * advertising materials, and other materials related to such | |
9 | * distribution and use acknowledge that the software was developed | |
10 | * by the University of California, Berkeley. The name of the | |
11 | * University may not be used to endorse or promote products derived | |
12 | * from this software without specific prior written permission. | |
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR | |
14 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED | |
15 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
5ff67f98 DF |
16 | */ |
17 | ||
18 | #ifndef lint | |
19 | char copyright[] = | |
71d47350 | 20 | "@(#) Copyright (c) 1983, 1988 Regents of the University of California.\n\ |
5ff67f98 | 21 | All rights reserved.\n"; |
0eb85d71 | 22 | #endif /* not lint */ |
5ff67f98 | 23 | |
fdd0ed12 | 24 | #ifndef lint |
265a3175 | 25 | static char sccsid[] = "@(#)main.c 5.15 (Berkeley) %G%"; |
0eb85d71 | 26 | #endif /* not lint */ |
fdd0ed12 SL |
27 | |
28 | /* | |
29 | * Routing Table Management Daemon | |
30 | */ | |
7fe7fe74 | 31 | #include "defs.h" |
fdd0ed12 | 32 | #include <sys/ioctl.h> |
e2feeea9 SL |
33 | #include <sys/time.h> |
34 | ||
fdd0ed12 | 35 | #include <net/if.h> |
e2feeea9 | 36 | |
71d47350 MK |
37 | #include <sys/errno.h> |
38 | #include <sys/signal.h> | |
39 | #include <sys/syslog.h> | |
fdd0ed12 SL |
40 | |
41 | int supplier = -1; /* process should supply updates */ | |
d002aa8c | 42 | int gateway = 0; /* 1 if we are a gateway to parts beyond */ |
7892134c | 43 | int debug = 0; |
fdd0ed12 SL |
44 | |
45 | struct rip *msg = (struct rip *)packet; | |
71d47350 | 46 | int hup(), rtdeleteall(), sigtrace(); |
fdd0ed12 SL |
47 | |
48 | main(argc, argv) | |
49 | int argc; | |
50 | char *argv[]; | |
51 | { | |
52 | int cc; | |
53 | struct sockaddr from; | |
7fe7fe74 | 54 | u_char retry; |
fdd0ed12 SL |
55 | |
56 | argv0 = argv; | |
265a3175 | 57 | #if BSD >= 43 |
a349306d | 58 | openlog("routed", LOG_PID | LOG_ODELAY, LOG_DAEMON); |
bb3e151c | 59 | setlogmask(LOG_WARNING); |
fdd0ed12 | 60 | sp = getservbyname("router", "udp"); |
7fe7fe74 SL |
61 | if (sp == NULL) { |
62 | fprintf(stderr, "routed: router/udp: unknown service\n"); | |
fdd0ed12 SL |
63 | exit(1); |
64 | } | |
7fe7fe74 SL |
65 | addr.sin_family = AF_INET; |
66 | addr.sin_port = sp->s_port; | |
67 | s = getsocket(AF_INET, SOCK_DGRAM, &addr); | |
68 | if (s < 0) | |
69 | exit(1); | |
fdd0ed12 SL |
70 | argv++, argc--; |
71 | while (argc > 0 && **argv == '-') { | |
d4b6a849 | 72 | if (strcmp(*argv, "-s") == 0) { |
fdd0ed12 SL |
73 | supplier = 1; |
74 | argv++, argc--; | |
75 | continue; | |
76 | } | |
d4b6a849 | 77 | if (strcmp(*argv, "-q") == 0) { |
fdd0ed12 SL |
78 | supplier = 0; |
79 | argv++, argc--; | |
80 | continue; | |
81 | } | |
d4b6a849 | 82 | if (strcmp(*argv, "-t") == 0) { |
71d47350 MK |
83 | if (tracehistory == 0) |
84 | tracehistory++; | |
85 | else { | |
86 | tracehistory = 0; | |
87 | tracepackets++; | |
88 | } | |
bb3e151c | 89 | setlogmask(LOG_DEBUG); |
17fe297f MK |
90 | argv++, argc--; |
91 | continue; | |
92 | } | |
93 | if (strcmp(*argv, "-d") == 0) { | |
7892134c | 94 | debug++; |
bb3e151c | 95 | setlogmask(LOG_DEBUG); |
d4b6a849 SL |
96 | argv++, argc--; |
97 | continue; | |
98 | } | |
5562f0a3 MK |
99 | if (strcmp(*argv, "-g") == 0) { |
100 | gateway = 1; | |
101 | argv++, argc--; | |
102 | continue; | |
103 | } | |
5562f0a3 | 104 | fprintf(stderr, |
d002aa8c | 105 | "usage: routed [ -s ] [ -q ] [ -t ] [ -g ]\n"); |
fdd0ed12 SL |
106 | exit(1); |
107 | } | |
7892134c | 108 | if (tracepackets == 0 && debug == 0) { |
d4b6a849 SL |
109 | int t; |
110 | ||
111 | if (fork()) | |
112 | exit(0); | |
7620381d SL |
113 | for (t = 0; t < 20; t++) |
114 | if (t != s) | |
2b478949 | 115 | (void) close(t); |
d4b6a849 SL |
116 | (void) open("/", 0); |
117 | (void) dup2(0, 1); | |
118 | (void) dup2(0, 2); | |
119 | t = open("/dev/tty", 2); | |
120 | if (t >= 0) { | |
121 | ioctl(t, TIOCNOTTY, (char *)0); | |
122 | (void) close(t); | |
123 | } | |
124 | } | |
7fe7fe74 SL |
125 | /* |
126 | * Any extra argument is considered | |
127 | * a tracing log file. | |
128 | */ | |
129 | if (argc > 0) | |
130 | traceon(*argv); | |
fdd0ed12 SL |
131 | /* |
132 | * Collect an initial view of the world by | |
d002aa8c | 133 | * checking the interface configuration and the gateway kludge |
fdd0ed12 SL |
134 | * file. Then, send a request packet on all |
135 | * directly connected networks to find out what | |
136 | * everyone else thinks. | |
137 | */ | |
138 | rtinit(); | |
fdd0ed12 | 139 | ifinit(); |
34894a1d | 140 | gwkludge(); |
d002aa8c MK |
141 | if (gateway > 0) |
142 | rtdefault(); | |
fdd0ed12 SL |
143 | if (supplier < 0) |
144 | supplier = 0; | |
145 | msg->rip_cmd = RIPCMD_REQUEST; | |
55d340a4 | 146 | msg->rip_vers = RIPVERSION; |
fdd0ed12 SL |
147 | msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC; |
148 | msg->rip_nets[0].rip_metric = HOPCNT_INFINITY; | |
55d340a4 SL |
149 | msg->rip_nets[0].rip_dst.sa_family = htons(AF_UNSPEC); |
150 | msg->rip_nets[0].rip_metric = htonl(HOPCNT_INFINITY); | |
fdd0ed12 | 151 | toall(sendmsg); |
ce5e9df4 | 152 | signal(SIGALRM, timer); |
b7e4f8be | 153 | signal(SIGHUP, hup); |
69b7ef61 | 154 | signal(SIGTERM, hup); |
7892134c | 155 | signal(SIGINT, rtdeleteall); |
71d47350 MK |
156 | signal(SIGUSR1, sigtrace); |
157 | signal(SIGUSR2, sigtrace); | |
fdd0ed12 SL |
158 | timer(); |
159 | ||
fdd0ed12 SL |
160 | for (;;) { |
161 | int ibits; | |
162 | register int n; | |
163 | ||
7fe7fe74 | 164 | ibits = 1 << s; |
7fe7fe74 | 165 | n = select(20, &ibits, 0, 0, 0); |
fdd0ed12 SL |
166 | if (n < 0) |
167 | continue; | |
168 | if (ibits & (1 << s)) | |
169 | process(s); | |
7fe7fe74 | 170 | /* handle ICMP redirects */ |
fdd0ed12 SL |
171 | } |
172 | } | |
173 | ||
174 | process(fd) | |
175 | int fd; | |
176 | { | |
fdd0ed12 | 177 | struct sockaddr from; |
ce5e9df4 | 178 | int fromlen = sizeof (from), cc, omask; |
71d47350 | 179 | time_t now; |
fdd0ed12 | 180 | |
7fe7fe74 | 181 | cc = recvfrom(fd, packet, sizeof (packet), 0, &from, &fromlen); |
fdd0ed12 SL |
182 | if (cc <= 0) { |
183 | if (cc < 0 && errno != EINTR) | |
7fe7fe74 | 184 | perror("recvfrom"); |
fdd0ed12 SL |
185 | return; |
186 | } | |
7fe7fe74 SL |
187 | if (fromlen != sizeof (struct sockaddr_in)) |
188 | return; | |
71d47350 MK |
189 | if (traceactions && !tracepackets) { |
190 | (void) time(&now); | |
191 | curtime = ctime(&now); | |
192 | } | |
2b478949 | 193 | omask = sigblock(sigmask(SIGALRM)); |
fdd0ed12 | 194 | rip_input(&from, cc); |
ce5e9df4 | 195 | sigsetmask(omask); |
fdd0ed12 | 196 | } |
7fe7fe74 SL |
197 | |
198 | getsocket(domain, type, sin) | |
199 | int domain, type; | |
200 | struct sockaddr_in *sin; | |
201 | { | |
3d42e160 | 202 | int s, on = 1; |
7fe7fe74 | 203 | |
9fe072d4 | 204 | if ((s = socket(domain, type, 0)) < 0) { |
7fe7fe74 | 205 | perror("socket"); |
69b7ef61 | 206 | syslog(LOG_ERR, "socket: %m"); |
7fe7fe74 | 207 | return (-1); |
69b7ef61 | 208 | } |
265a3175 | 209 | #ifdef SO_BROADCAST |
69b7ef61 MK |
210 | if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on)) < 0) { |
211 | syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m"); | |
3d42e160 MK |
212 | close(s); |
213 | return (-1); | |
69b7ef61 | 214 | } |
265a3175 MK |
215 | #endif |
216 | #ifdef SO_RCVBUF | |
34894a1d MK |
217 | on = 48*1024; |
218 | if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &on, sizeof (on)) < 0) | |
219 | syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m"); | |
265a3175 | 220 | #endif |
3d42e160 | 221 | if (bind(s, sin, sizeof (*sin), 0) < 0) { |
7fe7fe74 | 222 | perror("bind"); |
69b7ef61 | 223 | syslog(LOG_ERR, "bind: %m"); |
3d42e160 | 224 | close(s); |
7fe7fe74 | 225 | return (-1); |
69b7ef61 | 226 | } |
7fe7fe74 SL |
227 | return (s); |
228 | } |