summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2017-11-27 17:40:56 +0100
committerKarel Zak2017-11-27 17:40:56 +0100
commitf593e2797ec5b6517d34df0a9976083b155fb41b (patch)
tree8845bc8812237406094f8e31c06a750a9b45e489
parenttests: fix lsns perms (diff)
downloadkernel-qcow2-util-linux-f593e2797ec5b6517d34df0a9976083b155fb41b.tar.gz
kernel-qcow2-util-linux-f593e2797ec5b6517d34df0a9976083b155fb41b.tar.xz
kernel-qcow2-util-linux-f593e2797ec5b6517d34df0a9976083b155fb41b.zip
lsns: initialize stuff when really necessary
It's more robust to depend on list of the wanted columns than on another variables. Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--sys-utils/lsns.82
-rw-r--r--sys-utils/lsns.c47
2 files changed, 26 insertions, 23 deletions
diff --git a/sys-utils/lsns.8 b/sys-utils/lsns.8
index 4d108a48c..94b82a0cb 100644
--- a/sys-utils/lsns.8
+++ b/sys-utils/lsns.8
@@ -22,7 +22,7 @@ environments where a stable output is required.
\fBNSFS\fP column, printed when \fBnet\fP is specified for
\fB\-\-type\fR option, is specifal; it uses multi-line cells.
-\fB\-\-nowrap\fR is for switching to "," separated single-line
+Use the option \fB\-\-nowrap\fR is for switching to "," separated single-line
representation.
Note that \fBlsns\fR reads information directly from the /proc filesystem and
diff --git a/sys-utils/lsns.c b/sys-utils/lsns.c
index 19044fbfe..eea04c73c 100644
--- a/sys-utils/lsns.c
+++ b/sys-utils/lsns.c
@@ -102,8 +102,8 @@ static const struct colinfo infos[] = {
[COL_COMMAND] = { "COMMAND", 0, SCOLS_FL_TRUNC, N_("command line of the PID")},
[COL_UID] = { "UID", 0, SCOLS_FL_RIGHT, N_("UID of the PID")},
[COL_USER] = { "USER", 0, 0, N_("username of the PID")},
- [COL_NETNSID] = { "NETNSID", 0, SCOLS_FL_RIGHT, N_("Net namespace ID")},
- [COL_NSFS] = { "NSFS", 0, SCOLS_FL_WRAP, N_("Logical name established by nsfs")}
+ [COL_NETNSID] = { "NETNSID", 0, SCOLS_FL_RIGHT, N_("namespace ID as used by network subsystem")},
+ [COL_NSFS] = { "NSFS", 0, SCOLS_FL_WRAP, N_("nsfs mountpoint (usually used network subsystem)")}
};
static int columns[ARRAY_SIZE(infos) * 2];
@@ -221,6 +221,17 @@ static int column_name_to_id(const char *name, size_t namesz)
return -1;
}
+static int has_column(int id)
+{
+ size_t i;
+
+ for (i = 0; i < ncolumns; i++) {
+ if (columns[i] == id)
+ return 1;
+ }
+ return 0;
+}
+
static inline int get_column_id(int num)
{
assert(num >= 0);
@@ -936,7 +947,7 @@ int main(int argc, char *argv[])
{ 0 }
};
int excl_st[ARRAY_SIZE(excl)] = UL_EXCL_STATUS_INIT;
- int enabling_netnsid = 0;
+ int is_net = 0;
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
@@ -990,7 +1001,7 @@ int main(int argc, char *argv[])
ls.fltr_types[type] = 1;
ls.fltr_ntypes++;
if (type == LSNS_ID_NET)
- enabling_netnsid = 1;
+ is_net = 1;
break;
}
case 'W':
@@ -1028,27 +1039,17 @@ int main(int argc, char *argv[])
columns[ncolumns++] = COL_NPROCS;
columns[ncolumns++] = COL_PID;
columns[ncolumns++] = COL_USER;
- if (enabling_netnsid) {
+ if (is_net) {
columns[ncolumns++] = COL_NETNSID;
columns[ncolumns++] = COL_NSFS;
}
columns[ncolumns++] = COL_COMMAND;
}
- if (outarg) {
- size_t i;
-
- if (string_add_to_idarray(outarg, columns, ARRAY_SIZE(columns),
- &ncolumns, column_name_to_id) < 0)
- return EXIT_FAILURE;
+ if (outarg && string_add_to_idarray(outarg, columns, ARRAY_SIZE(columns),
+ &ncolumns, column_name_to_id) < 0)
+ return EXIT_FAILURE;
- for (i = 0; i < ncolumns; i++) {
- if (columns[i] == COL_NETNSID) {
- enabling_netnsid = 1;
- break;
- }
- }
- }
scols_init_debug(0);
uid_cache = new_idcache();
@@ -1056,12 +1057,14 @@ int main(int argc, char *argv[])
err(EXIT_FAILURE, _("failed to allocate UID cache"));
#ifdef HAVE_LINUX_NET_NAMESPACE_H
- if (enabling_netnsid)
+ if (has_column(COL_NETNSID))
netlink_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
#endif
- ls.tab = mnt_new_table_from_file(_PATH_PROC_MOUNTINFO);
- if (!ls.tab)
- err(MNT_EX_FAIL, _("failed to parse %s"), _PATH_PROC_MOUNTINFO);
+ if (has_column(COL_NSFS)) {
+ ls.tab = mnt_new_table_from_file(_PATH_PROC_MOUNTINFO);
+ if (!ls.tab)
+ err(MNT_EX_FAIL, _("failed to parse %s"), _PATH_PROC_MOUNTINFO);
+ }
r = read_processes(&ls);
if (!r)