64 lines
1.3 KiB
C
64 lines
1.3 KiB
C
// SPDX-FileCopyrightText: 2010 pancake <pancake@nopcode.org>
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
|
|
#include <stdio.h>
|
|
|
|
int pids_cmdline(int pid, char *cmdline) {
|
|
int fd;
|
|
sprintf(cmdline, "/proc/%d/cmdline", pid);
|
|
fd = open(cmdline, O_RDONLY);
|
|
cmdline[0] = '\0';
|
|
if (fd != -1) {
|
|
rz_xread(fd, cmdline, 1024);
|
|
cmdline[1024] = '\0';
|
|
close(fd);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// XXX
|
|
int pids_sons_of_r(int pid, int recursive, int limit) {
|
|
int p, mola, tmp, n = 0;
|
|
FILE *fd;
|
|
char tmp3[8];
|
|
char buf[128];
|
|
char tmp2[1024];
|
|
struct dirent *file;
|
|
DIR *dh;
|
|
|
|
if (pid < 1)
|
|
return false;
|
|
dh = opendir("/proc/");
|
|
if (!dh) {
|
|
return false;
|
|
}
|
|
|
|
while ((file = (struct dirent *)readdir(dh))) {
|
|
p = atoi(file->d_name);
|
|
if (p) {
|
|
sprintf(buf, "/proc/%s/stat", file->d_name);
|
|
fd = fopen(buf, "r");
|
|
if (fd) {
|
|
mola = 0;
|
|
fscanf(fd, "%d %s %s %d",
|
|
&tmp, tmp2, tmp3, &mola);
|
|
if (mola == pid) {
|
|
pids_cmdline(p, tmp2);
|
|
// for(i=0; i<recursive*2;i++)
|
|
// printf(" ");
|
|
cons_printf(" `- %d : %s (%s)\n",
|
|
p, tmp2, (tmp3[0] == 'S') ? "sleeping" : (tmp3[0] == 'T') ? "stopped"
|
|
: "running");
|
|
n++;
|
|
if (recursive < limit) {
|
|
n += pids_sons_of_r(p, recursive + 1, limit);
|
|
}
|
|
}
|
|
}
|
|
fclose(fd);
|
|
}
|
|
}
|
|
closedir(dh);
|
|
return n;
|
|
}
|