- if (!isdigit(*entry->d_name))
- continue;
- sprintf(path, "/proc/%s/status", entry->d_name);
- if ((file2str(path, sbuf, sizeof sbuf)) != -1) {
- parse_proc_status(sbuf, &p);
- }
-
- /* Make some adjustments as needed */
- my_getpwuid(uidName, p.ruid);
- if (*uidName == '\0')
- sprintf(uidName, "%d", p.ruid);
- my_getgrgid(groupName, p.rgid);
- if (*groupName == '\0')
- sprintf(groupName, "%d", p.rgid);
-
- len = fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName,
- p.state);
- sprintf(path, "/proc/%s/cmdline", entry->d_name);
- file = fopen(path, "r");
- if (file == NULL)
- fatalError("Can't open %s: %s\n", path, strerror(errno));
- i = 0;
- while (((c = getc(file)) != EOF) && (i < (terminal_width-len))) {
- i++;
- if (c == '\0')
- c = ' ';
- putc(c, stdout);
- }
- if (i == 0)
- fprintf(stdout, "[%s]", p.cmd);
- fprintf(stdout, "\n");
- }
- closedir(dir);
- exit(TRUE);
-}
-
-
-#else /* BB_FEATURE_USE_DEVPS_PATCH */
-
-
-/* The following is the second ps implementation --
- * this one uses the nifty new devps kernel device.
- */
-
-#include <linux/devps.h>
-
-
-extern int ps_main(int argc, char **argv)
-{
- char device[] = "/dev/ps";
- int i, j, len, fd;
- pid_t num_pids;
- pid_t* pid_array = NULL;
- struct pid_info info;
- char uidName[10] = "";
- char groupName[10] = "";
-#ifdef BB_FEATURE_AUTOWIDTH
- struct winsize win = { 0, 0 };
- int terminal_width = 0;
-#else
-#define terminal_width 79
-#endif
-
- if (argc > 1 && **(argv + 1) == '-')
- usage("ps-devps\n\nReport process status\n\nThis version of ps accepts no options.\n\n");
-
- /* open device */
- fd = open(device, O_RDONLY);
- if (fd < 0)
- fatalError( "open failed for `%s': %s\n", device, strerror (errno));
-
- /* Find out how many processes there are */
- if (ioctl (fd, DEVPS_GET_NUM_PIDS, &num_pids)<0)
- fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno));
-
- /* Allocate some memory -- grab a few extras just in case
- * some new processes start up while we wait. The kernel will
- * just ignore any extras if we give it too many, and will trunc.
- * the list if we give it too few. */
- pid_array = (pid_t*) calloc( num_pids+10, sizeof(pid_t));
- pid_array[0] = num_pids+10;
-
- /* Now grab the pid list */
- if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0)
- fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno));
-
-#ifdef BB_FEATURE_AUTOWIDTH
- ioctl(fileno(stdout), TIOCGWINSZ, &win);
- if (win.ws_col > 0)
- terminal_width = win.ws_col - 1;