diff options
author | ru <ru@FreeBSD.org> | 2001-06-07 12:35:53 +0000 |
---|---|---|
committer | ru <ru@FreeBSD.org> | 2001-06-07 12:35:53 +0000 |
commit | 056e449b05cd8204b5c17c524f98d1d085355385 (patch) | |
tree | aa4b8ede8e27965feef7270733276079a4bddecd | |
parent | 08c505f1583b0af1214197fea359a1863bd7a953 (diff) | |
download | FreeBSD-src-056e449b05cd8204b5c17c524f98d1d085355385.zip FreeBSD-src-056e449b05cd8204b5c17c524f98d1d085355385.tar.gz |
- Renamed the ``proxy'' modifier of the -d flag to ``pub'',
to be consistent with the -s flag. Updated documentation
on what this modifier does.
- Added the ``only'' keyword to the -s and -S flags, that
could be used to created "proxy-only" published entries.
Previously, arp(8) created an entry of this type only
in the absence of the route to a destination.
PR: bin/12357
MFC after: 1 week
-rw-r--r-- | usr.sbin/arp/arp.8 | 35 | ||||
-rw-r--r-- | usr.sbin/arp/arp.c | 45 |
2 files changed, 53 insertions, 27 deletions
diff --git a/usr.sbin/arp/arp.8 b/usr.sbin/arp/arp.8 index 80fcae5..985f2ef 100644 --- a/usr.sbin/arp/arp.8 +++ b/usr.sbin/arp/arp.8 @@ -47,18 +47,18 @@ .Fl a .Nm .Fl d Ar hostname -.Op Cm proxy +.Op Cm pub .Nm .Fl d .Fl a .Nm .Fl s Ar hostname ether_addr .Op Cm temp -.Op Cm pub +.Op Cm pub Op Cm only .Nm .Fl S Ar hostname ether_addr .Op Cm temp -.Op Cm pub +.Op Cm pub Op Cm only .Nm .Fl f Ar filename .Sh DESCRIPTION @@ -86,10 +86,17 @@ A super-user may delete an entry for the host called with the .Fl d flag. -The -.Cm proxy -keyword is sometimes required when deleting published ARP entries. -This flag may be combined with the +It the +.Cm pub +keyword is specified, only +.Dq published +.Tn ARP +entry +for this host will be deleted. +.Pp +Alternatively, the +.Fl d +flag may be combined with the .Fl a flag to delete all entries. .It Fl n @@ -109,7 +116,9 @@ The entry will be permanent unless the word is given in the command. If the word .Cm pub -is given, the entry will be "published"; i.e., this system will +is given, the entry will be +.Dq published ; +i.e., this system will act as an .Tn ARP server, @@ -123,6 +132,16 @@ can be given as in which case the interfaces on this host will be examined, and if one of them is found to occupy the same subnet, its Ethernet address will be used. +If the +.Cm only +keyword is also specified, this will create a +.Dq "published (proxy only)" +entry. +This type of entry is created automatically if +.Nm +detects that the routing table entry for +.Ar hostname +already exists. .It Fl S Ar hostname ether_addr Is just like .Fl s diff --git a/usr.sbin/arp/arp.c b/usr.sbin/arp/arp.c index 3f9c5fc..94ca7ba 100644 --- a/usr.sbin/arp/arp.c +++ b/usr.sbin/arp/arp.c @@ -115,9 +115,7 @@ static int s = -1; #define SETFUNC(f) { if (func) usage(); func = (f); } int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { int ch, func = 0; int rtn = 0; @@ -166,7 +164,7 @@ main(argc, argv) break; case F_SET: case F_REPLACE: - if (argc < 2 || argc > 5) + if (argc < 2 || argc > 6) usage(); if (func == F_REPLACE) (void) delete(argv[0], NULL); @@ -239,7 +237,7 @@ getsocket(void) struct sockaddr_in so_mask = {8, 0, 0, { 0xffffffff}}; struct sockaddr_inarp blank_sin = {sizeof(blank_sin), AF_INET }, sin_m; struct sockaddr_dl blank_sdl = {sizeof(blank_sdl), AF_LINK }, sdl_m; -int expire_time, flags, export_only, doing_proxy, found_entry; +int expire_time, flags, doing_proxy, proxy_only, found_entry; struct { struct rt_msghdr m_rtm; char m_space[512]; @@ -264,7 +262,7 @@ set(int argc, char **argv) sdl_m = blank_sdl; sin_m = blank_sin; sin->sin_addr.s_addr = inet_addr(host); - if (sin->sin_addr.s_addr == -1) { + if (sin->sin_addr.s_addr == INADDR_NONE) { if (!(hp = gethostbyname(host))) { warnx("%s: %s", host, hstrerror(h_errno)); return (1); @@ -272,16 +270,21 @@ set(int argc, char **argv) bcopy((char *)hp->h_addr, (char *)&sin->sin_addr, sizeof sin->sin_addr); } - doing_proxy = flags = export_only = expire_time = 0; + doing_proxy = flags = proxy_only = expire_time = 0; while (argc-- > 0) { if (strncmp(argv[0], "temp", 4) == 0) { - struct timeval time; - gettimeofday(&time, 0); - expire_time = time.tv_sec + 20 * 60; + struct timeval tv; + gettimeofday(&tv, 0); + expire_time = tv.tv_sec + 20 * 60; } else if (strncmp(argv[0], "pub", 3) == 0) { flags |= RTF_ANNOUNCE; - doing_proxy = SIN_PROXY; + doing_proxy = 1; + if (argc && strncmp(argv[1], "only", 3) == 0) { + proxy_only = 1; + sin_m.sin_other = SIN_PROXY; + argc--; argv++; + } } else if (strncmp(argv[0], "trail", 5) == 0) { printf("%s: Sending trailers is no longer supported\n", host); @@ -324,7 +327,7 @@ tryagain: return(1); } sin_m.sin_other = SIN_PROXY; - export_only = 1; + proxy_only = 1; goto tryagain; } overwrite: @@ -348,7 +351,7 @@ get(char *host) sin_m = blank_sin; sin->sin_addr.s_addr = inet_addr(host); - if (sin->sin_addr.s_addr == -1) { + if (sin->sin_addr.s_addr == INADDR_NONE) { if (!(hp = gethostbyname(host))) errx(1, "%s: %s", host, hstrerror(h_errno)); bcopy((char *)hp->h_addr, (char *)&sin->sin_addr, @@ -376,10 +379,14 @@ delete(char *host, char *info) getsocket(); sin_m = blank_sin; - if (info && strncmp(info, "pro", 3) == 0) - sin_m.sin_other = SIN_PROXY; + if (info) { + if (strncmp(info, "pub", 3) == 0) + sin_m.sin_other = SIN_PROXY; + else + usage(); + } sin->sin_addr.s_addr = inet_addr(host); - if (sin->sin_addr.s_addr == -1) { + if (sin->sin_addr.s_addr == INADDR_NONE) { if (!(hp = gethostbyname(host))) { warnx("%s: %s", host, hstrerror(h_errno)); return (1); @@ -470,7 +477,7 @@ void print_entry(struct sockaddr_dl *sdl, struct sockaddr_inarp *sin, struct rt_msghdr *rtm) { - char *host; + const char *host; struct hostent *hp; int seg; @@ -567,7 +574,7 @@ usage(void) fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n", "usage: arp [-n] hostname", " arp [-n] -a", - " arp -d hostname [proxy]", + " arp -d hostname [pub]", " arp -d -a", " arp -s hostname ether_addr [temp] [pub]", " arp -S hostname ether_addr [temp] [pub]", @@ -601,7 +608,7 @@ rtmsg(int cmd) rtm->rtm_flags |= (RTF_HOST | RTF_STATIC); sin_m.sin_other = 0; if (doing_proxy) { - if (export_only) + if (proxy_only) sin_m.sin_other = SIN_PROXY; else { rtm->rtm_addrs |= RTA_NETMASK; |