Fix bugs related to finding PIDs.
authorErik Andersen <andersen@codepoet.org>
Tue, 7 Mar 2000 23:32:17 +0000 (23:32 -0000)
committerErik Andersen <andersen@codepoet.org>
Tue, 7 Mar 2000 23:32:17 +0000 (23:32 -0000)
 -Erik

14 files changed:
Changelog
halt.c
init.c
init/halt.c
init/init.c
init/poweroff.c
init/reboot.c
lsmod.c
modutils/lsmod.c
poweroff.c
procps/ps.c
ps.c
reboot.c
utility.c

index fd560a82a5c1ada9c65ee8271bc1f2f77580a6ee..ebc69bd37898cffc5fa1db5673bd02202f5475ac 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -1,4 +1,9 @@
 0.43
+       * Busybox can now work perfectly when /proc is disabled, thereby 
+           saving a bunch of memory (kernel /proc support is not thin).
+           This is done by making use of some nice kernel patches I 
+           wrote up to support the features that busybox requires and
+           that /proc usually provides.
        * Wrote basename, killall, and uptime.
        * Added freeramdisk, which will free up all memory associated
            with a ram disk.  Contributed by Emanuele Caratti <wiz@iol.it>
@@ -36,7 +41,8 @@
        * An initial telnet implementation was added by 
            Randolph Chung <tausq@debian.org>.
        * Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e")
-           would go into an infinite loop.
+       * ps now supports BB_FEATURE_AUTOWIDTH, and can adjust its width
+           to match the terminal (defaults to width=79 when this is off).
 
 
        -Erik Andersen
diff --git a/halt.c b/halt.c
index f2c9828d44829e4a1254711dd3a63bb45ab37cad..81d24cf2de7ffc631b85bae6767a7650117a0172 100644 (file)
--- a/halt.c
+++ b/halt.c
 
 extern int halt_main(int argc, char **argv)
 {
+#ifdef BB_FEATURE_LINUXRC
        /* don't assume init's pid == 1 */
        exit(kill(findPidByName("init"), SIGUSR1));
+#else
+       exit(kill(1, SIGUSR1));
+#endif
 }
diff --git a/init.c b/init.c
index 8e28f076fd2ba41e4bae0e46fa193fcf12544101..c6052f8cfaf8c5ad905f6dcd39486909bb69697b 100644 (file)
--- a/init.c
+++ b/init.c
@@ -336,10 +336,6 @@ static pid_t run(char *command, char *terminal, int get_enter)
 
 
        if ((pid = fork()) == 0) {
-#ifdef DEBUG_INIT
-               pid_t shell_pgid = getpid();
-#endif
-
                /* Clean up */
                close(0);
                close(1);
@@ -373,8 +369,8 @@ static pid_t run(char *command, char *terminal, int get_enter)
                         * specifies.
                         */
                        char c;
-
 #ifdef DEBUG_INIT
+                       pid_t shell_pgid = getpid();
                        message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
                                        command, shell_pgid, terminal);
 #endif
index f2c9828d44829e4a1254711dd3a63bb45ab37cad..81d24cf2de7ffc631b85bae6767a7650117a0172 100644 (file)
 
 extern int halt_main(int argc, char **argv)
 {
+#ifdef BB_FEATURE_LINUXRC
        /* don't assume init's pid == 1 */
        exit(kill(findPidByName("init"), SIGUSR1));
+#else
+       exit(kill(1, SIGUSR1));
+#endif
 }
index 8e28f076fd2ba41e4bae0e46fa193fcf12544101..c6052f8cfaf8c5ad905f6dcd39486909bb69697b 100644 (file)
@@ -336,10 +336,6 @@ static pid_t run(char *command, char *terminal, int get_enter)
 
 
        if ((pid = fork()) == 0) {
-#ifdef DEBUG_INIT
-               pid_t shell_pgid = getpid();
-#endif
-
                /* Clean up */
                close(0);
                close(1);
@@ -373,8 +369,8 @@ static pid_t run(char *command, char *terminal, int get_enter)
                         * specifies.
                         */
                        char c;
-
 #ifdef DEBUG_INIT
+                       pid_t shell_pgid = getpid();
                        message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
                                        command, shell_pgid, terminal);
 #endif
index 14dc2f5b96909f665abc32c8bad6c8da023d53dd..0f23b9562b595ce0b3806c41e26c8e7068004207 100644 (file)
 
 extern int poweroff_main(int argc, char **argv)
 {
+#ifdef BB_FEATURE_LINUXRC
        /* don't assume init's pid == 1 */
        exit(kill(findPidByName("init"), SIGUSR2));
+#else
+       exit(kill(1, SIGUSR2));
+#endif
 }
index fc01ea004fe52e67abdf1abbcbfd105bf3e59caf..2f8b2b4a5275487b25e58dd893c2985c748aea1c 100644 (file)
 
 extern int reboot_main(int argc, char **argv)
 {
+#ifdef BB_FEATURE_LINUXRC
        /* don't assume init's pid == 1 */
        exit(kill(findPidByName("init"), SIGINT));
+#else
+       exit(kill(1, SIGINT));
+#endif
 }
 
 /*
diff --git a/lsmod.c b/lsmod.c
index d9c40eaaf2deabb5b25da78eb8b5d9f66c36a891..b0b37bdd78745e3297215f26bbbe6d1a541720ff 100644 (file)
--- a/lsmod.c
+++ b/lsmod.c
@@ -25,9 +25,9 @@
 #include <stdio.h>
 
 
-#if ! defined BB_FEATURE_USE_PROCFS
-#error Sorry, I depend on the /proc filesystem right now.
-#endif
+//#if ! defined BB_FEATURE_USE_PROCFS
+//#error Sorry, I depend on the /proc filesystem right now.
+//#endif
 
 extern int lsmod_main(int argc, char **argv)
 {
index d9c40eaaf2deabb5b25da78eb8b5d9f66c36a891..b0b37bdd78745e3297215f26bbbe6d1a541720ff 100644 (file)
@@ -25,9 +25,9 @@
 #include <stdio.h>
 
 
-#if ! defined BB_FEATURE_USE_PROCFS
-#error Sorry, I depend on the /proc filesystem right now.
-#endif
+//#if ! defined BB_FEATURE_USE_PROCFS
+//#error Sorry, I depend on the /proc filesystem right now.
+//#endif
 
 extern int lsmod_main(int argc, char **argv)
 {
index 14dc2f5b96909f665abc32c8bad6c8da023d53dd..0f23b9562b595ce0b3806c41e26c8e7068004207 100644 (file)
 
 extern int poweroff_main(int argc, char **argv)
 {
+#ifdef BB_FEATURE_LINUXRC
        /* don't assume init's pid == 1 */
        exit(kill(findPidByName("init"), SIGUSR2));
+#else
+       exit(kill(1, SIGUSR2));
+#endif
 }
index b0933ab514347d4c66dbb0b1bff2858e102abde6..b9ff5bd0bc1ce5db29091e306256241ca159429b 100644 (file)
@@ -35,6 +35,8 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <ctype.h>
+#include <sys/ioctl.h>
+
 
 #if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB
 
@@ -116,7 +118,15 @@ extern int ps_main(int argc, char **argv)
        char path[32], sbuf[512];
        char uidName[10] = "";
        char groupName[10] = "";
-       int i, c;
+       int len, i, c;
+#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\n\nReport process status\n\nThis version of ps accepts no options.\n");
@@ -125,6 +135,12 @@ extern int ps_main(int argc, char **argv)
        if (!dir)
                fatalError("Can't open /proc");
 
+#ifdef BB_FEATURE_AUTOWIDTH
+               ioctl(fileno(stdout), TIOCGWINSZ, &win);
+               if (win.ws_col > 0)
+                       terminal_width = win.ws_col - 1;
+#endif
+
        fprintf(stdout, "%5s  %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
                        "State", "Command");
        while ((entry = readdir(dir)) != NULL) {
@@ -146,21 +162,21 @@ extern int ps_main(int argc, char **argv)
                if (*groupName == '\0')
                        sprintf(groupName, "%d", p.rgid);
 
-               fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName,
+               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 < 53)) {
+               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, "[%s]", p.cmd);
                fprintf(stdout, "\n");
        }
        closedir(dir);
@@ -175,19 +191,24 @@ extern int ps_main(int argc, char **argv)
  * 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;
+       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");
@@ -212,6 +233,12 @@ extern int ps_main(int argc, char **argv)
        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;
+#endif
+
        /* Print up a ps listing */
        fprintf(stdout, "%5s  %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
                        "State", "Command");
@@ -232,13 +259,19 @@ extern int ps_main(int argc, char **argv)
                if (*groupName == '\0')
                        sprintf(groupName, "%ld", info.egid);
 
-               fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state);
+               len = fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state);
 
-               if (strlen(info.command_line) > 1)
+               if (strlen(info.command_line) > 1) {
+                       for( j=0; j<(sizeof(info.command_line)-1) && j < (terminal_width-len); j++) {
+                               if (*(info.command_line+j) == '\0' && *(info.command_line+j+1) != '\0') {
+                                       *(info.command_line+j) = ' ';
+                               }
+                       }
+                       *(info.command_line+j) = '\0';
                        fprintf(stdout, "%s\n", info.command_line);
-               else
+               } else {
                        fprintf(stdout, "[%s]\n", info.name);
-
+               }
        }
 
        /* Free memory */
diff --git a/ps.c b/ps.c
index b0933ab514347d4c66dbb0b1bff2858e102abde6..b9ff5bd0bc1ce5db29091e306256241ca159429b 100644 (file)
--- a/ps.c
+++ b/ps.c
@@ -35,6 +35,8 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <ctype.h>
+#include <sys/ioctl.h>
+
 
 #if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB
 
@@ -116,7 +118,15 @@ extern int ps_main(int argc, char **argv)
        char path[32], sbuf[512];
        char uidName[10] = "";
        char groupName[10] = "";
-       int i, c;
+       int len, i, c;
+#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\n\nReport process status\n\nThis version of ps accepts no options.\n");
@@ -125,6 +135,12 @@ extern int ps_main(int argc, char **argv)
        if (!dir)
                fatalError("Can't open /proc");
 
+#ifdef BB_FEATURE_AUTOWIDTH
+               ioctl(fileno(stdout), TIOCGWINSZ, &win);
+               if (win.ws_col > 0)
+                       terminal_width = win.ws_col - 1;
+#endif
+
        fprintf(stdout, "%5s  %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
                        "State", "Command");
        while ((entry = readdir(dir)) != NULL) {
@@ -146,21 +162,21 @@ extern int ps_main(int argc, char **argv)
                if (*groupName == '\0')
                        sprintf(groupName, "%d", p.rgid);
 
-               fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName,
+               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 < 53)) {
+               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, "[%s]", p.cmd);
                fprintf(stdout, "\n");
        }
        closedir(dir);
@@ -175,19 +191,24 @@ extern int ps_main(int argc, char **argv)
  * 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;
+       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");
@@ -212,6 +233,12 @@ extern int ps_main(int argc, char **argv)
        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;
+#endif
+
        /* Print up a ps listing */
        fprintf(stdout, "%5s  %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
                        "State", "Command");
@@ -232,13 +259,19 @@ extern int ps_main(int argc, char **argv)
                if (*groupName == '\0')
                        sprintf(groupName, "%ld", info.egid);
 
-               fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state);
+               len = fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state);
 
-               if (strlen(info.command_line) > 1)
+               if (strlen(info.command_line) > 1) {
+                       for( j=0; j<(sizeof(info.command_line)-1) && j < (terminal_width-len); j++) {
+                               if (*(info.command_line+j) == '\0' && *(info.command_line+j+1) != '\0') {
+                                       *(info.command_line+j) = ' ';
+                               }
+                       }
+                       *(info.command_line+j) = '\0';
                        fprintf(stdout, "%s\n", info.command_line);
-               else
+               } else {
                        fprintf(stdout, "[%s]\n", info.name);
-
+               }
        }
 
        /* Free memory */
index fc01ea004fe52e67abdf1abbcbfd105bf3e59caf..2f8b2b4a5275487b25e58dd893c2985c748aea1c 100644 (file)
--- a/reboot.c
+++ b/reboot.c
 
 extern int reboot_main(int argc, char **argv)
 {
+#ifdef BB_FEATURE_LINUXRC
        /* don't assume init's pid == 1 */
        exit(kill(findPidByName("init"), SIGINT));
+#else
+       exit(kill(1, SIGINT));
+#endif
 }
 
 /*
index 789c6f22833d24042a9b61c52f9177c16e403df3..c3f9947c51e0f0175de84cdf2f2a16b2f23bf03b 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -1247,7 +1247,7 @@ extern int device_open(char *device, int mode)
 #endif                                                 /* BB_INIT BB_SYSLOGD */
 
 
-#if defined BB_INIT || defined BB_HALT || defined BB_REBOOT || defined BB_KILLALL
+#if defined BB_KILLALL || defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF )
 
 #ifdef BB_FEATURE_USE_DEVPS_N_DEVMTAB
 #include <linux/devps.h>
@@ -1318,6 +1318,7 @@ extern pid_t findPidByName( char* pidName)
 #if ! defined BB_FEATURE_USE_PROCFS
 #error Sorry, I depend on the /proc filesystem right now.
 #endif
+
 /* findPidByName()
  *  
  *  This finds the pid of the specified process.
@@ -1330,15 +1331,24 @@ extern pid_t findPidByName( char* pidName)
  */
 extern pid_t findPidByName( char* pidName)
 {
-       pid_t thePid;
-       char filename[256];
-       char buffer[256];
+       DIR *dir;
+       struct dirent *next;
 
-       /* no need to opendir ;) */
-       for (thePid = 1; thePid < 65536; thePid++) {
+       dir = opendir("/proc");
+       if (!dir)
+               fatalError( "Cannot open /proc: %s\n", strerror (errno));
+       
+       while ((next = readdir(dir)) != NULL) {
                FILE *status;
+               char filename[256];
+               char buffer[256];
+
+               /* If it isn't a number, we don't want it */
+               if (!isdigit(*next->d_name))
+                       continue;
 
-               sprintf(filename, "/proc/%d/cmdline", thePid);
+               /* Now open the command line file */
+               sprintf(filename, "/proc/%s/status", next->d_name);
                status = fopen(filename, "r");
                if (!status) {
                        continue;
@@ -1347,13 +1357,13 @@ extern pid_t findPidByName( char* pidName)
                fclose(status);
 
                if ((strstr(buffer, pidName) != NULL)) {
-                       return thePid;
+                       return strtol(next->d_name, NULL, 0);
                }
        }
        return 0;
 }
 #endif                                                 /* BB_FEATURE_USE_DEVPS_N_DEVMTAB */
-#endif                                                 /* BB_INIT || BB_HALT || BB_REBOOT || KILLALL */
+#endif                                                 /* BB_INIT || BB_HALT || BB_REBOOT || BB_KILLALL || BB_POWEROFF */
 
 #if defined BB_GUNZIP \
  || defined BB_GZIP   \