Fix ndp(8) -f flag parsing

PR:		bin/136661
Reminded by:	Vinicius Zavam
MFC after:	2 weeks
This commit is contained in:
Alexander V. Chernikov 2014-05-09 14:24:02 +00:00
parent db4300da10
commit aa06c87e50
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=265778
2 changed files with 35 additions and 13 deletions

View File

@ -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.

View File

@ -97,6 +97,7 @@
#include <arpa/inet.h>
#include <ctype.h>
#include <netdb.h>
#include <errno.h>
#include <nlist.h>
@ -126,7 +127,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 *);
@ -189,7 +190,8 @@ main(int argc, char **argv)
break;
case 'd':
case 'f':
case 'i' :
exit(file(optarg) ? 1 : 0);
case 'i':
if (mode) {
usage();
/*NOTREACHED*/
@ -312,17 +314,15 @@ main(int argc, char **argv)
/*
* Process a file to set standard ndp entries
*/
int
static int
file(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];
@ -330,10 +330,15 @@ file(char *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;
}