]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ip: add a new parameter -Numeric
authorHangbin Liu <liuhangbin@gmail.com>
Wed, 12 Jun 2019 09:21:15 +0000 (17:21 +0800)
committerDavid Ahern <dsahern@gmail.com>
Tue, 18 Jun 2019 15:37:47 +0000 (08:37 -0700)
Add a new parameter '-Numeric' to show the number of protocol, scope,
dsfield, etc directly instead of converting it to human readable name.
Do the same on tc and ss.

This patch is based on David Ahern's previous patch.

Suggested-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
include/utils.h
ip/ip.c
ip/rtm_map.c
lib/inet_proto.c
lib/ll_proto.c
lib/ll_types.c
lib/rt_names.c
man/man8/ip.8
man/man8/tc.8
misc/ss.c
tc/tc.c

index 8a9c302082b28a4ae96b98758cb047f37d46ba29..0f57ee9727f8342595729dbf68088931c1f15988 100644 (file)
@@ -34,6 +34,7 @@ extern int timestamp_short;
 extern const char * _SL_;
 extern int max_flush_loops;
 extern int batch_mode;
+extern int numeric;
 extern bool do_all;
 
 #ifndef CONFDIR
diff --git a/ip/ip.c b/ip/ip.c
index 02827e7c9d12613728ecffaf2da91a533d73b5e5..7e35966d4ed611f33f0c29ee681047cdb8a88637 100644 (file)
--- a/ip/ip.c
+++ b/ip/ip.c
@@ -36,6 +36,7 @@ int timestamp;
 int force;
 int max_flush_loops = 10;
 int batch_mode;
+int numeric;
 bool do_all;
 
 struct rtnl_handle rth = { .fd = -1 };
@@ -57,7 +58,8 @@ static void usage(void)
                "                    -4 | -6 | -I | -D | -M | -B | -0 |\n"
                "                    -l[oops] { maximum-addr-flush-attempts } | -br[ief] |\n"
                "                    -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |\n"
-               "                    -rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}\n");
+               "                    -rc[vbuf] [size] | -n[etns] name | -N[umeric] | -a[ll] |\n"
+               "                    -c[olor]}\n");
        exit(-1);
 }
 
@@ -289,6 +291,8 @@ int main(int argc, char **argv)
                        NEXT_ARG();
                        if (netns_switch(argv[1]))
                                exit(-1);
+               } else if (matches(opt, "-Numeric") == 0) {
+                       ++numeric;
                } else if (matches(opt, "-all") == 0) {
                        do_all = true;
                } else {
index 76f937805bb4210681d5c7ffe5be6cf5e3bb2e9a..8d8eafe0ae99aa5a242735120e109af67f81b016 100644 (file)
 
 char *rtnl_rtntype_n2a(int id, char *buf, int len)
 {
+
+       if (numeric) {
+               snprintf(buf, len, "%d", id);
+               return buf;
+       }
+
        switch (id) {
        case RTN_UNSPEC:
                return "none";
index 0836a4c96a0b486ef9e82f5a9d5eddcd27a23ae1..41e2e8b88d82b05a752e8b259b951371c0b85033 100644 (file)
@@ -32,7 +32,7 @@ const char *inet_proto_n2a(int proto, char *buf, int len)
                return ncache;
 
        pe = getprotobynumber(proto);
-       if (pe) {
+       if (pe && !numeric) {
                if (icache != -1)
                        free(ncache);
                icache = proto;
index 8316a75539efd603177fafa9b8285b3f3792c43c..78c39616f2cc136a156f4b99504fa20487d654d4 100644 (file)
@@ -92,7 +92,7 @@ const char * ll_proto_n2a(unsigned short id, char *buf, int len)
 
        id = ntohs(id);
 
-        for (i=0; i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) {
+        for (i=0; !numeric && i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) {
                  if (llproto_names[i].id == id)
                        return llproto_names[i].name;
        }
index 32d04b5ab9f9b43054120747ee95b29ed9f6c77e..49da15df911dd633cfc4e8c6627e1fae1cd7a31a 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/sockios.h>
 
 #include "rt_names.h"
+#include "utils.h"
 
 const char * ll_type_n2a(int type, char *buf, int len)
 {
@@ -112,7 +113,7 @@ __PF(VOID,void)
 #undef __PF
 
         int i;
-        for (i=0; i<sizeof(arphrd_names)/sizeof(arphrd_names[0]); i++) {
+        for (i=0; !numeric && i<sizeof(arphrd_names)/sizeof(arphrd_names[0]); i++) {
                  if (arphrd_names[i].type == type)
                        return arphrd_names[i].name;
        }
index 66d5f2f0722b80a7764315a8122b2fcc7fd0f138..41cccfb85e2d9cfe8c6c159a220af92ded926639 100644 (file)
@@ -27,6 +27,8 @@
 
 #define NAME_MAX_LEN 512
 
+int numeric;
+
 struct rtnl_hash_entry {
        struct rtnl_hash_entry  *next;
        const char              *name;
@@ -180,7 +182,7 @@ static void rtnl_rtprot_initialize(void)
 
 const char *rtnl_rtprot_n2a(int id, char *buf, int len)
 {
-       if (id < 0 || id >= 256) {
+       if (id < 0 || id >= 256 || numeric) {
                snprintf(buf, len, "%u", id);
                return buf;
        }
@@ -246,7 +248,7 @@ static void rtnl_rtscope_initialize(void)
 
 const char *rtnl_rtscope_n2a(int id, char *buf, int len)
 {
-       if (id < 0 || id >= 256) {
+       if (id < 0 || id >= 256 || numeric) {
                snprintf(buf, len, "%d", id);
                return buf;
        }
@@ -311,7 +313,7 @@ static void rtnl_rtrealm_initialize(void)
 
 const char *rtnl_rtrealm_n2a(int id, char *buf, int len)
 {
-       if (id < 0 || id >= 256) {
+       if (id < 0 || id >= 256 || numeric) {
                snprintf(buf, len, "%d", id);
                return buf;
        }
@@ -419,7 +421,7 @@ const char *rtnl_rttable_n2a(__u32 id, char *buf, int len)
        entry = rtnl_rttable_hash[id & 255];
        while (entry && entry->id != id)
                entry = entry->next;
-       if (entry)
+       if (!numeric && entry)
                return entry->name;
        snprintf(buf, len, "%u", id);
        return buf;
@@ -484,7 +486,7 @@ const char *rtnl_dsfield_n2a(int id, char *buf, int len)
                if (!rtnl_rtdsfield_init)
                        rtnl_rtdsfield_initialize();
        }
-       if (rtnl_rtdsfield_tab[id])
+       if (!numeric && rtnl_rtdsfield_tab[id])
                return rtnl_rtdsfield_tab[id];
        snprintf(buf, len, "0x%02x", id);
        return buf;
@@ -584,7 +586,7 @@ const char *rtnl_group_n2a(int id, char *buf, int len)
        if (!rtnl_group_init)
                rtnl_group_initialize();
 
-       for (i = 0; i < 256; i++) {
+       for (i = 0; !numeric && i < 256; i++) {
                entry = rtnl_group_hash[i];
 
                while (entry) {
@@ -633,8 +635,8 @@ static void nl_proto_initialize(void)
 
 const char *nl_proto_n2a(int id, char *buf, int len)
 {
-       if (id < 0 || id >= 256) {
-               snprintf(buf, len, "%u", id);
+       if (id < 0 || id >= 256 || numeric) {
+               snprintf(buf, len, "%d", id);
                return buf;
        }
 
index f4cbfc03e1ca5623229236102497c439e2ca0236..e2bda2a2ea9048f96bba37d926acd29d8bac6459 100644 (file)
@@ -47,6 +47,7 @@ ip \- show / manipulate routing, network devices, interfaces and tunnels
 \fB\-t\fR[\fIimestamp\fR] |
 \fB\-ts\fR[\fIhort\fR] |
 \fB\-n\fR[\fIetns\fR] name |
+\fB\-N\fR[\fIumeric\fR] |
 \fB\-a\fR[\fIll\fR] |
 \fB\-c\fR[\fIolor\fR] |
 \fB\-br\fR[\fIief\fR] |
@@ -174,6 +175,11 @@ to
 .RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | "
 .BR help " }"
 
+.TP
+.BR "\-N" , " \-Numeric"
+Print the number of protocol, scope, dsfield, etc directly instead of
+converting it to human readable name.
+
 .TP
 .BR "\-a" , " \-all"
 executes specified command over all objects, it depends if command
index ab0bad8a88c253c5724cd5dff916c3b91fce451c..b81a396f2397b5199df5f4b24ba1d1a76d4e2b07 100644 (file)
@@ -119,6 +119,7 @@ tc \- show / manipulate traffic control settings
 .IR OPTIONS " := {"
 \fB[ -force ] -b\fR[\fIatch\fR] \fB[ filename ] \fR|
 \fB[ \fB-n\fR[\fIetns\fR] name \fB] \fR|
+\fB[ \fB-N\fR[\fIumeric\fR] \fB] \fR|
 \fB[ \fB-nm \fR| \fB-nam\fR[\fIes\fR] \fB] \fR|
 \fB[ \fR{ \fB-cf \fR| \fB-c\fR[\fIonf\fR] \fR} \fB[ filename ] \fB] \fR
 \fB[ -t\fR[imestamp\fR] \fB\] \fR| \fB[ -t\fR[short\fR] \fR| \fB[
@@ -707,6 +708,11 @@ to
 .RI "-n[etns] " NETNS " [ " OPTIONS " ] " OBJECT " { " COMMAND " | "
 .BR help " }"
 
+.TP
+.BR "\-N" , " \-Numeric"
+Print the number of protocol, scope, dsfield, etc directly instead of
+converting it to human readable name.
+
 .TP
 .BR "\-cf" , " \-conf " <FILENAME>
 specifies path to the config file. This option is used in conjunction with other options (e.g.
index 99c06d31fdb0955960c695be22651787bfb8df81..e01ebf4d89a62fb62d642de2bbc4050518316754 100644 (file)
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -106,7 +106,6 @@ static int security_get_initial_context(char *name,  char **context)
 }
 #endif
 
-static int resolve_services = 1;
 int preferred_family = AF_UNSPEC;
 static int show_options;
 int show_details;
@@ -121,6 +120,7 @@ static int follow_events;
 static int sctp_ino;
 static int show_tipcinfo;
 static int show_tos;
+int numeric;
 int oneline;
 
 enum col_id {
@@ -1553,7 +1553,7 @@ static const char *resolve_service(int port)
                return buf;
        }
 
-       if (!resolve_services)
+       if (numeric)
                goto do_numeric;
 
        if (dg_proto == RAW_PROTO)
@@ -4296,14 +4296,11 @@ static int netlink_show_one(struct filter *f,
 
        sock_state_print(&st);
 
-       if (resolve_services)
-               prot_name = nl_proto_n2a(prot, prot_buf, sizeof(prot_buf));
-       else
-               prot_name = int_to_str(prot, prot_buf);
+       prot_name = nl_proto_n2a(prot, prot_buf, sizeof(prot_buf));
 
        if (pid == -1) {
                procname[0] = '*';
-       } else if (resolve_services) {
+       } else if (!numeric) {
                int done = 0;
 
                if (!pid) {
@@ -5050,7 +5047,7 @@ int main(int argc, char *argv[])
                                 long_opts, NULL)) != EOF) {
                switch (ch) {
                case 'n':
-                       resolve_services = 0;
+                       numeric = 1;
                        break;
                case 'r':
                        resolve_hosts = 1;
@@ -5268,7 +5265,7 @@ int main(int argc, char *argv[])
        filter_states_set(&current_filter, state_filter);
        filter_merge_defaults(&current_filter);
 
-       if (resolve_services && resolve_hosts &&
+       if (!numeric && resolve_hosts &&
            (current_filter.dbs & (UNIX_DBM|INET_L4_DBM)))
                init_service_resolver();
 
diff --git a/tc/tc.c b/tc/tc.c
index e08f322a528a5fe6a27056804a2d71cca4ddb13f..64e342dd85bffd4cfbe003a1fe95458718ea87ac 100644 (file)
--- a/tc/tc.c
+++ b/tc/tc.c
@@ -43,6 +43,7 @@ bool use_names;
 int json;
 int color;
 int oneline;
+int numeric;
 
 static char *conf_file;
 
@@ -200,7 +201,7 @@ static void usage(void)
                "                   action | monitor | exec }\n"
                "       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[aw] |\n"
                "                   -o[neline] | -j[son] | -p[retty] | -c[olor]\n"
-               "                   -b[atch] [filename] | -n[etns] name |\n"
+               "                   -b[atch] [filename] | -n[etns] name | -N[umeric] |\n"
                "                    -nm | -nam[es] | { -cf | -conf } path }\n");
 }
 
@@ -486,6 +487,8 @@ int main(int argc, char **argv)
                        NEXT_ARG();
                        if (netns_switch(argv[1]))
                                return -1;
+               } else if (matches(argv[1], "-Numeric") == 0) {
+                       ++numeric;
                } else if (matches(argv[1], "-names") == 0 ||
                                matches(argv[1], "-nm") == 0) {
                        use_names = true;