xref: /original-bsd/sbin/route/route.c (revision b64b0d54)
1 #ifndef lint
2 static char sccsid[] = "@(#)route.c	4.6 83/01/06";
3 #endif
4 
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include <sys/ioctl.h>
8 
9 #include <net/route.h>
10 #include <netinet/in.h>
11 
12 #include <stdio.h>
13 #include <errno.h>
14 #include <ctype.h>
15 #include <netdb.h>
16 
17 struct	rtentry route;
18 int	options;
19 int	s;
20 struct	sockaddr_in sin = { AF_INET };
21 struct	in_addr inet_makeaddr();
22 
23 main(argc, argv)
24 	int argc;
25 	char *argv[];
26 {
27 
28 	if (argc < 2)
29 		printf("usage: route [ cmd ] [ args ]\n"), exit(1);
30 	s = socket(AF_INET, SOCK_RAW, 0, 0);
31 	if (s < 0) {
32 		perror("route: socket");
33 		exit(1);
34 	}
35 	argc--, argv++;
36 	if (strcmp(*argv, "add") == 0)
37 		newroute(argc, argv);
38 	else if (strcmp(*argv, "delete") == 0)
39 		newroute(argc, argv);
40 	else if (strcmp(*argv, "change") == 0)
41 		changeroute(argc-1, argv+1);
42 	else
43 		printf("%s: huh?\n", *argv);
44 }
45 
46 newroute(argc, argv)
47 	int argc;
48 	char *argv[];
49 {
50 	struct sockaddr_in *sin;
51 	char *cmd;
52 
53 	if (argc < 3 || argc > 4) {
54 		printf("usage: %s destination gateway [ metric ]\n", argv[0]);
55 		return;
56 	}
57 	cmd = argv[0];
58 	getaddr(argv[1], &route.rt_dst);
59 	getaddr(argv[2], &route.rt_gateway);
60 	sin = (struct sockaddr_in *)&route.rt_dst;
61 	route.rt_flags = RTF_UP;
62 	if (inet_lnaof(sin->sin_addr) != 0)
63 		route.rt_flags |= RTF_HOST;
64 	if (argc > 3 && atoi(argv[3]) > 0)
65 		route.rt_flags |= RTF_GATEWAY;
66 	printf("%s %x: gateway %x, flags %x\n", cmd, sin->sin_addr,
67 		((struct sockaddr_in *)&route.rt_gateway)->sin_addr,
68 		route.rt_flags);
69 	if (ioctl(s, *cmd == 'a' ? SIOCADDRT : SIOCDELRT, (caddr_t)&route))
70 		error(cmd);
71 }
72 
73 changeroute(argc, argv)
74 	int argc;
75 	char *argv[];
76 {
77 	printf("not supported\n");
78 }
79 
80 error(cmd)
81 	char *cmd;
82 {
83 	extern int errno;
84 
85 	if (errno == ESRCH)
86 		fprintf(stderr, "not in table\n");
87 	else if (errno == EBUSY)
88 		fprintf(stderr, "entry in use\n");
89 	else if (errno == ENOBUFS)
90 		fprintf(stderr, "routing table overflow\n");
91 	else
92 		perror(cmd);
93 }
94 
95 getaddr(s, sin)
96 	char *s;
97 	struct sockaddr_in *sin;
98 {
99 	struct hostent *hp;
100 	struct netent *np;
101 	u_long val;
102 
103 	hp = gethostbyname(s);
104 	if (hp) {
105 		sin->sin_family = hp->h_addrtype;
106 		bcopy(hp->h_addr, &sin->sin_addr, hp->h_length);
107 		return;
108 	}
109 	np = getnetbyname(s);
110 	if (np) {
111 		sin->sin_family = np->n_addrtype;
112 		sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
113 		return;
114 	}
115 	sin->sin_family = AF_INET;
116 	val = inet_addr(s);
117 	if (val != -1) {
118 		sin->sin_addr.s_addr = val;
119 		return;
120 	}
121 	val = inet_network(s);
122 	if (val != -1) {
123 		sin->sin_addr = inet_makeaddr(val, INADDR_ANY);
124 		return;
125 	}
126 	fprintf(stderr, "%s: bad value\n", s);
127 	exit(1);
128 }
129