aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dirtree.c1
-rw-r--r--lib/lib.h2
-rw-r--r--toys/posix/ps.c13
3 files changed, 9 insertions, 7 deletions
diff --git a/lib/dirtree.c b/lib/dirtree.c
index 07c1cdc7..f9524a5d 100644
--- a/lib/dirtree.c
+++ b/lib/dirtree.c
@@ -151,6 +151,7 @@ int dirtree_recurse(struct dirtree *node,
// The extra parentheses are to shut the stupid compiler up.
while ((entry = readdir(dir))) {
+ if ((flags&DIRTREE_PROC) && !isdigit(*entry->d_name)) continue;
if (!(new = dirtree_add_node(node, entry->d_name, flags))) continue;
new = dirtree_handle_callback(new, callback);
if (new == DIRTREE_ABORTVAL) break;
diff --git a/lib/lib.h b/lib/lib.h
index 61a1975f..d5a48326 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -73,6 +73,8 @@ void get_optflags(void);
#define DIRTREE_SHUTUP 16
// Breadth first traversal, conserves filehandles at the expense of memory
#define DIRTREE_BREADTH 32
+// skip non-numeric entries
+#define DIRTREE_PROC 64
// Don't look at any more files in this directory.
#define DIRTREE_ABORT 256
diff --git a/toys/posix/ps.c b/toys/posix/ps.c
index 77d777bd..3a3b8c11 100644
--- a/toys/posix/ps.c
+++ b/toys/posix/ps.c
@@ -620,7 +620,7 @@ static int get_ps(struct dirtree *new)
|(DIRTREE_SAVE*(TT.threadparent||!TT.show_process));
memset(slot, 0, sizeof(tb->slot));
- if (!(tb->slot[SLOT_tid] = *slot = atol(new->name))) return 0;
+ tb->slot[SLOT_tid] = *slot = atol(new->name);
if (TT.threadparent && TT.threadparent->extra)
if (*slot == *(((struct carveup *)TT.threadparent->extra)->slot)) return 0;
fd = dirtree_parentfd(new);
@@ -870,8 +870,7 @@ static int get_threads(struct dirtree *new)
unsigned pid, kcount;
if (!new->parent) return get_ps(new);
-
- if (!(pid = atol(new->name))) return 0;
+ pid = atol(new->name);
TT.threadparent = new;
if (!get_ps(new)) {
@@ -884,7 +883,7 @@ static int get_threads(struct dirtree *new)
// Disable show_process at least until we can calculate tcount
kcount = TT.kcount;
sprintf(toybuf, "/proc/%u/task", pid);
- new->child = dirtree_flagread(toybuf, DIRTREE_SHUTUP, get_ps);
+ new->child = dirtree_flagread(toybuf, DIRTREE_SHUTUP|DIRTREE_PROC, get_ps);
TT.threadparent = 0;
kcount = TT.kcount-kcount+1;
tb = (void *)new->extra;
@@ -1218,7 +1217,7 @@ void ps_main(void)
if (!(toys.optflags&FLAG_M)) printf("%.*s\n", TT.width, toybuf);
if (!(toys.optflags&(FLAG_k|FLAG_M))) TT.show_process = show_ps;
TT.match_process = ps_match_process;
- dt = dirtree_read("/proc",
+ dt = dirtree_flagread("/proc", DIRTREE_SHUTUP|DIRTREE_PROC,
((toys.optflags&FLAG_T) || (TT.bits&(_PS_TID|_PS_TCNT)))
? get_threads : get_ps);
@@ -1348,7 +1347,7 @@ static void top_common(
plold = plist+(tock++&1);
plnew = plist+(tock&1);
plnew->whence = millitime();
- dt = dirtree_read("/proc",
+ dt = dirtree_flagread("/proc", DIRTREE_SHUTUP|DIRTREE_PROC,
((toys.optflags&FLAG_H) || (TT.bits&(_PS_TID|_PS_TCNT)))
? get_threads : get_ps);
plnew->tb = collate(plnew->count = TT.kcount, dt);
@@ -1751,7 +1750,7 @@ void pgrep_main(void)
// pgrep should return failure if there are no matches.
toys.exitval = 1;
- dirtree_read("/proc", get_ps);
+ dirtree_flagread("/proc", DIRTREE_SHUTUP|DIRTREE_PROC, get_ps);
if (toys.optflags&FLAG_c) printf("%d\n", TT.sortpos);
if (TT.pgrep.snapshot) {
do_pgk(TT.pgrep.snapshot);