- if (i == 0)
- fprintf(stdout, "%s", p.cmd);
- fprintf(stdout, "\n");
- }
- closedir(dir);
- exit(TRUE);
-}
-
-
-#else /* BB_FEATURE_USE_DEVPS_N_DEVMTAB */
-
-
-/* The following is the second ps implementation --
- * this one uses the nifty new devps kernel device.
- */
-
-#include <sys/ioctl.h>
-#include <linux/devps.h>
-
-
-extern int ps_main(int argc, char **argv)
-{
- char device[] = "/dev/ps";
- int i, fd;
- pid_t num_pids;
- pid_t* pid_array = NULL;
- struct pid_info info;
- char uidName[10] = "";
- char groupName[10] = "";
-
- 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));
-
- /* Print up a ps listing */
- fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
- "State", "Command");
-
- for (i=1; i<pid_array[0] ; i++) {
- uidName[0] = '\0';
- groupName[0] = '\0';
- info.pid = pid_array[i];
-
- if (ioctl (fd, DEVPS_GET_PID_INFO, &info)<0)
- fatalError("\nDEVPS_GET_PID_INFO: %s\n", strerror (errno));
-
- /* Make some adjustments as needed */
- my_getpwuid(uidName, info.euid);
- if (*uidName == '\0')
- sprintf(uidName, "%ld", info.euid);
- my_getgrgid(groupName, info.egid);
- if (*groupName == '\0')
- sprintf(groupName, "%ld", info.egid);
-
- fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state);
-
- if (strlen(info.command_line) > 1)
- fprintf(stdout, "%s\n", info.command_line);
- else
- fprintf(stdout, "[%s]\n", info.name);
-