route.c (51640) | route.c (54263) |
---|---|
1/* 2 * Copyright (c) 1983, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 28 unchanged lines hidden (view full) --- 37 The Regents of the University of California. All rights reserved.\n"; 38#endif /* not lint */ 39 40#ifndef lint 41#if 0 42static char sccsid[] = "@(#)route.c 8.3 (Berkeley) 3/19/94"; 43#endif 44static const char rcsid[] = | 1/* 2 * Copyright (c) 1983, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 28 unchanged lines hidden (view full) --- 37 The Regents of the University of California. All rights reserved.\n"; 38#endif /* not lint */ 39 40#ifndef lint 41#if 0 42static char sccsid[] = "@(#)route.c 8.3 (Berkeley) 3/19/94"; 43#endif 44static const char rcsid[] = |
45 "$FreeBSD: head/sbin/route/route.c 51640 1999-09-25 03:22:52Z billf $"; | 45 "$FreeBSD: head/sbin/route/route.c 54263 1999-12-07 17:39:16Z shin $"; |
46#endif /* not lint */ 47 48#include <sys/param.h> 49#include <sys/file.h> 50#include <sys/socket.h> 51#include <sys/ioctl.h> 52#include <sys/sysctl.h> 53#include <sys/types.h> --- 25 unchanged lines hidden (view full) --- 79#include "keywords.h" 80 {0, 0} 81}; 82 83struct ortentry route; 84union sockunion { 85 struct sockaddr sa; 86 struct sockaddr_in sin; | 46#endif /* not lint */ 47 48#include <sys/param.h> 49#include <sys/file.h> 50#include <sys/socket.h> 51#include <sys/ioctl.h> 52#include <sys/sysctl.h> 53#include <sys/types.h> --- 25 unchanged lines hidden (view full) --- 79#include "keywords.h" 80 {0, 0} 81}; 82 83struct ortentry route; 84union sockunion { 85 struct sockaddr sa; 86 struct sockaddr_in sin; |
87#ifdef INET6 88 struct sockaddr_in6 sin6; 89#endif |
|
87 struct sockaddr_at sat; 88#ifdef NS 89 struct sockaddr_ns sns; 90#endif 91 struct sockaddr_dl sdl; 92} so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp; 93 94typedef union sockunion *sup; --- 5 unchanged lines hidden (view full) --- 100struct rt_metrics rt_metrics; 101u_long rtm_inits; 102int atalk_aton __P((const char *, struct at_addr *)); 103char *atalk_ntoa __P((struct at_addr)); 104char *routename(), *netname(); 105void flushroutes(), newroute(), monitor(), sockaddr(), sodump(), bprintf(); 106void print_getmsg(), print_rtmsg(), pmsg_common(), pmsg_addrs(), mask_addr(); 107int getaddr(), rtmsg(), x25_makemask(); | 90 struct sockaddr_at sat; 91#ifdef NS 92 struct sockaddr_ns sns; 93#endif 94 struct sockaddr_dl sdl; 95} so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp; 96 97typedef union sockunion *sup; --- 5 unchanged lines hidden (view full) --- 103struct rt_metrics rt_metrics; 104u_long rtm_inits; 105int atalk_aton __P((const char *, struct at_addr *)); 106char *atalk_ntoa __P((struct at_addr)); 107char *routename(), *netname(); 108void flushroutes(), newroute(), monitor(), sockaddr(), sodump(), bprintf(); 109void print_getmsg(), print_rtmsg(), pmsg_common(), pmsg_addrs(), mask_addr(); 110int getaddr(), rtmsg(), x25_makemask(); |
111int prefixlen(); |
|
108extern char *iso_ntoa(); 109 110void usage __P((const char *)) __dead2; 111 | 112extern char *iso_ntoa(); 113 114void usage __P((const char *)) __dead2; 115 |
116#ifdef INET6 117char ntop_buf[INET6_ADDRSTRLEN]; /*for inet_ntop()*/ 118#endif 119 |
|
112void 113usage(cp) 114 const char *cp; 115{ 116 if (cp) 117 warnx("bad keyword: %s", cp); 118 (void) fprintf(stderr, 119 "usage: route [-dnqtv] command [[modifiers] args]\n"); --- 94 unchanged lines hidden (view full) --- 214 shutdown(s, 0); /* Don't want to read back our messages */ 215 if (argc > 1) { 216 argv++; 217 if (argc == 2 && **argv == '-') 218 switch (keyword(*argv + 1)) { 219 case K_INET: 220 af = AF_INET; 221 break; | 120void 121usage(cp) 122 const char *cp; 123{ 124 if (cp) 125 warnx("bad keyword: %s", cp); 126 (void) fprintf(stderr, 127 "usage: route [-dnqtv] command [[modifiers] args]\n"); --- 94 unchanged lines hidden (view full) --- 222 shutdown(s, 0); /* Don't want to read back our messages */ 223 if (argc > 1) { 224 argv++; 225 if (argc == 2 && **argv == '-') 226 switch (keyword(*argv + 1)) { 227 case K_INET: 228 af = AF_INET; 229 break; |
230#ifdef INET6 231 case K_INET6: 232 af = AF_INET6; 233 break; 234#endif |
|
222 case K_ATALK: 223 af = AF_APPLETALK; 224 break; 225#ifdef NS 226 case K_XNS: 227 af = AF_NS; 228 break; 229#endif --- 111 unchanged lines hidden (view full) --- 341#define C(x) (unsigned)((x) & 0xff) 342 in.s_addr = ntohl(in.s_addr); 343 (void) sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24), 344 C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr)); 345 } 346 break; 347 } 348 | 235 case K_ATALK: 236 af = AF_APPLETALK; 237 break; 238#ifdef NS 239 case K_XNS: 240 af = AF_NS; 241 break; 242#endif --- 111 unchanged lines hidden (view full) --- 354#define C(x) (unsigned)((x) & 0xff) 355 in.s_addr = ntohl(in.s_addr); 356 (void) sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24), 357 C(in.s_addr >> 16), C(in.s_addr >> 8), C(in.s_addr)); 358 } 359 break; 360 } 361 |
362#ifdef INET6 363 case AF_INET6: 364 { struct sockaddr_in6 *sin6; 365 int gap; 366 367 sin6 = (struct sockaddr_in6 *)sa; 368 gap = sizeof(struct sockaddr_in6) - sin6->sin6_len; 369 if (gap > 0) 370 bzero((char *)(sin6) + sin6->sin6_len, gap); 371 (void) snprintf(line, sizeof(line), "%s", 372 inet_ntop(AF_INET6, &sin6->sin6_addr, 373 ntop_buf, sizeof(ntop_buf))); 374 } 375#endif 376 |
|
349 case AF_APPLETALK: 350 (void) snprintf(line, sizeof(line), "atalk %s", 351 atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr)); 352 break; 353 354#ifdef NS 355 case AF_NS: 356 return (ns_print((struct sockaddr_ns *)sa)); --- 81 unchanged lines hidden (view full) --- 438 C(in.s_addr >> 16), C(in.s_addr >> 8)); 439 else 440 (void) sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24), 441 C(in.s_addr >> 16), C(in.s_addr >> 8), 442 C(in.s_addr)); 443 break; 444 } 445 | 377 case AF_APPLETALK: 378 (void) snprintf(line, sizeof(line), "atalk %s", 379 atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr)); 380 break; 381 382#ifdef NS 383 case AF_NS: 384 return (ns_print((struct sockaddr_ns *)sa)); --- 81 unchanged lines hidden (view full) --- 466 C(in.s_addr >> 16), C(in.s_addr >> 8)); 467 else 468 (void) sprintf(line, "%u.%u.%u.%u", C(in.s_addr >> 24), 469 C(in.s_addr >> 16), C(in.s_addr >> 8), 470 C(in.s_addr)); 471 break; 472 } 473 |
474#ifdef INET6 475 case AF_INET6: 476 { struct in6_addr in6; 477 int gap; 478 479 in6 = ((struct sockaddr_in6 *)sa)->sin6_addr; 480 gap = sizeof(struct sockaddr_in6) - sa->sa_len; 481 if (gap > 0) 482 bzero((char *)(&in6 + 1) - gap, gap); 483 (void)snprintf(line, sizeof(line), "%s", 484 inet_ntop(AF_INET6, &in6, ntop_buf, 485 sizeof(ntop_buf))); 486 } 487#endif 488 |
|
446 case AF_APPLETALK: 447 (void) snprintf(line, sizeof(line), "atalk %s", 448 atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr)); 449 break; 450 451#ifdef NS 452 case AF_NS: 453 return (ns_print((struct sockaddr_ns *)sa)); --- 67 unchanged lines hidden (view full) --- 521 case K_LINK: 522 af = AF_LINK; 523 aflen = sizeof(struct sockaddr_dl); 524 break; 525 case K_INET: 526 af = AF_INET; 527 aflen = sizeof(struct sockaddr_in); 528 break; | 489 case AF_APPLETALK: 490 (void) snprintf(line, sizeof(line), "atalk %s", 491 atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr)); 492 break; 493 494#ifdef NS 495 case AF_NS: 496 return (ns_print((struct sockaddr_ns *)sa)); --- 67 unchanged lines hidden (view full) --- 564 case K_LINK: 565 af = AF_LINK; 566 aflen = sizeof(struct sockaddr_dl); 567 break; 568 case K_INET: 569 af = AF_INET; 570 aflen = sizeof(struct sockaddr_in); 571 break; |
572#ifdef INET6 573 case K_INET6: 574 af = AF_INET6; 575 aflen = sizeof(struct sockaddr_in6); 576 if (prefixlen("64") != 64) { 577 fprintf(stderr, "internal error: " 578 "setting prefixlen=64\n"); 579 exit(1); 580 } 581 forcenet = 0; 582 ishost = 1; 583 break; 584#endif |
|
529 case K_ATALK: 530 af = AF_APPLETALK; 531 aflen = sizeof(struct sockaddr_at); 532 break; 533 case K_SA: 534 af = PF_ROUTE; 535 aflen = sizeof(union sockunion); 536 break; --- 72 unchanged lines hidden (view full) --- 609 case K_NETMASK: 610 if (!--argc) 611 usage((char *)NULL); 612 (void) getaddr(RTA_NETMASK, *++argv, 0); 613 /* FALLTHROUGH */ 614 case K_NET: 615 forcenet++; 616 break; | 585 case K_ATALK: 586 af = AF_APPLETALK; 587 aflen = sizeof(struct sockaddr_at); 588 break; 589 case K_SA: 590 af = PF_ROUTE; 591 aflen = sizeof(union sockunion); 592 break; --- 72 unchanged lines hidden (view full) --- 665 case K_NETMASK: 666 if (!--argc) 667 usage((char *)NULL); 668 (void) getaddr(RTA_NETMASK, *++argv, 0); 669 /* FALLTHROUGH */ 670 case K_NET: 671 forcenet++; 672 break; |
673 case K_PREFIXLEN: 674 if (!--argc) 675 usage((char *)NULL); 676 if (prefixlen(*++argv) == -1) { 677 forcenet = 0; 678 ishost = 1; 679 } else { 680 forcenet = 1; 681 ishost = 0; 682 } 683 break; |
|
617 case K_MTU: 618 case K_HOPCOUNT: 619 case K_EXPIRE: 620 case K_RECVPIPE: 621 case K_SENDPIPE: 622 case K_SSTHRESH: 623 case K_RTT: 624 case K_RTTVAR: --- 11 unchanged lines hidden (view full) --- 636 } else if ((rtm_addrs & RTA_GATEWAY) == 0) { 637 gateway = *argv; 638 (void) getaddr(RTA_GATEWAY, *argv, &hp); 639 } else { 640 (void) getaddr(RTA_NETMASK, *argv, 0); 641 } 642 } 643 } | 684 case K_MTU: 685 case K_HOPCOUNT: 686 case K_EXPIRE: 687 case K_RECVPIPE: 688 case K_SENDPIPE: 689 case K_SSTHRESH: 690 case K_RTT: 691 case K_RTTVAR: --- 11 unchanged lines hidden (view full) --- 703 } else if ((rtm_addrs & RTA_GATEWAY) == 0) { 704 gateway = *argv; 705 (void) getaddr(RTA_GATEWAY, *argv, &hp); 706 } else { 707 (void) getaddr(RTA_NETMASK, *argv, 0); 708 } 709 } 710 } |
644 if (forcehost) | 711 if (forcehost) { |
645 ishost = 1; | 712 ishost = 1; |
713#ifdef INET6 714 if (af == AF_INET6) { 715 rtm_addrs &= ~RTA_NETMASK; 716 memset((void *)&so_mask, 0, sizeof(so_mask)); 717 } 718#endif 719 } |
|
646 if (forcenet) 647 ishost = 0; 648 flags |= RTF_UP; 649 if (ishost) 650 flags |= RTF_HOST; 651 if (iflag == 0) 652 flags |= RTF_GATEWAY; 653 for (attempts = 1; ; attempts++) { --- 95 unchanged lines hidden (view full) --- 749 char *s; 750 struct hostent **hpp; 751{ 752 register sup su; 753 struct hostent *hp; 754 struct netent *np; 755 u_long val; 756 char *q,qs; | 720 if (forcenet) 721 ishost = 0; 722 flags |= RTF_UP; 723 if (ishost) 724 flags |= RTF_HOST; 725 if (iflag == 0) 726 flags |= RTF_GATEWAY; 727 for (attempts = 1; ; attempts++) { --- 95 unchanged lines hidden (view full) --- 823 char *s; 824 struct hostent **hpp; 825{ 826 register sup su; 827 struct hostent *hp; 828 struct netent *np; 829 u_long val; 830 char *q,qs; |
831 int afamily; /* local copy of af so we can change it */ |
|
757 758 if (af == 0) { 759 af = AF_INET; 760 aflen = sizeof(struct sockaddr_in); 761 } | 832 833 if (af == 0) { 834 af = AF_INET; 835 aflen = sizeof(struct sockaddr_in); 836 } |
837 afamily = af; |
|
762 rtm_addrs |= which; 763 switch (which) { 764 case RTA_DST: 765 su = &so_dst; 766 break; 767 case RTA_GATEWAY: 768 su = &so_gate; 769 if (iflag) { --- 43 unchanged lines hidden (view full) --- 813 case RTA_NETMASK: 814 su = &so_mask; 815 break; 816 case RTA_GENMASK: 817 su = &so_genmask; 818 break; 819 case RTA_IFP: 820 su = &so_ifp; | 838 rtm_addrs |= which; 839 switch (which) { 840 case RTA_DST: 841 su = &so_dst; 842 break; 843 case RTA_GATEWAY: 844 su = &so_gate; 845 if (iflag) { --- 43 unchanged lines hidden (view full) --- 889 case RTA_NETMASK: 890 su = &so_mask; 891 break; 892 case RTA_GENMASK: 893 su = &so_genmask; 894 break; 895 case RTA_IFP: 896 su = &so_ifp; |
897 afamily = AF_LINK; |
|
821 break; 822 case RTA_IFA: 823 su = &so_ifa; 824 break; 825 default: 826 usage("internal error"); 827 /*NOTREACHED*/ 828 } 829 su->sa.sa_len = aflen; | 898 break; 899 case RTA_IFA: 900 su = &so_ifa; 901 break; 902 default: 903 usage("internal error"); 904 /*NOTREACHED*/ 905 } 906 su->sa.sa_len = aflen; |
830 su->sa.sa_family = af; /* cases that don't want it have left already */ | 907 su->sa.sa_family = afamily; /* cases that don't want it have left already */ |
831 if (strcmp(s, "default") == 0) { 832 /* 833 * Default is net 0.0.0.0/0 834 */ 835 switch (which) { 836 case RTA_DST: 837 forcenet++; 838 /* bzero(su, sizeof(*su)); *//* for readability */ 839 (void) getaddr(RTA_NETMASK, s, 0); 840 break; 841 case RTA_NETMASK: 842 case RTA_GENMASK: 843 /* bzero(su, sizeof(*su)); *//* for readability */ 844 } 845 return (0); 846 } | 908 if (strcmp(s, "default") == 0) { 909 /* 910 * Default is net 0.0.0.0/0 911 */ 912 switch (which) { 913 case RTA_DST: 914 forcenet++; 915 /* bzero(su, sizeof(*su)); *//* for readability */ 916 (void) getaddr(RTA_NETMASK, s, 0); 917 break; 918 case RTA_NETMASK: 919 case RTA_GENMASK: 920 /* bzero(su, sizeof(*su)); *//* for readability */ 921 } 922 return (0); 923 } |
847 switch (af) { | 924 switch (afamily) { 925#ifdef INET6 926 case AF_INET6: 927 if (inet_pton(AF_INET6, s, (void *)&su->sin6.sin6_addr) == -1) { 928 (void) fprintf(stderr, "%s: bad value\n", s); 929 exit(1); 930 } 931 return 0; 932#endif 933 |
848#ifdef NS 849 case AF_NS: 850 if (which == RTA_DST) { 851 extern short ns_bh[3]; 852 struct sockaddr_ns *sms = &(so_mask.sns); 853 bzero((char *)sms, sizeof(*sms)); 854 sms->sns_family = 0; 855 sms->sns_len = 6; --- 65 unchanged lines hidden (view full) --- 921 su->sin.sin_family = hp->h_addrtype; 922 bcopy(hp->h_addr, (char *)&su->sin.sin_addr, 923 MIN(hp->h_length, sizeof(su->sin.sin_addr))); 924 return (1); 925 } 926 errx(EX_NOHOST, "bad address: %s", s); 927} 928 | 934#ifdef NS 935 case AF_NS: 936 if (which == RTA_DST) { 937 extern short ns_bh[3]; 938 struct sockaddr_ns *sms = &(so_mask.sns); 939 bzero((char *)sms, sizeof(*sms)); 940 sms->sns_family = 0; 941 sms->sns_len = 6; --- 65 unchanged lines hidden (view full) --- 1007 su->sin.sin_family = hp->h_addrtype; 1008 bcopy(hp->h_addr, (char *)&su->sin.sin_addr, 1009 MIN(hp->h_length, sizeof(su->sin.sin_addr))); 1010 return (1); 1011 } 1012 errx(EX_NOHOST, "bad address: %s", s); 1013} 1014 |
1015int 1016prefixlen(s) 1017 char *s; 1018{ 1019 int len = atoi(s), q, r; 1020 int max; 1021 char *p; |
|
929 | 1022 |
1023 rtm_addrs |= RTA_NETMASK; 1024 switch (af) { 1025#ifdef INET6 1026 case AF_INET6: 1027 max = 128; 1028 p = (char *)&so_mask.sin6.sin6_addr; 1029 break; 1030#endif 1031 case AF_INET: 1032 max = 32; 1033 p = (char *)&so_mask.sin.sin_addr; 1034 break; 1035 default: 1036 (void) fprintf(stderr, "prefixlen not supported in this af\n"); 1037 exit(1); 1038 /*NOTREACHED*/ 1039 } 1040 1041 if (len < 0 || max < len) { 1042 (void) fprintf(stderr, "%s: bad value\n", s); 1043 exit(1); 1044 } 1045 1046 q = len >> 3; 1047 r = len & 7; 1048 so_mask.sa.sa_family = af; 1049 so_mask.sa.sa_len = aflen; 1050 memset((void *)p, 0, max / 8); 1051 if (q > 0) 1052 memset((void *)p, 0xff, q); 1053 if (r > 0) 1054 *((u_char *)p + q) = (0xff00 >> r) & 0xff; 1055 if (len == max) 1056 return -1; 1057 else 1058 return len; 1059} 1060 |
|
930#ifdef NS 931short ns_nullh[] = {0,0,0}; 932short ns_bh[] = {-1,-1,-1}; 933 934char * 935ns_print(sns) 936 struct sockaddr_ns *sns; 937{ --- 28 unchanged lines hidden (view full) --- 966 /* void */; 967 host = p; 968 } 969 if (port) 970 (void) sprintf(cport, ".%XH", htons(port)); 971 else 972 *cport = 0; 973 | 1061#ifdef NS 1062short ns_nullh[] = {0,0,0}; 1063short ns_bh[] = {-1,-1,-1}; 1064 1065char * 1066ns_print(sns) 1067 struct sockaddr_ns *sns; 1068{ --- 28 unchanged lines hidden (view full) --- 1097 /* void */; 1098 host = p; 1099 } 1100 if (port) 1101 (void) sprintf(cport, ".%XH", htons(port)); 1102 else 1103 *cport = 0; 1104 |
974 (void) snprintf(mybuf, sizeof(mybuf), "%lxH.%s%s", 975 (unsigned long)ntohl(net.long_e), 976 host, cport); | 1105 (void) snprintf(mybuf, sizeof(mybuf), "%lxH.%s%s", 1106 (unsigned long)ntohl(net.long_e), 1107 host, cport); |
977 return (mybuf); 978} 979#endif 980 981void 982interfaces() 983{ 984 size_t needed; --- 27 unchanged lines hidden (view full) --- 1012 char msg[2048]; 1013 1014 verbose = 1; 1015 if (debugonly) { 1016 interfaces(); 1017 exit(0); 1018 } 1019 for(;;) { | 1108 return (mybuf); 1109} 1110#endif 1111 1112void 1113interfaces() 1114{ 1115 size_t needed; --- 27 unchanged lines hidden (view full) --- 1143 char msg[2048]; 1144 1145 verbose = 1; 1146 if (debugonly) { 1147 interfaces(); 1148 exit(0); 1149 } 1150 for(;;) { |
1151 time_t now; |
|
1020 n = read(s, msg, 2048); | 1152 n = read(s, msg, 2048); |
1021 (void) printf("got message of size %d\n", n); | 1153 now = time(NULL); 1154 (void) printf("got message of size %d on %s", n, ctime(&now)); |
1022 print_rtmsg((struct rt_msghdr *)msg, n); 1023 } 1024} 1025 1026struct { 1027 struct rt_msghdr m_rtm; 1028 char m_space[512]; 1029} m_rtmsg; --- 80 unchanged lines hidden (view full) --- 1110 } 1111 if ((rtm_addrs & RTA_DST) == 0) 1112 return; 1113 switch (so_dst.sa.sa_family) { 1114#ifdef NS 1115 case AF_NS: 1116#endif 1117 case AF_INET: | 1155 print_rtmsg((struct rt_msghdr *)msg, n); 1156 } 1157} 1158 1159struct { 1160 struct rt_msghdr m_rtm; 1161 char m_space[512]; 1162} m_rtmsg; --- 80 unchanged lines hidden (view full) --- 1243 } 1244 if ((rtm_addrs & RTA_DST) == 0) 1245 return; 1246 switch (so_dst.sa.sa_family) { 1247#ifdef NS 1248 case AF_NS: 1249#endif 1250 case AF_INET: |
1251#ifdef INET6 1252 case AF_INET6: 1253#endif |
|
1118 case AF_APPLETALK: 1119 case 0: 1120 return; 1121 } 1122 cp1 = so_mask.sa.sa_len + 1 + (char *)&so_dst; 1123 cp2 = so_dst.sa.sa_len + 1 + (char *)&so_dst; 1124 while (cp2 > cp1) 1125 *--cp2 = 0; --- 361 unchanged lines hidden --- | 1254 case AF_APPLETALK: 1255 case 0: 1256 return; 1257 } 1258 cp1 = so_mask.sa.sa_len + 1 + (char *)&so_dst; 1259 cp2 = so_dst.sa.sa_len + 1 + (char *)&so_dst; 1260 while (cp2 > cp1) 1261 *--cp2 = 0; --- 361 unchanged lines hidden --- |