]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsns: unify the code and option for printing process based tree and namespace based...
authorMasatake YAMATO <yamato@redhat.com>
Tue, 20 Apr 2021 08:09:02 +0000 (17:09 +0900)
committerKarel Zak <kzak@redhat.com>
Mon, 24 May 2021 11:39:53 +0000 (13:39 +0200)
Suggested by Karel Zak.

`--tree` option is introduced as replacement for `--nstree`.
In addition to `parent` and `owner`, `--tree` take `process` as the
option argument.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
sys-utils/lsns.8.adoc
sys-utils/lsns.c

index 77875223bd78731be211499e19d0be89936327c3..6bfbdb644c912c572d66785a271396b7b4caa930 100644 (file)
@@ -64,10 +64,13 @@ Do not truncate text in columns.
 Do not use multi-line text in columns.
 
 *-T*, *--nstree* _rel_::
-Print namespace tree(s).
-If *parent* is given as _rel_, print tree(s) constructed by the parent/child relationship.
+Use list output format.
+If *process* is gnve as _rel_, print proecss tree(s) in each name space.
+If *parent* is given, print tree(s) constructed by the parent/child relationship.
 If *owner* is given, print tree(s) constructed by the owner/owned relationship.
-The result can be forests because *lsns* cannot track a namespace having no process.
+*owner* is used as default when _rel_ is omitted.
+The result of *parent* and *owner* can be forests because *lsns* cannot track a namespace having no process.
+
 
 *-V*, *--version*::
 Display version information and exit.
index 23a2eabacc00dd7e262d41e24439555f9ca548c9..a143509cd10ba0426efd1cab02e4a704ee067985 100644 (file)
@@ -181,9 +181,12 @@ struct lsns_process {
        int netnsid;
 };
 
+
 enum {
-      LSNS_NSTREE_OWNER  = 1,
-      LSNS_NSTREE_PARENT,
+      LSNS_TREE_LIST,
+      LSNS_TREE_PROCESS,
+      LSNS_TREE_OWNER,
+      LSNS_TREE_PARENT,
 };
 
 struct lsns {
@@ -197,12 +200,11 @@ struct lsns {
 
        unsigned int raw        : 1,
                     json       : 1,
-                    tree       : 1,
+                    tree       : 2,
                     list       : 1,
                     no_trunc   : 1,
                     no_headings: 1,
-                    no_wrap    : 1,
-                    nstree     : 2;
+                    no_wrap    : 1;
 
 
        struct libmnt_table *tab;
@@ -695,7 +697,7 @@ static int read_namespaces(struct lsns *ls)
                }
        }
 
-       if (ls->nstree) {
+       if (ls->tree == LSNS_TREE_OWNER || ls->tree == LSNS_TREE_PARENT) {
                list_for_each(p, &ls->namespaces) {
                        struct lsns_namespace *ns = list_entry(p, struct lsns_namespace, namespaces);
                        struct list_head *pp;
@@ -809,9 +811,9 @@ static void add_scols_line(struct lsns *ls, struct libscols_table *table,
        assert(table);
 
        line = scols_table_new_line(table,
-                       ls->tree && proc->parent ? proc->parent->outline:
-                       ls->nstree == LSNS_NSTREE_PARENT && ns->parentns ? ns->parentns->ns_outline:
-                       ls->nstree == LSNS_NSTREE_OWNER  && ns->ownerns  ? ns->ownerns->ns_outline:
+                       (ls->tree == LSNS_TREE_PROCESS) && proc->parent ? proc->parent->outline:
+                       (ls->tree == LSNS_TREE_PARENT)  && ns->parentns ? ns->parentns->ns_outline:
+                       (ls->tree == LSNS_TREE_OWNER)   && ns->ownerns  ? ns->ownerns->ns_outline:
                        NULL);
        if (!line) {
                warn(_("failed to add line to output"));
@@ -872,7 +874,7 @@ static void add_scols_line(struct lsns *ls, struct libscols_table *table,
                        err_oom();
        }
 
-       if (ls->nstree)
+       if (ls->tree == LSNS_TREE_OWNER || ls->tree == LSNS_TREE_PARENT)
                ns->ns_outline = line;
        else
                proc->outline = line;
@@ -903,11 +905,12 @@ static struct libscols_table *init_scols_table(struct lsns *ls)
 
                if (ls->no_trunc)
                       flags &= ~SCOLS_FL_TRUNC;
-               if (ls->tree && get_column_id(i) == COL_COMMAND)
+               if (ls->tree == LSNS_TREE_PROCESS && get_column_id(i) == COL_COMMAND)
                        flags |= SCOLS_FL_TREE;
                if (ls->no_wrap)
                        flags &= ~SCOLS_FL_WRAP;
-               if (ls->nstree && get_column_id(i) == COL_NS) {
+               if ((ls->tree == LSNS_TREE_OWNER || ls->tree == LSNS_TREE_PARENT)
+                   && get_column_id(i) == COL_NS) {
                        flags |= SCOLS_FL_TREE;
                        flags &= ~SCOLS_FL_RIGHT;
                }
@@ -941,11 +944,11 @@ static void show_namespace(struct lsns *ls, struct libscols_table *tab,
        /*
         * create a tree from owner->owned and/or parent->child relation
         */
-       if (ls->nstree == LSNS_NSTREE_OWNER
+       if (ls->tree == LSNS_TREE_OWNER
            && ns->ownerns
            && !ns->ownerns->ns_outline)
                show_namespace(ls, tab, ns->ownerns, proc);
-       else if (ls->nstree == LSNS_NSTREE_PARENT) {
+       else if (ls->tree == LSNS_TREE_PARENT) {
                if (ns->parentns) {
                        if (!ns->parentns->ns_outline)
                                show_namespace(ls, tab, ns->parentns, proc);
@@ -989,7 +992,7 @@ static void show_process(struct lsns *ls, struct libscols_table *tab,
         * create a tree from parent->child relation, but only if the parent is
         * within the same namespace
         */
-       if (ls->tree
+       if (ls->tree == LSNS_TREE_PROCESS
            && proc->parent
            && !proc->parent->outline
            && proc->parent->ns_ids[ns->type] == proc->ns_ids[ns->type])
@@ -1045,7 +1048,7 @@ static void __attribute__((__noreturn__)) usage(void)
        fputs(_(" -u, --notruncate       don't truncate text in columns\n"), out);
        fputs(_(" -W, --nowrap           don't use multi-line representation\n"), out);
        fputs(_(" -t, --type <name>      namespace type (mnt, net, ipc, user, pid, uts, cgroup, time)\n"), out);
-       fputs(_(" -T, --nstree <rel>     print namespace tree based on the relationship (parent or owner)\n"), out);
+       fputs(_(" -T, --tree <rel>       use tree format (parent, owner, or process)\n"), out);
 
        fputs(USAGE_SEPARATOR, out);
        printf(USAGE_HELP_OPTIONS(24));
@@ -1082,7 +1085,7 @@ int main(int argc, char *argv[])
                { "list",       no_argument,       NULL, 'l' },
                { "raw",        no_argument,       NULL, 'r' },
                { "type",       required_argument, NULL, 't' },
-               { "nstree",     optional_argument, NULL, 'T' },
+               { "tree",       optional_argument, NULL, 'T' },
                { NULL, 0, NULL, 0 }
        };
 
@@ -1151,10 +1154,14 @@ int main(int argc, char *argv[])
                        ls.no_wrap = 1;
                        break;
                case 'T':
-                       ls.nstree = LSNS_NSTREE_OWNER;
+                       ls.tree = LSNS_TREE_OWNER;
                        if (optarg) {
+                               if (*optarg == '=')
+                                       optarg++;
                                if (strcmp (optarg, "parent") == 0)
-                                       ls.nstree = LSNS_NSTREE_PARENT;
+                                       ls.tree = LSNS_TREE_PARENT;
+                               else if (strcmp (optarg, "process") == 0)
+                                       ls.tree = LSNS_TREE_PROCESS;
                                else if (strcmp (optarg, "owner") != 0)
                                        errx(EXIT_FAILURE, _("unknown nstree type: %s"), optarg);
                        }
@@ -1180,7 +1187,7 @@ int main(int argc, char *argv[])
                if (ls.fltr_pid)
                        errx(EXIT_FAILURE, _("--task is mutually exclusive with <namespace>"));
                ls.fltr_ns = strtou64_or_err(argv[optind], _("invalid namespace argument"));
-               ls.tree = ls.list ? 0 : 1;
+               ls.tree = ls.list ? LSNS_TREE_LIST : LSNS_TREE_PROCESS;
 
                if (!ncolumns) {
                        columns[ncolumns++] = COL_PID;