]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ss: Allow to specify sport/dport without ':'
authorVadim Kochan <vadim4j@gmail.com>
Fri, 27 Feb 2015 21:54:36 +0000 (23:54 +0200)
committerStephen Hemminger <shemming@brocade.com>
Sun, 15 Mar 2015 19:11:42 +0000 (12:11 -0700)
Ugly change but it allows to specify sport/dport w/o ':'

    # ss dport = 80 and sport = 44862

Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
misc/ss.c
misc/ssfilter.h
misc/ssfilter.y

index 21a4366a7db0b03637ac49b8004cfa9123a4bc8a..196b020cca77914e5df3470d06c7b3a6e4961508 100644 (file)
--- 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);
index 00b92e3dcc6a7ffd31dfa46fd7575a8879359ed0..b20092bc9e89cf1c8c45f3f0a886af196c5ea933 100644 (file)
@@ -9,6 +9,8 @@
 #define SSF_S_LE  8
 #define SSF_S_AUTO  9
 
+#include <stdbool.h>
+
 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);
 
index 2e9d9626a30ae70fde510749d03c19fee3cfcedf..a258d04b85d75eb20e83f4d49fe52c3dc6221c6e 100644 (file)
@@ -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);