From 2ac2fae728cca8a535b29bdd2fa6899e6f4992f2 Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Tue, 7 Mar 2000 23:32:17 +0000 Subject: Fix bugs related to finding PIDs. -Erik --- Changelog | 8 +++++++- halt.c | 4 ++++ init.c | 6 +----- init/halt.c | 4 ++++ init/init.c | 6 +----- init/poweroff.c | 4 ++++ init/reboot.c | 4 ++++ lsmod.c | 6 +++--- modutils/lsmod.c | 6 +++--- poweroff.c | 4 ++++ procps/ps.c | 53 +++++++++++++++++++++++++++++++++++++++++++---------- ps.c | 53 +++++++++++++++++++++++++++++++++++++++++++---------- reboot.c | 4 ++++ utility.c | 28 +++++++++++++++++++--------- 14 files changed, 144 insertions(+), 46 deletions(-) diff --git a/Changelog b/Changelog index fd560a82a..ebc69bd37 100644 --- 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 @@ -36,7 +41,8 @@ * An initial telnet implementation was added by Randolph Chung . * 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 f2c9828d4..81d24cf2d 100644 --- a/halt.c +++ b/halt.c @@ -26,6 +26,10 @@ 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 8e28f076f..c6052f8cf 100644 --- 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 diff --git a/init/halt.c b/init/halt.c index f2c9828d4..81d24cf2d 100644 --- a/init/halt.c +++ b/init/halt.c @@ -26,6 +26,10 @@ 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/init.c b/init/init.c index 8e28f076f..c6052f8cf 100644 --- a/init/init.c +++ b/init/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 diff --git a/init/poweroff.c b/init/poweroff.c index 14dc2f5b9..0f23b9562 100644 --- a/init/poweroff.c +++ b/init/poweroff.c @@ -26,6 +26,10 @@ 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 } diff --git a/init/reboot.c b/init/reboot.c index fc01ea004..2f8b2b4a5 100644 --- a/init/reboot.c +++ b/init/reboot.c @@ -26,8 +26,12 @@ 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 d9c40eaaf..b0b37bdd7 100644 --- a/lsmod.c +++ b/lsmod.c @@ -25,9 +25,9 @@ #include -#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) { diff --git a/modutils/lsmod.c b/modutils/lsmod.c index d9c40eaaf..b0b37bdd7 100644 --- a/modutils/lsmod.c +++ b/modutils/lsmod.c @@ -25,9 +25,9 @@ #include -#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) { diff --git a/poweroff.c b/poweroff.c index 14dc2f5b9..0f23b9562 100644 --- a/poweroff.c +++ b/poweroff.c @@ -26,6 +26,10 @@ 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 } diff --git a/procps/ps.c b/procps/ps.c index b0933ab51..b9ff5bd0b 100644 --- a/procps/ps.c +++ b/procps/ps.c @@ -35,6 +35,8 @@ #include #include #include +#include + #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 #include 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 b0933ab51..b9ff5bd0b 100644 --- a/ps.c +++ b/ps.c @@ -35,6 +35,8 @@ #include #include #include +#include + #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 #include 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/reboot.c b/reboot.c index fc01ea004..2f8b2b4a5 100644 --- a/reboot.c +++ b/reboot.c @@ -26,8 +26,12 @@ 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/utility.c b/utility.c index 789c6f228..c3f9947c5 100644 --- 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 @@ -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 \ -- cgit v1.2.3