xref: /original-bsd/sbin/route/route.c (revision fbed46ce)
1 #ifndef lint
2 static char sccsid[] = "@(#)route.c	4.1 82/04/02";
3 #endif
4 
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <sys/socket.h>
8 #include <sys/ioctl.h>
9 #include <net/route.h>
10 #include <net/in.h>
11 #include <errno.h>
12 #include <ctype.h>
13 
14 struct	rtentry route;
15 int	options;
16 int	s;
17 struct	sockaddr_in sin = { AF_INET };
18 
19 main(argc, argv)
20 	int argc;
21 	char *argv[];
22 {
23 
24 	if (argc < 2)
25 		printf("usage: route [ cmd ] [ args ]\n"), exit(1);
26 	s = socket(SOCK_RAW, 0, 0, options);
27 	if (s < 0) {
28 		perror("socket");
29 		exit(1);
30 	}
31 	argc--, argv++;
32 	if (strcmp(*argv, "add") == 0)
33 		newroute(argc, argv);
34 	else if (strcmp(*argv, "delete") == 0)
35 		newroute(argc, argv);
36 	else if (strcmp(*argv, "change") == 0)
37 		changeroute(argc-1, argv+1);
38 	else
39 		printf("%s: huh?\n", *argv);
40 }
41 
42 newroute(argc, argv)
43 	int argc;
44 	char *argv[];
45 {
46 	struct sockaddr_in *sin;
47 	char *cmd;
48 
49 	if (argc < 3) {
50 		printf("usage: %s destination gateway\n", argv[0]);
51 		return;
52 	}
53 	cmd = *argv++;
54 	getaddr(*argv++, &route.rt_dst);
55 	getaddr(*argv, &route.rt_gateway);
56 	sin = (struct sockaddr_in *)&route.rt_dst;
57 	route.rt_flags = RTF_UP;
58 	if (sin->sin_addr.s_host || sin->sin_addr.s_imp)
59 		route.rt_flags |= RTF_HOST;
60 	printf("%s %x: gateway %x\n", cmd, sin->sin_addr,
61 		((struct sockaddr_in *)&route.rt_gateway)->sin_addr);
62 	if (ioctl(s, *cmd == 'a' ? SIOCADDRT : SIOCDELRT, (caddr_t)&route))
63 		error(cmd);
64 }
65 
66 changeroute(argc, argv)
67 	int argc;
68 	char *argv[];
69 {
70 	printf("not supported\n");
71 }
72 
73 error(cmd)
74 	char *cmd;
75 {
76 	extern int errno;
77 
78 	if (errno == ESRCH)
79 		fprintf(stderr, "not in table\n");
80 	else if (errno == EBUSY)
81 		fprintf(stderr, "entry in use\n");
82 	else if (errno == ENOBUFS)
83 		fprintf(stderr, "routing table overflow\n");
84 	else
85 		perror(cmd);
86 }
87 
88 getaddr(s, sin)
89 	char *s;
90 	struct sockaddr_in *sin;
91 {
92 	sin->sin_family = AF_INET;
93 	if ((sin->sin_addr.s_addr = rhost(&s)) != -1)
94 		return;
95 	if (!isdigit(*s)) {
96 		fprintf(stderr, "%s: unknown host\n", s);
97 		exit(1);
98 	}
99 	sin->sin_addr.s_addr = atoi(s);
100 	if (sin->sin_addr.s_addr == -1) {
101 		fprintf(stderr, "%s: bad value\n", s);
102 		exit(1);
103 	}
104 }
105