Deleted Added
full compact
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 ---