On Mon, Apr 29, 2019 at 11:10:31AM +0100, Stuart Henderson wrote:
> On 2019/04/29 11:58, Sebastian Benoit wrote:
> > David Gwynne([email protected]) on 2019.04.29 19:36:51 +1000:
> > > 
> > > 
> > > > On 29 Apr 2019, at 4:59 pm, Remi Locherer <[email protected]> wrote:
> > > > 
> > > > Hi David
> > > > 
> > > > On Mon, Apr 29, 2019 at 11:53:27AM +1000, David Gwynne wrote:
> > > >> it's always bothered me that i config areas on a crisco using a number,
> > > >> but then have to think hard to convert that number to an address for 
> > > >> use
> > > >> in openbsd. eg, i was given area 700 in one place, which is 0.0.2.188
> > > >> as an address. super annoying.
> > > >> 
> > > >> so this changes the ospfd parser so it accepts both a number or 
> > > >> address.
> > > >> i also changed it so it prints the number by default, which may be
> > > >> contentious. the manpage is slightly tweaked too.
> > > >> 
> > > >> thoughts?
> > > > 
> > > > I like it to be able to use a number instead of an address!
> > > > 
> > > > It worked fine in my short test I performed.
> > > > 
> > > > The output with the comment looks a bit strange to me.
> > > 
> > > Are you sure it doesn't look... awesome?
> > 
> > I like it!
> 
> I don't really, but if we change this it needs to be displayed somehow
> and I don't have an idea to make it look nicer than this (cisco's method
> seems pretty horrible and wouldn't work for us anyway - looks like they
> remember which format was used to configure an area and use that as
> the output format...)
> 

Maybe it's better when we just allow both input formats but don't change
any output.

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