install approved copyright notice
[unix-history] / usr / src / sbin / routed / main.c
CommitLineData
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
19char 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
b8c620d6 25static char sccsid[] = "@(#)main.c 5.14 (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
41int supplier = -1; /* process should supply updates */
d002aa8c 42int gateway = 0; /* 1 if we are a gateway to parts beyond */
7892134c 43int debug = 0;
fdd0ed12
SL
44
45struct rip *msg = (struct rip *)packet;
71d47350 46int hup(), rtdeleteall(), sigtrace();
fdd0ed12
SL
47
48main(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;
a349306d 57 openlog("routed", LOG_PID | LOG_ODELAY, LOG_DAEMON);
bb3e151c 58 setlogmask(LOG_WARNING);
fdd0ed12 59 sp = getservbyname("router", "udp");
7fe7fe74
SL
60 if (sp == NULL) {
61 fprintf(stderr, "routed: router/udp: unknown service\n");
fdd0ed12
SL
62 exit(1);
63 }
7fe7fe74
SL
64 addr.sin_family = AF_INET;
65 addr.sin_port = sp->s_port;
66 s = getsocket(AF_INET, SOCK_DGRAM, &addr);
67 if (s < 0)
68 exit(1);
fdd0ed12
SL
69 argv++, argc--;
70 while (argc > 0 && **argv == '-') {
d4b6a849 71 if (strcmp(*argv, "-s") == 0) {
fdd0ed12
SL
72 supplier = 1;
73 argv++, argc--;
74 continue;
75 }
d4b6a849 76 if (strcmp(*argv, "-q") == 0) {
fdd0ed12
SL
77 supplier = 0;
78 argv++, argc--;
79 continue;
80 }
d4b6a849 81 if (strcmp(*argv, "-t") == 0) {
71d47350
MK
82 if (tracehistory == 0)
83 tracehistory++;
84 else {
85 tracehistory = 0;
86 tracepackets++;
87 }
bb3e151c 88 setlogmask(LOG_DEBUG);
17fe297f
MK
89 argv++, argc--;
90 continue;
91 }
92 if (strcmp(*argv, "-d") == 0) {
7892134c 93 debug++;
bb3e151c 94 setlogmask(LOG_DEBUG);
d4b6a849
SL
95 argv++, argc--;
96 continue;
97 }
5562f0a3
MK
98 if (strcmp(*argv, "-g") == 0) {
99 gateway = 1;
100 argv++, argc--;
101 continue;
102 }
5562f0a3 103 fprintf(stderr,
d002aa8c 104 "usage: routed [ -s ] [ -q ] [ -t ] [ -g ]\n");
fdd0ed12
SL
105 exit(1);
106 }
7892134c 107 if (tracepackets == 0 && debug == 0) {
d4b6a849
SL
108 int t;
109
110 if (fork())
111 exit(0);
7620381d
SL
112 for (t = 0; t < 20; t++)
113 if (t != s)
2b478949 114 (void) close(t);
d4b6a849
SL
115 (void) open("/", 0);
116 (void) dup2(0, 1);
117 (void) dup2(0, 2);
118 t = open("/dev/tty", 2);
119 if (t >= 0) {
120 ioctl(t, TIOCNOTTY, (char *)0);
121 (void) close(t);
122 }
123 }
7fe7fe74
SL
124 /*
125 * Any extra argument is considered
126 * a tracing log file.
127 */
128 if (argc > 0)
129 traceon(*argv);
fdd0ed12
SL
130 /*
131 * Collect an initial view of the world by
d002aa8c 132 * checking the interface configuration and the gateway kludge
fdd0ed12
SL
133 * file. Then, send a request packet on all
134 * directly connected networks to find out what
135 * everyone else thinks.
136 */
137 rtinit();
fdd0ed12 138 ifinit();
34894a1d 139 gwkludge();
d002aa8c
MK
140 if (gateway > 0)
141 rtdefault();
fdd0ed12
SL
142 if (supplier < 0)
143 supplier = 0;
144 msg->rip_cmd = RIPCMD_REQUEST;
55d340a4 145 msg->rip_vers = RIPVERSION;
fdd0ed12
SL
146 msg->rip_nets[0].rip_dst.sa_family = AF_UNSPEC;
147 msg->rip_nets[0].rip_metric = HOPCNT_INFINITY;
55d340a4
SL
148 msg->rip_nets[0].rip_dst.sa_family = htons(AF_UNSPEC);
149 msg->rip_nets[0].rip_metric = htonl(HOPCNT_INFINITY);
fdd0ed12 150 toall(sendmsg);
ce5e9df4 151 signal(SIGALRM, timer);
b7e4f8be 152 signal(SIGHUP, hup);
69b7ef61 153 signal(SIGTERM, hup);
7892134c 154 signal(SIGINT, rtdeleteall);
71d47350
MK
155 signal(SIGUSR1, sigtrace);
156 signal(SIGUSR2, sigtrace);
fdd0ed12
SL
157 timer();
158
fdd0ed12
SL
159 for (;;) {
160 int ibits;
161 register int n;
162
7fe7fe74 163 ibits = 1 << s;
7fe7fe74 164 n = select(20, &ibits, 0, 0, 0);
fdd0ed12
SL
165 if (n < 0)
166 continue;
167 if (ibits & (1 << s))
168 process(s);
7fe7fe74 169 /* handle ICMP redirects */
fdd0ed12
SL
170 }
171}
172
173process(fd)
174 int fd;
175{
fdd0ed12 176 struct sockaddr from;
ce5e9df4 177 int fromlen = sizeof (from), cc, omask;
71d47350 178 time_t now;
fdd0ed12 179
7fe7fe74 180 cc = recvfrom(fd, packet, sizeof (packet), 0, &from, &fromlen);
fdd0ed12
SL
181 if (cc <= 0) {
182 if (cc < 0 && errno != EINTR)
7fe7fe74 183 perror("recvfrom");
fdd0ed12
SL
184 return;
185 }
7fe7fe74
SL
186 if (fromlen != sizeof (struct sockaddr_in))
187 return;
71d47350
MK
188 if (traceactions && !tracepackets) {
189 (void) time(&now);
190 curtime = ctime(&now);
191 }
2b478949 192 omask = sigblock(sigmask(SIGALRM));
fdd0ed12 193 rip_input(&from, cc);
ce5e9df4 194 sigsetmask(omask);
fdd0ed12 195}
7fe7fe74
SL
196
197getsocket(domain, type, sin)
198 int domain, type;
199 struct sockaddr_in *sin;
200{
3d42e160 201 int s, on = 1;
7fe7fe74 202
9fe072d4 203 if ((s = socket(domain, type, 0)) < 0) {
7fe7fe74 204 perror("socket");
69b7ef61 205 syslog(LOG_ERR, "socket: %m");
7fe7fe74 206 return (-1);
69b7ef61
MK
207 }
208 if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof (on)) < 0) {
209 syslog(LOG_ERR, "setsockopt SO_BROADCAST: %m");
3d42e160
MK
210 close(s);
211 return (-1);
69b7ef61 212 }
34894a1d
MK
213 on = 48*1024;
214 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &on, sizeof (on)) < 0)
215 syslog(LOG_ERR, "setsockopt SO_RCVBUF: %m");
3d42e160 216 if (bind(s, sin, sizeof (*sin), 0) < 0) {
7fe7fe74 217 perror("bind");
69b7ef61 218 syslog(LOG_ERR, "bind: %m");
3d42e160 219 close(s);
7fe7fe74 220 return (-1);
69b7ef61 221 }
7fe7fe74
SL
222 return (s);
223}