From ca697cee4cfcb8b0f82b328a8b51ca94ffad0103 Mon Sep 17 00:00:00 2001 From: Hangbin Liu Date: Wed, 12 Jun 2019 17:21:15 +0800 Subject: [PATCH] ip: add a new parameter -Numeric 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 Signed-off-by: Hangbin Liu Signed-off-by: David Ahern --- include/utils.h | 1 + ip/ip.c | 6 +++++- ip/rtm_map.c | 6 ++++++ lib/inet_proto.c | 2 +- lib/ll_proto.c | 2 +- lib/ll_types.c | 3 ++- lib/rt_names.c | 18 ++++++++++-------- man/man8/ip.8 | 6 ++++++ man/man8/tc.8 | 6 ++++++ misc/ss.c | 15 ++++++--------- tc/tc.c | 5 ++++- 11 files changed, 48 insertions(+), 22 deletions(-) diff --git a/include/utils.h b/include/utils.h index 8a9c30208..0f57ee972 100644 --- a/include/utils.h +++ b/include/utils.h @@ -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 02827e7c9..7e35966d4 100644 --- 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 { diff --git a/ip/rtm_map.c b/ip/rtm_map.c index 76f937805..8d8eafe0a 100644 --- a/ip/rtm_map.c +++ b/ip/rtm_map.c @@ -23,6 +23,12 @@ 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"; diff --git a/lib/inet_proto.c b/lib/inet_proto.c index 0836a4c96..41e2e8b88 100644 --- a/lib/inet_proto.c +++ b/lib/inet_proto.c @@ -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; diff --git a/lib/ll_proto.c b/lib/ll_proto.c index 8316a7553..78c39616f 100644 --- a/lib/ll_proto.c +++ b/lib/ll_proto.c @@ -92,7 +92,7 @@ const char * ll_proto_n2a(unsigned short id, char *buf, int len) id = ntohs(id); - for (i=0; i #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= 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; } diff --git a/man/man8/ip.8 b/man/man8/ip.8 index f4cbfc03e..e2bda2a2e 100644 --- a/man/man8/ip.8 +++ b/man/man8/ip.8 @@ -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 diff --git a/man/man8/tc.8 b/man/man8/tc.8 index ab0bad8a8..b81a396f2 100644 --- a/man/man8/tc.8 +++ b/man/man8/tc.8 @@ -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 " specifies path to the config file. This option is used in conjunction with other options (e.g. diff --git a/misc/ss.c b/misc/ss.c index 99c06d31f..e01ebf4d8 100644 --- 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(¤t_filter, state_filter); filter_merge_defaults(¤t_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 e08f322a5..64e342dd8 100644 --- 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; -- 2.47.2