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