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