From: Todd C. Miller Date: Mon, 17 Jun 1996 04:02:33 +0000 (+0000) Subject: added support for net_addr/netmask X-Git-Tag: SUDO_1_5_0~158 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f66eb18a5d534a0bba3b04e253d44c9c92e7e87c;p=sudo added support for net_addr/netmask --- diff --git a/parse.c b/parse.c index 86ddef3fe..1316ccb58 100644 --- a/parse.c +++ b/parse.c @@ -305,15 +305,28 @@ int addr_matches(n) char *n; { int i; - struct in_addr addr; - - addr.s_addr = inet_addr(n); + char *m; + struct in_addr addr, mask; + + /* If there's an explicate netmask, use it. */ + if ((m = strchr(n, '/'))) { + *m++ = '\0'; + mask.s_addr = inet_addr(m); + addr.s_addr = inet_addr(n); + *(m - 1) = '/'; + + for (i = 0; i < num_interfaces; i++) + if ((interfaces[i].addr.s_addr & mask.s_addr) == addr.s_addr) + return(TRUE); + } else { + addr.s_addr = inet_addr(n); - for (i = 0; i < num_interfaces; i++) - if (interfaces[i].addr.s_addr == addr.s_addr || - (interfaces[i].addr.s_addr & interfaces[i].netmask.s_addr) - == addr.s_addr) - return(TRUE); + for (i = 0; i < num_interfaces; i++) + if (interfaces[i].addr.s_addr == addr.s_addr || + (interfaces[i].addr.s_addr & interfaces[i].netmask.s_addr) + == addr.s_addr) + return(TRUE); + } return(FALSE); } diff --git a/parse.lex b/parse.lex index fd113f754..320be5702 100644 --- a/parse.lex +++ b/parse.lex @@ -77,6 +77,7 @@ extern void yyerror __P((char *)); %} OCTET [[:digit:]]{1,3} +DOTTEDQUAD {OCTET}(\.{OCTET}){3} WORD [[:alnum:]_-]+ %e 4000 @@ -176,7 +177,7 @@ NOPASSWD: { return(USERGROUP); } -{OCTET}(\.{OCTET}){3} { +{DOTTEDQUAD}(\/{DOTTEDQUAD})? { fill(yytext, yyleng); LEXTRACE("NTWKADDR "); return(NTWKADDR);