diff options
author | ae <ae@FreeBSD.org> | 2014-08-26 10:32:08 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2014-08-26 10:32:08 +0000 |
commit | e15e639ea83e034dde99cff5d10c2d179bf59b3e (patch) | |
tree | 010408c2c1ad5c3aab26eca32ec6ea6074c150e7 /usr.sbin | |
parent | 60a236916672c4bce4522b35e3ee007fd7eb1146 (diff) | |
download | FreeBSD-src-e15e639ea83e034dde99cff5d10c2d179bf59b3e.zip FreeBSD-src-e15e639ea83e034dde99cff5d10c2d179bf59b3e.tar.gz |
MFC r265778 (by melifaro):
Fix ndp(8) -f flag parsing
PR: bin/136661
MFC r268827 (by peter):
Fix "ndp -d hostname".
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/ndp/ndp.8 | 25 | ||||
-rw-r--r-- | usr.sbin/ndp/ndp.c | 25 |
2 files changed, 36 insertions, 14 deletions
diff --git a/usr.sbin/ndp/ndp.8 b/usr.sbin/ndp/ndp.8 index 19da8bb..c2a4c1d 100644 --- a/usr.sbin/ndp/ndp.8 +++ b/usr.sbin/ndp/ndp.8 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd Jan 10, 2013 +.Dd May 9, 2014 .Dt NDP 8 .Os .\" @@ -136,9 +136,26 @@ seconds. Erase all the NDP entries. .It Fl d Delete specified NDP entry. -.It Fl f -Parse the file specified by -.Ar filename . +.It Fl f Ar filename +Cause the file +.Ar filename +to be read and multiple entries to be set in the +.Tn NDP +table. +Entries +in the file should be of the form +.Pp +.Bd -ragged -offset indent -compact +.Ar hostname ether_addr +.Op Cm temp +.Op Cm proxy +.Ed +.Pp +with argument meanings as given above. +Leading whitespace and empty lines are ignored. +A +.Ql # +character will mark the rest of the line as a comment. .It Fl H Harmonize consistency between the routing table and the default router list; install the top entry of the list into the kernel routing table. diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index 2ff1e31..830f344 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -97,6 +97,7 @@ #include <arpa/inet.h> +#include <ctype.h> #include <netdb.h> #include <errno.h> #include <nlist.h> @@ -131,7 +132,7 @@ char host_buf[NI_MAXHOST]; /* getnameinfo() */ char ifix_buf[IFNAMSIZ]; /* if_indextoname() */ int main(int, char **); -int file(char *); +static int file(char *); void getsocket(void); int set(int, char **); void get(char *); @@ -194,9 +195,10 @@ main(argc, argv) mode = ch; arg = NULL; break; - case 'd': case 'f': - case 'i' : + exit(file(optarg) ? 1 : 0); + case 'd': + case 'i': if (mode) { usage(); /*NOTREACHED*/ @@ -319,18 +321,16 @@ main(argc, argv) /* * Process a file to set standard ndp entries */ -int +static int file(name) char *name; { FILE *fp; int i, retval; - char line[100], arg[5][50], *args[5]; + char line[100], arg[5][50], *args[5], *p; - if ((fp = fopen(name, "r")) == NULL) { - fprintf(stderr, "ndp: cannot open %s\n", name); - exit(1); - } + if ((fp = fopen(name, "r")) == NULL) + err(1, "cannot open %s", name); args[0] = &arg[0][0]; args[1] = &arg[1][0]; args[2] = &arg[2][0]; @@ -338,10 +338,15 @@ file(name) args[4] = &arg[4][0]; retval = 0; while (fgets(line, sizeof(line), fp) != NULL) { + if ((p = strchr(line, '#')) != NULL) + *p = '\0'; + for (p = line; isblank(*p); p++); + if (*p == '\n' || *p == '\0') + continue; i = sscanf(line, "%49s %49s %49s %49s %49s", arg[0], arg[1], arg[2], arg[3], arg[4]); if (i < 2) { - fprintf(stderr, "ndp: bad line: %s\n", line); + warnx("bad line: %s", line); retval = 1; continue; } |