install correct aliases file
[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
265a3175 25static 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
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;
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
174process(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
198getsocket(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}