On Wed, May 15, 2019 at 11:15:03PM +0200, Remi Locherer wrote: > Any opinions or comments on this? I think this would be a valuable addition > to ospfd. >
I can't see any harm in it. OK denis@ > > > > Below diff changes ospfctl to accept the address and number format for > > "ospfct show database area XXX". > > > > > > Index: parser.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/ospfctl/parser.c,v > > retrieving revision 1.20 > > diff -u -p -r1.20 parser.c > > --- parser.c 9 May 2011 12:25:35 -0000 1.20 > > +++ parser.c 30 Apr 2019 20:28:18 -0000 > > @@ -39,7 +39,8 @@ enum token_type { > > ADDRESS, > > FLAG, > > PREFIX, > > - IFNAME > > + IFNAME, > > + AREA > > }; > > > > struct token { > > @@ -107,7 +108,7 @@ static const struct token t_show_db[] = > > }; > > > > static const struct token t_show_area[] = { > > - {ADDRESS, "", NONE, NULL}, > > + {AREA, "", NONE, NULL}, > > {ENDTOKEN, "", NONE, NULL} > > }; > > > > @@ -218,6 +219,14 @@ match_token(const char *word, const stru > > res->action = t->value; > > } > > break; > > + case AREA: > > + if (parse_area(word, &res->addr)) { > > + match++; > > + t = &table[i]; > > + if (t->value) > > + res->action = t->value; > > + } > > + break; > > case PREFIX: > > if (parse_prefix(word, &res->addr, &res->prefixlen)) { > > match++; > > @@ -274,6 +283,9 @@ show_valid_args(const struct token *tabl > > case ADDRESS: > > fprintf(stderr, " <address>\n"); > > break; > > + case AREA: > > + fprintf(stderr, " <area>\n"); > > + break; > > case PREFIX: > > fprintf(stderr, " <address>[/<len>]\n"); > > break; > > @@ -298,6 +310,32 @@ parse_addr(const char *word, struct in_a > > bzero(&ina, sizeof(ina)); > > > > if (inet_pton(AF_INET, word, &ina)) { > > + addr->s_addr = ina.s_addr; > > + return (1); > > + } > > + > > + return (0); > > +} > > + > > +int > > +parse_area(const char *word, struct in_addr *addr) > > +{ > > + struct in_addr ina; > > + const char *errstr; > > + > > + if (word == NULL) > > + return (0); > > + > > + bzero(addr, sizeof(struct in_addr)); > > + bzero(&ina, sizeof(ina)); > > + > > + if (inet_pton(AF_INET, word, &ina)) { > > + addr->s_addr = ina.s_addr; > > + return (1); > > + } > > + > > + ina.s_addr = htonl(strtonum(word, 0, 0xffffffff, &errstr)); > > + if (errstr == NULL) { > > addr->s_addr = ina.s_addr; > > return (1); > > } > > Index: parser.h > > =================================================================== > > RCS file: /cvs/src/usr.sbin/ospfctl/parser.h,v > > retrieving revision 1.13 > > diff -u -p -r1.13 parser.h > > --- parser.h 9 May 2011 12:25:35 -0000 1.13 > > +++ parser.h 30 Apr 2019 20:28:52 -0000 > > @@ -64,6 +64,7 @@ struct parse_result { > > > > struct parse_result *parse(int, char *[]); > > int parse_addr(const char *, struct in_addr *); > > +int parse_area(const char *, struct in_addr *); > > int parse_prefix(const char *, struct in_addr *, > > u_int8_t *); > > > > >