arp.c (233773) | arp.c (246143) |
---|---|
1/* 2 * Copyright (c) 1984, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Sun Microsystems, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 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 41static char const sccsid[] = "@(#)from: arp.c 8.2 (Berkeley) 1/2/94"; 42#endif /* not lint */ 43#endif 44#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 1984, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Sun Microsystems, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 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 41static char const sccsid[] = "@(#)from: arp.c 8.2 (Berkeley) 1/2/94"; 42#endif /* not lint */ 43#endif 44#include <sys/cdefs.h> |
45__FBSDID("$FreeBSD: head/usr.sbin/arp/arp.c 233773 2012-04-02 10:44:25Z glebius $"); | 45__FBSDID("$FreeBSD: head/usr.sbin/arp/arp.c 246143 2013-01-31 08:55:21Z glebius $"); |
46 47/* 48 * arp - display, set, and delete arp table entries 49 */ 50 51 52#include <sys/param.h> 53#include <sys/file.h> --- 22 unchanged lines hidden (view full) --- 76#include <paths.h> 77#include <stdio.h> 78#include <stdlib.h> 79#include <string.h> 80#include <strings.h> 81#include <unistd.h> 82 83typedef void (action_fn)(struct sockaddr_dl *sdl, | 46 47/* 48 * arp - display, set, and delete arp table entries 49 */ 50 51 52#include <sys/param.h> 53#include <sys/file.h> --- 22 unchanged lines hidden (view full) --- 76#include <paths.h> 77#include <stdio.h> 78#include <stdlib.h> 79#include <string.h> 80#include <strings.h> 81#include <unistd.h> 82 83typedef void (action_fn)(struct sockaddr_dl *sdl, |
84 struct sockaddr_inarp *s_in, struct rt_msghdr *rtm); | 84 struct sockaddr_in *s_in, struct rt_msghdr *rtm); |
85 86static int search(u_long addr, action_fn *action); 87static action_fn print_entry; 88static action_fn nuke_entry; 89 | 85 86static int search(u_long addr, action_fn *action); 87static action_fn print_entry; 88static action_fn nuke_entry; 89 |
90static int delete(char *host, int do_proxy); | 90static int delete(char *host); |
91static void usage(void); 92static int set(int argc, char **argv); 93static int get(char *host); 94static int file(char *name); 95static struct rt_msghdr *rtmsg(int cmd, | 91static void usage(void); 92static int set(int argc, char **argv); 93static int get(char *host); 94static int file(char *name); 95static struct rt_msghdr *rtmsg(int cmd, |
96 struct sockaddr_inarp *dst, struct sockaddr_dl *sdl); | 96 struct sockaddr_in *dst, struct sockaddr_dl *sdl); |
97static int get_ether_addr(in_addr_t ipaddr, struct ether_addr *hwaddr); | 97static int get_ether_addr(in_addr_t ipaddr, struct ether_addr *hwaddr); |
98static struct sockaddr_inarp *getaddr(char *host); | 98static struct sockaddr_in *getaddr(char *host); |
99static int valid_type(int type); 100 101static int nflag; /* no reverse dns lookups */ 102static char *rifname; 103 104static time_t expire_time; | 99static int valid_type(int type); 100 101static int nflag; /* no reverse dns lookups */ 102static char *rifname; 103 104static time_t expire_time; |
105static int flags, doing_proxy, proxy_only; | 105static int flags, doing_proxy; |
106 107/* which function we're supposed to do */ 108#define F_GET 1 109#define F_SET 2 110#define F_FILESET 3 111#define F_REPLACE 4 112#define F_DELETE 5 113 --- 60 unchanged lines hidden (view full) --- 174 rtn = get(argv[0]); 175 } 176 break; 177 case F_SET: 178 case F_REPLACE: 179 if (argc < 2 || argc > 6) 180 usage(); 181 if (func == F_REPLACE) | 106 107/* which function we're supposed to do */ 108#define F_GET 1 109#define F_SET 2 110#define F_FILESET 3 111#define F_REPLACE 4 112#define F_DELETE 5 113 --- 60 unchanged lines hidden (view full) --- 174 rtn = get(argv[0]); 175 } 176 break; 177 case F_SET: 178 case F_REPLACE: 179 if (argc < 2 || argc > 6) 180 usage(); 181 if (func == F_REPLACE) |
182 (void)delete(argv[0], 0); | 182 (void)delete(argv[0]); |
183 rtn = set(argc, argv) ? 1 : 0; 184 break; 185 case F_DELETE: 186 if (aflag) { 187 if (argc != 0) 188 usage(); 189 search(0, nuke_entry); | 183 rtn = set(argc, argv) ? 1 : 0; 184 break; 185 case F_DELETE: 186 if (aflag) { 187 if (argc != 0) 188 usage(); 189 search(0, nuke_entry); |
190 } else { 191 if (argc == 2 && strncmp(argv[1], "pub", 3) == 0) 192 ch = SIN_PROXY; 193 else if (argc == 1) 194 ch = 0; 195 else 196 usage(); 197 rtn = delete(argv[0], ch); 198 } | 190 } else 191 rtn = delete(argv[0]); |
199 break; 200 case F_FILESET: 201 if (argc != 1) 202 usage(); 203 rtn = file(argv[0]); 204 break; 205 } 206 --- 34 unchanged lines hidden (view full) --- 241 if (set(i, args)) 242 retval = 1; 243 } 244 fclose(fp); 245 return (retval); 246} 247 248/* | 192 break; 193 case F_FILESET: 194 if (argc != 1) 195 usage(); 196 rtn = file(argv[0]); 197 break; 198 } 199 --- 34 unchanged lines hidden (view full) --- 234 if (set(i, args)) 235 retval = 1; 236 } 237 fclose(fp); 238 return (retval); 239} 240 241/* |
249 * Given a hostname, fills up a (static) struct sockaddr_inarp with | 242 * Given a hostname, fills up a (static) struct sockaddr_in with |
250 * the address of the host and returns a pointer to the 251 * structure. 252 */ | 243 * the address of the host and returns a pointer to the 244 * structure. 245 */ |
253static struct sockaddr_inarp * | 246static struct sockaddr_in * |
254getaddr(char *host) 255{ 256 struct hostent *hp; | 247getaddr(char *host) 248{ 249 struct hostent *hp; |
257 static struct sockaddr_inarp reply; | 250 static struct sockaddr_in reply; |
258 259 bzero(&reply, sizeof(reply)); 260 reply.sin_len = sizeof(reply); 261 reply.sin_family = AF_INET; 262 reply.sin_addr.s_addr = inet_addr(host); 263 if (reply.sin_addr.s_addr == INADDR_NONE) { 264 if (!(hp = gethostbyname(host))) { 265 warnx("%s: %s", host, hstrerror(h_errno)); --- 27 unchanged lines hidden (view full) --- 293} 294 295/* 296 * Set an individual arp entry 297 */ 298static int 299set(int argc, char **argv) 300{ | 251 252 bzero(&reply, sizeof(reply)); 253 reply.sin_len = sizeof(reply); 254 reply.sin_family = AF_INET; 255 reply.sin_addr.s_addr = inet_addr(host); 256 if (reply.sin_addr.s_addr == INADDR_NONE) { 257 if (!(hp = gethostbyname(host))) { 258 warnx("%s: %s", host, hstrerror(h_errno)); --- 27 unchanged lines hidden (view full) --- 286} 287 288/* 289 * Set an individual arp entry 290 */ 291static int 292set(int argc, char **argv) 293{ |
301 struct sockaddr_inarp *addr; 302 struct sockaddr_inarp *dst; /* what are we looking for */ | 294 struct sockaddr_in *addr; 295 struct sockaddr_in *dst; /* what are we looking for */ |
303 struct sockaddr_dl *sdl; 304 struct rt_msghdr *rtm; 305 struct ether_addr *ea; 306 char *host = argv[0], *eaddr = argv[1]; 307 struct sockaddr_dl sdl_m; 308 309 argc -= 2; 310 argv += 2; 311 312 bzero(&sdl_m, sizeof(sdl_m)); 313 sdl_m.sdl_len = sizeof(sdl_m); 314 sdl_m.sdl_family = AF_LINK; 315 316 dst = getaddr(host); 317 if (dst == NULL) 318 return (1); | 296 struct sockaddr_dl *sdl; 297 struct rt_msghdr *rtm; 298 struct ether_addr *ea; 299 char *host = argv[0], *eaddr = argv[1]; 300 struct sockaddr_dl sdl_m; 301 302 argc -= 2; 303 argv += 2; 304 305 bzero(&sdl_m, sizeof(sdl_m)); 306 sdl_m.sdl_len = sizeof(sdl_m); 307 sdl_m.sdl_family = AF_LINK; 308 309 dst = getaddr(host); 310 if (dst == NULL) 311 return (1); |
319 doing_proxy = flags = proxy_only = expire_time = 0; | 312 doing_proxy = flags = expire_time = 0; |
320 while (argc-- > 0) { 321 if (strncmp(argv[0], "temp", 4) == 0) { 322 struct timespec tp; 323 int max_age; 324 size_t len = sizeof(max_age); 325 326 clock_gettime(CLOCK_MONOTONIC, &tp); 327 if (sysctlbyname("net.link.ether.inet.max_age", 328 &max_age, &len, NULL, 0) != 0) 329 err(1, "sysctlbyname"); 330 expire_time = tp.tv_sec + max_age; 331 } else if (strncmp(argv[0], "pub", 3) == 0) { 332 flags |= RTF_ANNOUNCE; 333 doing_proxy = 1; 334 if (argc && strncmp(argv[1], "only", 3) == 0) { | 313 while (argc-- > 0) { 314 if (strncmp(argv[0], "temp", 4) == 0) { 315 struct timespec tp; 316 int max_age; 317 size_t len = sizeof(max_age); 318 319 clock_gettime(CLOCK_MONOTONIC, &tp); 320 if (sysctlbyname("net.link.ether.inet.max_age", 321 &max_age, &len, NULL, 0) != 0) 322 err(1, "sysctlbyname"); 323 expire_time = tp.tv_sec + max_age; 324 } else if (strncmp(argv[0], "pub", 3) == 0) { 325 flags |= RTF_ANNOUNCE; 326 doing_proxy = 1; 327 if (argc && strncmp(argv[1], "only", 3) == 0) { |
335 proxy_only = 1; | 328 /* 329 * Compatibility: in pre FreeBSD 8 times 330 * the "only" keyword used to mean that 331 * an ARP entry should be announced, but 332 * not installed into routing table. 333 */ |
336 argc--; argv++; 337 } 338 } else if (strncmp(argv[0], "blackhole", 9) == 0) { 339 if (flags & RTF_REJECT) { 340 printf("Choose one of blackhole or reject, not both.\n"); 341 } 342 flags |= RTF_BLACKHOLE; 343 } else if (strncmp(argv[0], "reject", 6) == 0) { --- 36 unchanged lines hidden (view full) --- 380 * the prefix route covering the local end of the 381 * PPP link should be returned, on which ARP applies. 382 */ 383 rtm = rtmsg(RTM_GET, dst, &sdl_m); 384 if (rtm == NULL) { 385 warn("%s", host); 386 return (1); 387 } | 334 argc--; argv++; 335 } 336 } else if (strncmp(argv[0], "blackhole", 9) == 0) { 337 if (flags & RTF_REJECT) { 338 printf("Choose one of blackhole or reject, not both.\n"); 339 } 340 flags |= RTF_BLACKHOLE; 341 } else if (strncmp(argv[0], "reject", 6) == 0) { --- 36 unchanged lines hidden (view full) --- 378 * the prefix route covering the local end of the 379 * PPP link should be returned, on which ARP applies. 380 */ 381 rtm = rtmsg(RTM_GET, dst, &sdl_m); 382 if (rtm == NULL) { 383 warn("%s", host); 384 return (1); 385 } |
388 addr = (struct sockaddr_inarp *)(rtm + 1); | 386 addr = (struct sockaddr_in *)(rtm + 1); |
389 sdl = (struct sockaddr_dl *)(SA_SIZE(addr) + (char *)addr); 390 391 if ((sdl->sdl_family != AF_LINK) || 392 (rtm->rtm_flags & RTF_GATEWAY) || 393 !valid_type(sdl->sdl_type)) { 394 printf("cannot intuit interface index and type for %s\n", host); 395 return (1); 396 } 397 sdl_m.sdl_type = sdl->sdl_type; 398 sdl_m.sdl_index = sdl->sdl_index; 399 return (rtmsg(RTM_ADD, dst, &sdl_m) == NULL); 400} 401 402/* 403 * Display an individual arp entry 404 */ 405static int 406get(char *host) 407{ | 387 sdl = (struct sockaddr_dl *)(SA_SIZE(addr) + (char *)addr); 388 389 if ((sdl->sdl_family != AF_LINK) || 390 (rtm->rtm_flags & RTF_GATEWAY) || 391 !valid_type(sdl->sdl_type)) { 392 printf("cannot intuit interface index and type for %s\n", host); 393 return (1); 394 } 395 sdl_m.sdl_type = sdl->sdl_type; 396 sdl_m.sdl_index = sdl->sdl_index; 397 return (rtmsg(RTM_ADD, dst, &sdl_m) == NULL); 398} 399 400/* 401 * Display an individual arp entry 402 */ 403static int 404get(char *host) 405{ |
408 struct sockaddr_inarp *addr; | 406 struct sockaddr_in *addr; |
409 410 addr = getaddr(host); 411 if (addr == NULL) 412 return (1); 413 if (0 == search(addr->sin_addr.s_addr, print_entry)) { 414 printf("%s (%s) -- no entry", 415 host, inet_ntoa(addr->sin_addr)); 416 if (rifname) 417 printf(" on %s", rifname); 418 printf("\n"); 419 return (1); 420 } 421 return (0); 422} 423 424/* 425 * Delete an arp entry 426 */ 427static int | 407 408 addr = getaddr(host); 409 if (addr == NULL) 410 return (1); 411 if (0 == search(addr->sin_addr.s_addr, print_entry)) { 412 printf("%s (%s) -- no entry", 413 host, inet_ntoa(addr->sin_addr)); 414 if (rifname) 415 printf(" on %s", rifname); 416 printf("\n"); 417 return (1); 418 } 419 return (0); 420} 421 422/* 423 * Delete an arp entry 424 */ 425static int |
428delete(char *host, int do_proxy) | 426delete(char *host) |
429{ | 427{ |
430 struct sockaddr_inarp *addr, *dst; | 428 struct sockaddr_in *addr, *dst; |
431 struct rt_msghdr *rtm; 432 struct sockaddr_dl *sdl; 433 struct sockaddr_dl sdl_m; 434 435 dst = getaddr(host); 436 if (dst == NULL) 437 return (1); 438 --- 12 unchanged lines hidden (view full) --- 451 sdl_m.sdl_family = AF_LINK; 452 453 for (;;) { /* try twice */ 454 rtm = rtmsg(RTM_GET, dst, &sdl_m); 455 if (rtm == NULL) { 456 warn("%s", host); 457 return (1); 458 } | 429 struct rt_msghdr *rtm; 430 struct sockaddr_dl *sdl; 431 struct sockaddr_dl sdl_m; 432 433 dst = getaddr(host); 434 if (dst == NULL) 435 return (1); 436 --- 12 unchanged lines hidden (view full) --- 449 sdl_m.sdl_family = AF_LINK; 450 451 for (;;) { /* try twice */ 452 rtm = rtmsg(RTM_GET, dst, &sdl_m); 453 if (rtm == NULL) { 454 warn("%s", host); 455 return (1); 456 } |
459 addr = (struct sockaddr_inarp *)(rtm + 1); | 457 addr = (struct sockaddr_in *)(rtm + 1); |
460 sdl = (struct sockaddr_dl *)(SA_SIZE(addr) + (char *)addr); 461 462 /* 463 * With the new L2/L3 restructure, the route 464 * returned is a prefix route. The important 465 * piece of information from the previous 466 * RTM_GET is the interface index. In the 467 * case of ECMP, the kernel will traverse --- 31 unchanged lines hidden (view full) --- 499 */ 500static int 501search(u_long addr, action_fn *action) 502{ 503 int mib[6]; 504 size_t needed; 505 char *lim, *buf, *next; 506 struct rt_msghdr *rtm; | 458 sdl = (struct sockaddr_dl *)(SA_SIZE(addr) + (char *)addr); 459 460 /* 461 * With the new L2/L3 restructure, the route 462 * returned is a prefix route. The important 463 * piece of information from the previous 464 * RTM_GET is the interface index. In the 465 * case of ECMP, the kernel will traverse --- 31 unchanged lines hidden (view full) --- 497 */ 498static int 499search(u_long addr, action_fn *action) 500{ 501 int mib[6]; 502 size_t needed; 503 char *lim, *buf, *next; 504 struct rt_msghdr *rtm; |
507 struct sockaddr_inarp *sin2; | 505 struct sockaddr_in *sin2; |
508 struct sockaddr_dl *sdl; 509 char ifname[IF_NAMESIZE]; 510 int st, found_entry = 0; 511 512 mib[0] = CTL_NET; 513 mib[1] = PF_ROUTE; 514 mib[2] = 0; 515 mib[3] = AF_INET; --- 17 unchanged lines hidden (view full) --- 533 break; 534 needed += needed / 8; 535 } 536 if (st == -1) 537 err(1, "actual retrieval of routing table"); 538 lim = buf + needed; 539 for (next = buf; next < lim; next += rtm->rtm_msglen) { 540 rtm = (struct rt_msghdr *)next; | 506 struct sockaddr_dl *sdl; 507 char ifname[IF_NAMESIZE]; 508 int st, found_entry = 0; 509 510 mib[0] = CTL_NET; 511 mib[1] = PF_ROUTE; 512 mib[2] = 0; 513 mib[3] = AF_INET; --- 17 unchanged lines hidden (view full) --- 531 break; 532 needed += needed / 8; 533 } 534 if (st == -1) 535 err(1, "actual retrieval of routing table"); 536 lim = buf + needed; 537 for (next = buf; next < lim; next += rtm->rtm_msglen) { 538 rtm = (struct rt_msghdr *)next; |
541 sin2 = (struct sockaddr_inarp *)(rtm + 1); | 539 sin2 = (struct sockaddr_in *)(rtm + 1); |
542 sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2)); 543 if (rifname && if_indextoname(sdl->sdl_index, ifname) && 544 strcmp(ifname, rifname)) 545 continue; 546 if (addr) { 547 if (addr != sin2->sin_addr.s_addr) 548 continue; 549 found_entry = 1; --- 7 unchanged lines hidden (view full) --- 557/* 558 * Display an arp entry 559 */ 560static char lifname[IF_NAMESIZE]; 561static int64_t lifindex = -1; 562 563static void 564print_entry(struct sockaddr_dl *sdl, | 540 sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2)); 541 if (rifname && if_indextoname(sdl->sdl_index, ifname) && 542 strcmp(ifname, rifname)) 543 continue; 544 if (addr) { 545 if (addr != sin2->sin_addr.s_addr) 546 continue; 547 found_entry = 1; --- 7 unchanged lines hidden (view full) --- 555/* 556 * Display an arp entry 557 */ 558static char lifname[IF_NAMESIZE]; 559static int64_t lifindex = -1; 560 561static void 562print_entry(struct sockaddr_dl *sdl, |
565 struct sockaddr_inarp *addr, struct rt_msghdr *rtm) | 563 struct sockaddr_in *addr, struct rt_msghdr *rtm) |
566{ 567 const char *host; 568 struct hostent *hp; 569 struct iso88025_sockaddr_dl_data *trld; 570 int seg; 571 572 if (nflag == 0) 573 hp = gethostbyaddr((caddr_t)&(addr->sin_addr), --- 33 unchanged lines hidden (view full) --- 607 static struct timespec tp; 608 if (tp.tv_sec == 0) 609 clock_gettime(CLOCK_MONOTONIC, &tp); 610 if ((expire_time = rtm->rtm_rmx.rmx_expire - tp.tv_sec) > 0) 611 printf(" expires in %d seconds", (int)expire_time); 612 else 613 printf(" expired"); 614 } | 564{ 565 const char *host; 566 struct hostent *hp; 567 struct iso88025_sockaddr_dl_data *trld; 568 int seg; 569 570 if (nflag == 0) 571 hp = gethostbyaddr((caddr_t)&(addr->sin_addr), --- 33 unchanged lines hidden (view full) --- 605 static struct timespec tp; 606 if (tp.tv_sec == 0) 607 clock_gettime(CLOCK_MONOTONIC, &tp); 608 if ((expire_time = rtm->rtm_rmx.rmx_expire - tp.tv_sec) > 0) 609 printf(" expires in %d seconds", (int)expire_time); 610 else 611 printf(" expired"); 612 } |
615 if (addr->sin_other & SIN_PROXY) 616 printf(" published (proxy only)"); | |
617 if (rtm->rtm_flags & RTF_ANNOUNCE) 618 printf(" published"); 619 switch(sdl->sdl_type) { 620 case IFT_ETHER: 621 printf(" [ethernet]"); 622 break; 623 case IFT_ISO88025: 624 printf(" [token-ring]"); --- 29 unchanged lines hidden (view full) --- 654 655} 656 657/* 658 * Nuke an arp entry 659 */ 660static void 661nuke_entry(struct sockaddr_dl *sdl __unused, | 613 if (rtm->rtm_flags & RTF_ANNOUNCE) 614 printf(" published"); 615 switch(sdl->sdl_type) { 616 case IFT_ETHER: 617 printf(" [ethernet]"); 618 break; 619 case IFT_ISO88025: 620 printf(" [token-ring]"); --- 29 unchanged lines hidden (view full) --- 650 651} 652 653/* 654 * Nuke an arp entry 655 */ 656static void 657nuke_entry(struct sockaddr_dl *sdl __unused, |
662 struct sockaddr_inarp *addr, struct rt_msghdr *rtm __unused) | 658 struct sockaddr_in *addr, struct rt_msghdr *rtm __unused) |
663{ 664 char ip[20]; 665 666 snprintf(ip, sizeof(ip), "%s", inet_ntoa(addr->sin_addr)); | 659{ 660 char ip[20]; 661 662 snprintf(ip, sizeof(ip), "%s", inet_ntoa(addr->sin_addr)); |
667 (void)delete(ip, 0); | 663 delete(ip); |
668} 669 670static void 671usage(void) 672{ 673 fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n", 674 "usage: arp [-n] [-i interface] hostname", 675 " arp [-n] [-i interface] -a", 676 " arp -d hostname [pub]", 677 " arp -d [-i interface] -a", 678 " arp -s hostname ether_addr [temp] [reject | blackhole] [pub [only]]", 679 " arp -S hostname ether_addr [temp] [reject | blackhole] [pub [only]]", 680 " arp -f filename"); 681 exit(1); 682} 683 684static struct rt_msghdr * | 664} 665 666static void 667usage(void) 668{ 669 fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n", 670 "usage: arp [-n] [-i interface] hostname", 671 " arp [-n] [-i interface] -a", 672 " arp -d hostname [pub]", 673 " arp -d [-i interface] -a", 674 " arp -s hostname ether_addr [temp] [reject | blackhole] [pub [only]]", 675 " arp -S hostname ether_addr [temp] [reject | blackhole] [pub [only]]", 676 " arp -f filename"); 677 exit(1); 678} 679 680static struct rt_msghdr * |
685rtmsg(int cmd, struct sockaddr_inarp *dst, struct sockaddr_dl *sdl) | 681rtmsg(int cmd, struct sockaddr_in *dst, struct sockaddr_dl *sdl) |
686{ 687 static int seq; 688 int rlen; 689 int l; 690 struct sockaddr_in so_mask, *som = &so_mask; 691 static int s = -1; 692 static pid_t pid; 693 --- 29 unchanged lines hidden (view full) --- 723 switch (cmd) { 724 default: 725 errx(1, "internal wrong cmd"); 726 case RTM_ADD: 727 rtm->rtm_addrs |= RTA_GATEWAY; 728 rtm->rtm_rmx.rmx_expire = expire_time; 729 rtm->rtm_inits = RTV_EXPIRE; 730 rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); | 682{ 683 static int seq; 684 int rlen; 685 int l; 686 struct sockaddr_in so_mask, *som = &so_mask; 687 static int s = -1; 688 static pid_t pid; 689 --- 29 unchanged lines hidden (view full) --- 719 switch (cmd) { 720 default: 721 errx(1, "internal wrong cmd"); 722 case RTM_ADD: 723 rtm->rtm_addrs |= RTA_GATEWAY; 724 rtm->rtm_rmx.rmx_expire = expire_time; 725 rtm->rtm_inits = RTV_EXPIRE; 726 rtm->rtm_flags |= (RTF_HOST | RTF_STATIC | RTF_LLDATA); |
731 dst->sin_other = 0; | |
732 if (doing_proxy) { | 727 if (doing_proxy) { |
733 if (proxy_only) 734 dst->sin_other = SIN_PROXY; 735 else { 736 rtm->rtm_addrs |= RTA_NETMASK; 737 rtm->rtm_flags &= ~RTF_HOST; 738 } | 728 rtm->rtm_addrs |= RTA_NETMASK; 729 rtm->rtm_flags &= ~RTF_HOST; |
739 } 740 /* FALLTHROUGH */ 741 case RTM_GET: 742 rtm->rtm_addrs |= RTA_DST; 743 } 744#define NEXTADDR(w, s) \ 745 do { \ 746 if ((s) != NULL && rtm->rtm_addrs & (w)) { \ --- 124 unchanged lines hidden --- | 730 } 731 /* FALLTHROUGH */ 732 case RTM_GET: 733 rtm->rtm_addrs |= RTA_DST; 734 } 735#define NEXTADDR(w, s) \ 736 do { \ 737 if ((s) != NULL && rtm->rtm_addrs & (w)) { \ --- 124 unchanged lines hidden --- |