- Update to 22.21
- Spec cleaning - Fixing bogus dates in the changelog
This commit is contained in:
parent
e80233be0e
commit
abd4e94cf4
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,3 +5,4 @@ psmisc-22.10.tar.gz
|
||||
/psmisc-22.16.tar.gz
|
||||
/psmisc-22.19.tar.gz
|
||||
/psmisc-22.20.tar.gz
|
||||
/psmisc-22.21.tar.gz
|
||||
|
@ -1,39 +0,0 @@
|
||||
diff -Naur psmisc-22.20.orig/doc/fuser.1 psmisc-22.20/doc/fuser.1
|
||||
--- psmisc-22.20.orig/doc/fuser.1 2012-09-19 12:54:03.000000000 +0200
|
||||
+++ psmisc-22.20/doc/fuser.1 2013-07-30 18:59:38.975335764 +0200
|
||||
@@ -170,8 +170,8 @@
|
||||
\fB\-\fISIGNAL\fR
|
||||
Use the specified signal instead of SIGKILL when killing processes.
|
||||
Signals can be specified either by name (e.g.
|
||||
-.BR \-HUP ) or by
|
||||
-number (e.g.
|
||||
+.BR \-HUP )
|
||||
+or by number (e.g.
|
||||
.BR \-1 ).
|
||||
This option is silently ignored if the
|
||||
.B \-k
|
||||
diff -Naur psmisc-22.20.orig/doc/peekfd.1 psmisc-22.20/doc/peekfd.1
|
||||
--- psmisc-22.20.orig/doc/peekfd.1 2012-09-19 12:54:03.000000000 +0200
|
||||
+++ psmisc-22.20/doc/peekfd.1 2013-07-30 19:10:32.582099617 +0200
|
||||
@@ -37,7 +37,7 @@
|
||||
.IP -d
|
||||
Remove duplicate read/writes from the output. If you're looking at a
|
||||
tty with echo, you might want this.
|
||||
-.IP -v
|
||||
+.IP -V
|
||||
Display a version string.
|
||||
.IP -h
|
||||
Display a help message.
|
||||
diff -Naur psmisc-22.20.orig/src/pstree.c psmisc-22.20/src/pstree.c
|
||||
--- psmisc-22.20.orig/src/pstree.c 2013-07-30 18:53:21.000000000 +0200
|
||||
+++ psmisc-22.20/src/pstree.c 2013-07-30 19:17:14.057288441 +0200
|
||||
@@ -860,7 +860,8 @@
|
||||
" -V, --version display version information\n"));
|
||||
#ifdef WITH_SELINUX
|
||||
fprintf(stderr,
|
||||
- _(" -Z show SELinux security contexts\n"));
|
||||
+ _(" -Z,\n"
|
||||
+ " --security-context show SELinux security contexts\n"));
|
||||
#endif /*WITH_SELINUX */
|
||||
fprintf(stderr, _(" PID start at this PID; default is 1 (init)\n"
|
||||
" USER show only trees rooted at processes of this user\n\n"));
|
@ -1,39 +0,0 @@
|
||||
--- psmisc-22.20/src/pstree.c 2012-09-19 14:05:43.000000000 +0100
|
||||
+++ psmisc-22.20-selinux/src/pstree.c 2012-10-08 19:18:13.992951873 +0100
|
||||
@@ -140,7 +140,12 @@
|
||||
static int dumped = 0; /* used by dump_by_user */
|
||||
static int charlen = 0; /* length of character */
|
||||
|
||||
+#ifdef WITH_SELINUX
|
||||
+static void fix_orphans(security_context_t scontext);
|
||||
+#else
|
||||
static void fix_orphans(void);
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Allocates additional buffer space for width and more as needed.
|
||||
* The first call will allocate the first buffer.
|
||||
@@ -787,7 +792,11 @@
|
||||
}
|
||||
}
|
||||
(void) closedir(dir);
|
||||
+#ifdef WITH_SELINUX
|
||||
+ fix_orphans(scontext);
|
||||
+#else
|
||||
fix_orphans();
|
||||
+#endif
|
||||
if (print_args)
|
||||
free(buffer);
|
||||
if (empty) {
|
||||
@@ -796,7 +805,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
+#ifdef WITH_SELINUX
|
||||
+static void fix_orphans(security_context_t scontext)
|
||||
+#else
|
||||
static void fix_orphans(void)
|
||||
+#endif
|
||||
{
|
||||
/* When using kernel 3.3 with hidepid feature enabled on /proc
|
||||
* then we need fake root pid and gather all the orphan processes
|
35
psmisc.spec
35
psmisc.spec
@ -1,7 +1,8 @@
|
||||
|
||||
Summary: Utilities for managing processes on your system
|
||||
Name: psmisc
|
||||
Version: 22.20
|
||||
Release: 4%{?dist}
|
||||
Version: 22.21
|
||||
Release: 1%{?dist}
|
||||
License: GPLv2+
|
||||
Group: Applications/System
|
||||
URL: http://sourceforge.net/projects/psmisc
|
||||
@ -11,14 +12,6 @@ Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
|
||||
#The following has been reworked by upstream in a different way ... we'll see
|
||||
#Patch1: psmisc-22.13-fuser-silent.patch
|
||||
|
||||
# Patch sent upstream 2012-10-08.
|
||||
Patch2: psmisc-22.20-fix-selinux-in-pstree.patch
|
||||
|
||||
Patch3: psmisc-22.20-RH-man-page-scan.patch
|
||||
|
||||
Patch4: pstree-introduce-support-for-namespaces.patch
|
||||
Patch5: pstree-introduce-namespace-transition-information.patch
|
||||
|
||||
BuildRequires: libselinux-devel
|
||||
BuildRequires: gettext
|
||||
BuildRequires: ncurses-devel
|
||||
@ -36,15 +29,12 @@ of processes that are using specified files or filesystems.
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
|
||||
%build
|
||||
%configure --prefix=%{_prefix} --enable-selinux
|
||||
make %{?_smp_mflags}
|
||||
|
||||
|
||||
%install
|
||||
make install DESTDIR="$RPM_BUILD_ROOT"
|
||||
|
||||
@ -53,6 +43,7 @@ mv $RPM_BUILD_ROOT%{_bindir}/fuser $RPM_BUILD_ROOT/sbin
|
||||
|
||||
%find_lang %name
|
||||
|
||||
|
||||
%files -f %{name}.lang
|
||||
/sbin/fuser
|
||||
%{_bindir}/killall
|
||||
@ -69,7 +60,13 @@ mv $RPM_BUILD_ROOT%{_bindir}/fuser $RPM_BUILD_ROOT/sbin
|
||||
%{_mandir}/man1/peekfd.1*
|
||||
%doc AUTHORS ChangeLog COPYING README
|
||||
|
||||
|
||||
%changelog
|
||||
* Thu Oct 10 2013 Jaromir Capik <jcapik@redhat.com> - 22.21-1
|
||||
- Update to 22.21
|
||||
- Spec cleaning
|
||||
- Fixing bogus dates in the changelog
|
||||
|
||||
* Tue Sep 17 2013 Aristeu Rozanski <aris@redhat.com> - 22.20-4
|
||||
- Introducing namespaces support (#1016259)
|
||||
|
||||
@ -129,7 +126,7 @@ mv $RPM_BUILD_ROOT%{_bindir}/fuser $RPM_BUILD_ROOT/sbin
|
||||
- peekfd should work on all architectures now
|
||||
- spec cleanups
|
||||
|
||||
* Mon May 25 2010 Jan Görig <jgorig@redhat.com> 22.10-1
|
||||
* Tue May 25 2010 Jan Görig <jgorig@redhat.com> 22.10-1
|
||||
- update to new upstream version
|
||||
- remove unused patches
|
||||
- docs are now in package
|
||||
@ -259,11 +256,11 @@ mv $RPM_BUILD_ROOT%{_bindir}/fuser $RPM_BUILD_ROOT/sbin
|
||||
* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com> 21.4-3
|
||||
- rebuilt
|
||||
|
||||
* Sun Mar 15 2004 Mike A. Harris <mharris@redhat.com> 21.4-2
|
||||
* Mon Mar 15 2004 Mike A. Harris <mharris@redhat.com> 21.4-2
|
||||
- Re-enabled SELINUX support
|
||||
- Removed gcc33 patch, no longer needed it seems.
|
||||
|
||||
* Sun Mar 15 2004 Mike A. Harris <mharris@redhat.com> 21.4-1
|
||||
* Mon Mar 15 2004 Mike A. Harris <mharris@redhat.com> 21.4-1
|
||||
- Updated to new upstream version 21.4
|
||||
- Ported SELinux patch forward as psmisc-21.4-redhat-selinux-psmisc.patch,
|
||||
but disabled SELINUX support temporarily until other build problems are
|
||||
@ -290,10 +287,10 @@ mv $RPM_BUILD_ROOT%{_bindir}/fuser $RPM_BUILD_ROOT/sbin
|
||||
* Thu Aug 28 2003 Dan Walsh <dwalsh@redhat.com> 21.3-5.sel
|
||||
- change flags to -Z and build for selinux
|
||||
|
||||
* Tue Jul 28 2003 Dan Walsh <dwalsh@redhat.com> 21.3-4
|
||||
* Mon Jul 28 2003 Dan Walsh <dwalsh@redhat.com> 21.3-4
|
||||
- Remove -lsecure check from configure.
|
||||
|
||||
* Tue Jul 28 2003 Dan Walsh <dwalsh@redhat.com> 21.3-2
|
||||
* Mon Jul 28 2003 Dan Walsh <dwalsh@redhat.com> 21.3-2
|
||||
- Added SELinux patches
|
||||
|
||||
* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
|
||||
|
@ -1,121 +0,0 @@
|
||||
From 29ac10530c97631d76aa34b2d2ed018ded60d6bf Mon Sep 17 00:00:00 2001
|
||||
From: Aristeu Rozanski <arozansk@redhat.com>
|
||||
Date: Thu, 25 Apr 2013 11:35:15 -0400
|
||||
Subject: [PATCH 2/3] pstree: introduce namespace transition information
|
||||
|
||||
This patch adds a new option (-S, --ns-change) that will show
|
||||
when a namespace was changed compared to parent's.
|
||||
|
||||
Signed-off-by: Aristeu Rozanski <arozansk@redhat.com>
|
||||
Signed-off-by: Craig Small <csmall@enc.com.au>
|
||||
---
|
||||
doc/pstree.1 | 4 ++++
|
||||
src/pstree.c | 27 ++++++++++++++++++++++++---
|
||||
2 files changed, 28 insertions(+), 3 deletions(-)
|
||||
|
||||
--- psmisc-22.20.orig/doc/pstree.1 2013-09-17 16:26:00.000000000 -0400
|
||||
+++ psmisc-22.20/doc/pstree.1 2013-09-17 16:27:22.510167111 -0400
|
||||
@@ -21,6 +21,7 @@ pstree \- display a tree of processes
|
||||
.RB [ \-N , \ \-\-ns\-sort \fIns\fB
|
||||
.RB [ \-p , \ \-\-show\-pids ]
|
||||
.RB [ \-s , \ \-\-show\-parents ]
|
||||
+.RB [ \-S , \ \-\-ns-changes ]
|
||||
.RB [ \-u , \ \-\-uid\-changes ]
|
||||
.RB [ \-Z , \ \-\-security\-context ]
|
||||
.RB [ \-A , \ \-\-ascii , \ \-G , \ \-\-vt100 , \ \-U , \ \-\-unicode ]
|
||||
@@ -134,6 +135,9 @@ process name.
|
||||
implicitly disables compaction.
|
||||
.IP \fB\-s\fP
|
||||
Show parent processes of the specified process.
|
||||
+.IP \fB\-S\fP
|
||||
+Show namespaces transitions. Like \-N, the output is limited when running
|
||||
+as a regular user.
|
||||
.IP \fB\-u\fP
|
||||
Show uid transitions. Whenever the uid of a process differs from the
|
||||
uid of its parent, the new uid is shown in parentheses after the
|
||||
--- psmisc-22.20.orig/src/pstree.c 2013-09-17 16:27:12.000000000 -0400
|
||||
+++ psmisc-22.20/src/pstree.c 2013-09-17 16:28:04.156698164 -0400
|
||||
@@ -133,7 +133,7 @@ static int *width = NULL;
|
||||
static int *more = NULL;
|
||||
|
||||
static int print_args = 0, compact = 1, user_change = 0, pids = 0, pgids = 0,
|
||||
- show_parents = 0, by_pid = 0, trunc = 1, wait_end = 0;
|
||||
+ show_parents = 0, by_pid = 0, trunc = 1, wait_end = 0, ns_change = 0;
|
||||
#ifdef WITH_SELINUX
|
||||
static int show_scontext = 0;
|
||||
#endif /*WITH_SELINUX */
|
||||
@@ -545,11 +545,17 @@ if (pid != 0) {
|
||||
static int tree_equal(const PROC * a, const PROC * b)
|
||||
{
|
||||
const CHILD *walk_a, *walk_b;
|
||||
+ int i;
|
||||
|
||||
if (strcmp(a->comm, b->comm))
|
||||
return 0;
|
||||
if (user_change && a->uid != b->uid)
|
||||
return 0;
|
||||
+ if (ns_change) {
|
||||
+ for (i = 0; i < NUM_NS; i++)
|
||||
+ if (a->ns[i] != b->ns[i])
|
||||
+ return 0;
|
||||
+ }
|
||||
for (walk_a = a->children, walk_b = b->children; walk_a && walk_b;
|
||||
walk_a = walk_a->next, walk_b = walk_b->next)
|
||||
if (!tree_equal(walk_a->child, walk_b->child))
|
||||
@@ -630,6 +636,16 @@ if (swapped && current->argc < 0)
|
||||
else
|
||||
(void) out_int(current->uid);
|
||||
}
|
||||
+ if (ns_change && current->parent) {
|
||||
+ for (i = 0; i < NUM_NS; i++) {
|
||||
+ if (current->ns[i] == 0 || current->parent->ns[i] == 0)
|
||||
+ continue;
|
||||
+ if (current->ns[i] != current->parent->ns[i]) {
|
||||
+ out_char(info++ ? ',' : '(');
|
||||
+ out_string(get_ns_name(i));
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
#ifdef WITH_SELINUX
|
||||
if (show_scontext) {
|
||||
out_char(info++ ? ',' : '(');
|
||||
@@ -1002,6 +1018,7 @@ " -G, --vt100 use
|
||||
" --ns-sort=type sort by namespace type (ipc, mnt, net, pid, user, uts)\n"
|
||||
" -p, --show-pids show PIDs; implies -c\n"
|
||||
" -s, --show-parents show parents of the selected process\n"
|
||||
+ " -S, --ns-changes show namespace transitions\n"
|
||||
" -u, --uid-changes show uid transitions\n"
|
||||
" -U, --unicode use UTF-8 (Unicode) line drawing characters\n"
|
||||
" -V, --version display version information\n"));
|
||||
@@ -1054,6 +1071,7 @@ {"numeric-sort", 0, NULL, 'n'},
|
||||
{"show-pids", 0, NULL, 'p'},
|
||||
{"show-pgids", 0, NULL, 'g'},
|
||||
{"show-parents", 0, NULL, 's'},
|
||||
+ {"ns-changes", 0, NULL, 'S' },
|
||||
{"uid-changes", 0, NULL, 'u'},
|
||||
{"unicode", 0, NULL, 'U'},
|
||||
{"version", 0, NULL, 'V'},
|
||||
@@ -1106,11 +1124,11 @@ /* problems with VT100 on some t
|
||||
|
||||
#ifdef WITH_SELINUX
|
||||
while ((c =
|
||||
- getopt_long(argc, argv, "aAcGhH:nN:pglsuUVZ", options,
|
||||
+ getopt_long(argc, argv, "aAcGhH:nN:pglsSuUVZ", options,
|
||||
NULL)) != -1)
|
||||
#else /*WITH_SELINUX */
|
||||
while ((c =
|
||||
- getopt_long(argc, argv, "aAcGhH:nN:pglsuUV", options, NULL)) != -1)
|
||||
+ getopt_long(argc, argv, "aAcGhH:nN:pglsSuUV", options, NULL)) != -1)
|
||||
#endif /*WITH_SELINUX */
|
||||
switch (c) {
|
||||
case 'a':
|
||||
@@ -1174,6 +1192,9 @@ compact = 0;
|
||||
case 's':
|
||||
show_parents = 1;
|
||||
break;
|
||||
+ case 'S':
|
||||
+ ns_change = 1;
|
||||
+ break;
|
||||
case 'u':
|
||||
user_change = 1;
|
||||
break;
|
@ -1,295 +0,0 @@
|
||||
From c9f6f3e60d1770a95eb491dd503fdbe881ee8740 Mon Sep 17 00:00:00 2001
|
||||
From: Aristeu Rozanski <arozansk@redhat.com>
|
||||
Date: Wed, 24 Apr 2013 15:32:35 -0400
|
||||
Subject: [PATCH 1/3] pstree: introduce support for namespaces
|
||||
|
||||
Options -N and --ns-sort were added which require one of the namespaces:
|
||||
ipc, mnt, net, pid, user, uts
|
||||
and will show separated trees per namespace
|
||||
|
||||
Signed-off-by: Aristeu Rozanski <arozansk@redhat.com>
|
||||
Signed-off-by: Craig Small <csmall@enc.com.au>
|
||||
---
|
||||
doc/pstree.1 | 6 ++
|
||||
src/pstree.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
2 files changed, 173 insertions(+), 3 deletions(-)
|
||||
|
||||
--- psmisc-22.20.orig/doc/pstree.1 2012-09-19 06:54:03.000000000 -0400
|
||||
+++ psmisc-22.20/doc/pstree.1 2013-09-17 16:26:00.210118465 -0400
|
||||
@@ -18,6 +18,7 @@ pstree \- display a tree of processes
|
||||
.RB [ \-g ] \ \-\-show\-pgids ]
|
||||
.RB [ \-l , \ \-\-long ]
|
||||
.RB [ \-n , \ \-\-numeric\-sort ]
|
||||
+.RB [ \-N , \ \-\-ns\-sort \fIns\fB
|
||||
.RB [ \-p , \ \-\-show\-pids ]
|
||||
.RB [ \-s , \ \-\-show\-parents ]
|
||||
.RB [ \-u , \ \-\-uid\-changes ]
|
||||
@@ -121,6 +122,11 @@ unknown.
|
||||
.IP \fB\-n\fP
|
||||
Sort processes with the same ancestor by PID instead of by name.
|
||||
(Numeric sort.)
|
||||
+.IP \fB\-N\fP
|
||||
+Show individual trees for each namespace of the type specified. The
|
||||
+available types are: ipc, mnt, net, pid, user, uts. Regular users don't
|
||||
+have access to other users' processes information, so the output will be
|
||||
+limited.
|
||||
.IP \fB\-p\fP
|
||||
Show PIDs. PIDs are shown as decimal numbers in parentheses after each
|
||||
process name.
|
||||
--- psmisc-22.20.orig/src/pstree.c 2013-09-17 16:25:01.000000000 -0400
|
||||
+++ psmisc-22.20/src/pstree.c 2013-09-17 16:27:12.356037690 -0400
|
||||
@@ -74,6 +74,8 @@ #define VT_END "\033(B" /*
|
||||
#define VT_UR "m"
|
||||
#define VT_HD "w"
|
||||
|
||||
+#define NUM_NS 6
|
||||
+
|
||||
typedef struct _proc {
|
||||
char comm[COMM_LEN + 2 + 1]; /* add another 2 for thread brackets */
|
||||
char **argv; /* only used : argv[0] is 1st arg; undef if argc < 1 */
|
||||
@@ -84,6 +86,7 @@ char **argv; /* only
|
||||
#ifdef WITH_SELINUX
|
||||
security_context_t scontext;
|
||||
#endif /*WITH_SELINUX */
|
||||
+ ino_t ns[NUM_NS];
|
||||
char flags;
|
||||
struct _child *children;
|
||||
struct _proc *parent;
|
||||
@@ -140,6 +143,133 @@ static char last_char = 0;
|
||||
static int dumped = 0; /* used by dump_by_user */
|
||||
static int charlen = 0; /* length of character */
|
||||
|
||||
+enum ns_type {
|
||||
+ IPCNS = 0,
|
||||
+ MNTNS,
|
||||
+ NETNS,
|
||||
+ PIDNS,
|
||||
+ USERNS,
|
||||
+ UTSNS
|
||||
+};
|
||||
+struct ns_entry;
|
||||
+struct ns_entry {
|
||||
+ ino_t number;
|
||||
+ CHILD *children;
|
||||
+ struct ns_entry *next;
|
||||
+};
|
||||
+
|
||||
+static const char *ns_names[] = {
|
||||
+ [IPCNS] = "ipc",
|
||||
+ [MNTNS] = "mnt",
|
||||
+ [NETNS] = "net",
|
||||
+ [PIDNS] = "pid",
|
||||
+ [USERNS] = "user",
|
||||
+ [UTSNS] = "uts",
|
||||
+};
|
||||
+
|
||||
+const char *get_ns_name(int id) {
|
||||
+ if (id >= NUM_NS)
|
||||
+ return NULL;
|
||||
+ return ns_names[id];
|
||||
+}
|
||||
+
|
||||
+static int get_ns_id(const char *name) {
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < NUM_NS; i++)
|
||||
+ if (!strcmp(ns_names[i], name))
|
||||
+ return i;
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+static int verify_ns(int id)
|
||||
+{
|
||||
+ char filename[50];
|
||||
+ struct stat s;
|
||||
+
|
||||
+ snprintf(filename, 50, "/proc/%i/ns/%s", getpid(), get_ns_name(id));
|
||||
+
|
||||
+ return stat(filename, &s);
|
||||
+}
|
||||
+
|
||||
+static inline void new_proc_ns(PROC *ns_task)
|
||||
+{
|
||||
+ struct stat st;
|
||||
+ char buff[50];
|
||||
+ pid_t pid = ns_task->pid;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < NUM_NS; i++) {
|
||||
+ snprintf(buff, sizeof(buff), "/proc/%i/ns/%s", pid,
|
||||
+ get_ns_name(i));
|
||||
+ if (stat(buff, &st)) {
|
||||
+ ns_task->ns[i] = 0;
|
||||
+ continue;
|
||||
+ }
|
||||
+ ns_task->ns[i] = st.st_ino;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void find_ns_and_add(struct ns_entry **root, PROC *r, enum ns_type id)
|
||||
+{
|
||||
+ struct ns_entry *ptr, *last = NULL;
|
||||
+ CHILD **c;
|
||||
+
|
||||
+ for (ptr = *root; ptr; ptr = ptr->next) {
|
||||
+ if (ptr->number == r->ns[id])
|
||||
+ break;
|
||||
+ last = ptr;
|
||||
+ }
|
||||
+
|
||||
+ if (!ptr) {
|
||||
+ ptr = malloc(sizeof(*ptr));
|
||||
+ memset(ptr, 0, sizeof(*ptr));
|
||||
+ ptr->number = r->ns[id];
|
||||
+ if (*root == NULL)
|
||||
+ *root = ptr;
|
||||
+ else
|
||||
+ last->next = ptr;
|
||||
+ }
|
||||
+
|
||||
+ /* move the child to under the namespace's umbrella */
|
||||
+ for (c = &ptr->children; *c; c = &(*c)->next)
|
||||
+ ;
|
||||
+ *c = malloc(sizeof(CHILD));
|
||||
+ (*c)->child = r;
|
||||
+ (*c)->next = NULL;
|
||||
+
|
||||
+ /* detaching from parent */
|
||||
+ if (r->parent) {
|
||||
+ for (c = &r->parent->children; *c; c = &(*c)->next) {
|
||||
+ if ((*c)->child == r) {
|
||||
+ *c = (*c)->next;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ r->parent = NULL;
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static PROC *find_proc(pid_t pid);
|
||||
+static void sort_by_namespace(PROC *r, enum ns_type id, struct ns_entry **root)
|
||||
+{
|
||||
+ CHILD *walk;
|
||||
+
|
||||
+ /* first run, find the first process */
|
||||
+ if (!r) {
|
||||
+ r = find_proc(1);
|
||||
+ if (!r)
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (r->parent == NULL || r->parent->ns[id] != r->ns[id])
|
||||
+ find_ns_and_add(root, r, id);
|
||||
+
|
||||
+ for (walk = r->children; walk; walk = walk->next)
|
||||
+ sort_by_namespace(walk->child, id, root);
|
||||
+}
|
||||
+
|
||||
#ifdef WITH_SELINUX
|
||||
static void fix_orphans(security_context_t scontext);
|
||||
#else
|
||||
@@ -290,6 +420,7 @@ new->argc = 0;
|
||||
new->children = NULL;
|
||||
new->parent = NULL;
|
||||
new->next = list;
|
||||
+ new_proc_ns(new);
|
||||
return list = new;
|
||||
}
|
||||
|
||||
@@ -624,6 +755,20 @@ dump_tree(current, 0, 1, 1, 1, u
|
||||
dump_by_user(walk->child, uid);
|
||||
}
|
||||
|
||||
+static void dump_by_namespace(struct ns_entry *root)
|
||||
+{
|
||||
+ struct ns_entry *ptr = root;
|
||||
+ CHILD *c;
|
||||
+ char buff[14];
|
||||
+
|
||||
+ for ( ; ptr; ptr = ptr->next) {
|
||||
+ snprintf(buff, sizeof(buff), "[%li]\n", ptr->number);
|
||||
+ out_string(buff);
|
||||
+ for (c = ptr->children; c; c = c->next)
|
||||
+ dump_tree(c->child, 0, 1, 1, 1, 0, 0);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void trim_tree_by_parent(PROC * current)
|
||||
{
|
||||
if (!current)
|
||||
@@ -853,6 +998,8 @@ static void usage(void)
|
||||
" -G, --vt100 use VT100 line drawing characters\n"
|
||||
" -l, --long don't truncate long lines\n"
|
||||
" -n, --numeric-sort sort output by PID\n"
|
||||
+ " -N type,\n"
|
||||
+ " --ns-sort=type sort by namespace type (ipc, mnt, net, pid, user, uts)\n"
|
||||
" -p, --show-pids show PIDs; implies -c\n"
|
||||
" -s, --show-parents show parents of the selected process\n"
|
||||
" -u, --uid-changes show uid transitions\n"
|
||||
@@ -886,11 +1033,13 @@ int main(int argc, char **argv)
|
||||
{
|
||||
PROC *current;
|
||||
struct winsize winsz;
|
||||
+ struct ns_entry *nsroot = NULL;
|
||||
const struct passwd *pw;
|
||||
pid_t pid, highlight;
|
||||
char termcap_area[1024];
|
||||
char *termname, *endptr;
|
||||
int c, pid_set;
|
||||
+ enum ns_type nsid = -1;
|
||||
|
||||
struct option options[] = {
|
||||
{"arguments", 0, NULL, 'a'},
|
||||
@@ -901,6 +1050,7 @@ {"highlight-all", 0, NULL, 'h'},
|
||||
{"highlight-pid", 1, NULL, 'H'},
|
||||
{"long", 0, NULL, 'l'},
|
||||
{"numeric-sort", 0, NULL, 'n'},
|
||||
+ {"ns-sort", 1, NULL, 'N' },
|
||||
{"show-pids", 0, NULL, 'p'},
|
||||
{"show-pgids", 0, NULL, 'g'},
|
||||
{"show-parents", 0, NULL, 's'},
|
||||
@@ -956,11 +1106,11 @@ /* problems with VT100 on some t
|
||||
|
||||
#ifdef WITH_SELINUX
|
||||
while ((c =
|
||||
- getopt_long(argc, argv, "aAcGhH:npglsuUVZ", options,
|
||||
+ getopt_long(argc, argv, "aAcGhH:nN:pglsuUVZ", options,
|
||||
NULL)) != -1)
|
||||
#else /*WITH_SELINUX */
|
||||
while ((c =
|
||||
- getopt_long(argc, argv, "aAcGhH:npglsuUV", options, NULL)) != -1)
|
||||
+ getopt_long(argc, argv, "aAcGhH:nN:pglsuUV", options, NULL)) != -1)
|
||||
#endif /*WITH_SELINUX */
|
||||
switch (c) {
|
||||
case 'a':
|
||||
@@ -1002,6 +1152,17 @@ trunc = 0;
|
||||
case 'n':
|
||||
by_pid = 1;
|
||||
break;
|
||||
+ case 'N':
|
||||
+ nsid = get_ns_id(optarg);
|
||||
+ if (nsid == -1)
|
||||
+ usage();
|
||||
+ if (verify_ns(nsid)) {
|
||||
+ fprintf(stderr,
|
||||
+ _("procfs file for %s namespace not available\n"),
|
||||
+ optarg);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ break;
|
||||
case 'p':
|
||||
pids = 1;
|
||||
compact = 0;
|
||||
@@ -1059,7 +1220,10 @@ if (endptr[0] != '\0')
|
||||
pid = ROOT_PID;
|
||||
}
|
||||
|
||||
- if (!pw)
|
||||
+ if (nsid != -1) {
|
||||
+ sort_by_namespace(NULL, nsid, &nsroot);
|
||||
+ dump_by_namespace(nsroot);
|
||||
+ } else if (!pw)
|
||||
dump_tree(find_proc(pid), 0, 1, 1, 1, 0, 0);
|
||||
else {
|
||||
dump_by_user(find_proc(ROOT_PID), pw->pw_uid);
|
Loading…
Reference in New Issue
Block a user