extern const char * _SL_;
extern int max_flush_loops;
extern int batch_mode;
+extern int numeric;
extern bool do_all;
#ifndef CONFDIR
int force;
int max_flush_loops = 10;
int batch_mode;
+int numeric;
bool do_all;
struct rtnl_handle rth = { .fd = -1 };
" -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);
}
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 {
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";
return ncache;
pe = getprotobynumber(proto);
- if (pe) {
+ if (pe && !numeric) {
if (icache != -1)
free(ncache);
icache = proto;
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;
}
#include <linux/sockios.h>
#include "rt_names.h"
+#include "utils.h"
const char * ll_type_n2a(int type, char *buf, int len)
{
#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;
}
#define NAME_MAX_LEN 512
+int numeric;
+
struct rtnl_hash_entry {
struct rtnl_hash_entry *next;
const char *name;
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;
}
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;
}
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;
}
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;
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;
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) {
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;
}
\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] |
.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
.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[
.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.
}
#endif
-static int resolve_services = 1;
int preferred_family = AF_UNSPEC;
static int show_options;
int show_details;
static int sctp_ino;
static int show_tipcinfo;
static int show_tos;
+int numeric;
int oneline;
enum col_id {
return buf;
}
- if (!resolve_services)
+ if (numeric)
goto do_numeric;
if (dg_proto == RAW_PROTO)
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) {
long_opts, NULL)) != EOF) {
switch (ch) {
case 'n':
- resolve_services = 0;
+ numeric = 1;
break;
case 'r':
resolve_hosts = 1;
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();
int json;
int color;
int oneline;
+int numeric;
static char *conf_file;
" 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");
}
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;