From: Vadim Kochan Date: Fri, 27 Feb 2015 21:54:36 +0000 (+0200) Subject: ss: Allow to specify sport/dport without ':' X-Git-Tag: v4.0.0~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7871f7dbf0912500e364efdb5abfaaad531591d0;p=thirdparty%2Fiproute2.git ss: Allow to specify sport/dport without ':' Ugly change but it allows to specify sport/dport w/o ':' # ss dport = 80 and sport = 44862 Signed-off-by: Vadim Kochan --- diff --git a/misc/ss.c b/misc/ss.c index 21a4366a7..196b020cc 100644 --- a/misc/ss.c +++ b/misc/ss.c @@ -1380,7 +1380,7 @@ static int xll_name_to_index(const char *dev) return ll_name_to_index(dev); } -void *parse_hostcond(char *addr) +void *parse_hostcond(char *addr, bool is_port) { char *port = NULL; struct aafilter a = { .port = -1 }; @@ -1473,10 +1473,14 @@ void *parse_hostcond(char *addr) } else { port = strrchr(strchr(addr, '/') ? : addr, ':'); } + + if (is_port) + port = addr; + if (port && *port) { - if (*port != ':') - return NULL; - *port++ = 0; + if (*port == ':') + *port++ = 0; + if (*port && *port != '*') { if (get_integer(&a.port, port, 0)) { struct servent *se1 = NULL; @@ -1517,7 +1521,7 @@ void *parse_hostcond(char *addr) } } } - if (addr && *addr && *addr != '*') { + if (!is_port && addr && *addr && *addr != '*') { if (get_prefix_1(&a.addr, addr, fam)) { if (get_dns_host(&a, addr, fam)) { fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", addr); diff --git a/misc/ssfilter.h b/misc/ssfilter.h index 00b92e3dc..b20092bc9 100644 --- a/misc/ssfilter.h +++ b/misc/ssfilter.h @@ -9,6 +9,8 @@ #define SSF_S_LE 8 #define SSF_S_AUTO 9 +#include + struct ssfilter { int type; @@ -17,5 +19,5 @@ struct ssfilter }; int ssfilter_parse(struct ssfilter **f, int argc, char **argv, FILE *fp); -void *parse_hostcond(char*); +void *parse_hostcond(char *addr, bool is_port); diff --git a/misc/ssfilter.y b/misc/ssfilter.y index 2e9d9626a..a258d04b8 100644 --- a/misc/ssfilter.y +++ b/misc/ssfilter.y @@ -25,6 +25,7 @@ static char **yy_argv; static int yy_argc; static FILE *yy_fp; static ssfilter_t *yy_ret; +static int tok_type = -1; static int yylex(void); @@ -220,14 +221,22 @@ int yylex(void) return '('; if (strcmp(curtok, ")") == 0) return ')'; - if (strcmp(curtok, "dst") == 0) + if (strcmp(curtok, "dst") == 0) { + tok_type = DCOND; return DCOND; - if (strcmp(curtok, "src") == 0) + } + if (strcmp(curtok, "src") == 0) { + tok_type = SCOND; return SCOND; - if (strcmp(curtok, "dport") == 0) + } + if (strcmp(curtok, "dport") == 0) { + tok_type = DPORT; return DPORT; - if (strcmp(curtok, "sport") == 0) + } + if (strcmp(curtok, "sport") == 0) { + tok_type = SPORT; return SPORT; + } if (strcmp(curtok, ">=") == 0 || strcmp(curtok, "ge") == 0 || strcmp(curtok, "geq") == 0) @@ -250,9 +259,11 @@ int yylex(void) if (strcmp(curtok, "<") == 0 || strcmp(curtok, "lt") == 0) return '<'; - if (strcmp(curtok, "autobound") == 0) + if (strcmp(curtok, "autobound") == 0) { + tok_type = AUTOBOUND; return AUTOBOUND; - yylval = (void*)parse_hostcond(curtok); + } + yylval = (void*)parse_hostcond(curtok, tok_type == SPORT || tok_type == DPORT); if (yylval == NULL) { fprintf(stderr, "Cannot parse dst/src address.\n"); exit(1);