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