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 *);
> >  
> > 
> 

Reply via email to