Fix bugs related to finding PIDs.

-Erik
This commit is contained in:
Erik Andersen 2000-03-07 23:32:17 +00:00
parent cbd0d625c7
commit 2ac2fae728
14 changed files with 144 additions and 46 deletions

View File

@ -1,4 +1,9 @@
0.43 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. * Wrote basename, killall, and uptime.
* Added freeramdisk, which will free up all memory associated * Added freeramdisk, which will free up all memory associated
with a ram disk. Contributed by Emanuele Caratti <wiz@iol.it> with a ram disk. Contributed by Emanuele Caratti <wiz@iol.it>
@ -36,7 +41,8 @@
* An initial telnet implementation was added by * An initial telnet implementation was added by
Randolph Chung <tausq@debian.org>. Randolph Chung <tausq@debian.org>.
* Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e") * 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 -Erik Andersen

4
halt.c
View File

@ -26,6 +26,10 @@
extern int halt_main(int argc, char **argv) extern int halt_main(int argc, char **argv)
{ {
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */ /* don't assume init's pid == 1 */
exit(kill(findPidByName("init"), SIGUSR1)); exit(kill(findPidByName("init"), SIGUSR1));
#else
exit(kill(1, SIGUSR1));
#endif
} }

6
init.c
View File

@ -336,10 +336,6 @@ static pid_t run(char *command, char *terminal, int get_enter)
if ((pid = fork()) == 0) { if ((pid = fork()) == 0) {
#ifdef DEBUG_INIT
pid_t shell_pgid = getpid();
#endif
/* Clean up */ /* Clean up */
close(0); close(0);
close(1); close(1);
@ -373,8 +369,8 @@ static pid_t run(char *command, char *terminal, int get_enter)
* specifies. * specifies.
*/ */
char c; char c;
#ifdef DEBUG_INIT #ifdef DEBUG_INIT
pid_t shell_pgid = getpid();
message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
command, shell_pgid, terminal); command, shell_pgid, terminal);
#endif #endif

View File

@ -26,6 +26,10 @@
extern int halt_main(int argc, char **argv) extern int halt_main(int argc, char **argv)
{ {
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */ /* don't assume init's pid == 1 */
exit(kill(findPidByName("init"), SIGUSR1)); exit(kill(findPidByName("init"), SIGUSR1));
#else
exit(kill(1, SIGUSR1));
#endif
} }

View File

@ -336,10 +336,6 @@ static pid_t run(char *command, char *terminal, int get_enter)
if ((pid = fork()) == 0) { if ((pid = fork()) == 0) {
#ifdef DEBUG_INIT
pid_t shell_pgid = getpid();
#endif
/* Clean up */ /* Clean up */
close(0); close(0);
close(1); close(1);
@ -373,8 +369,8 @@ static pid_t run(char *command, char *terminal, int get_enter)
* specifies. * specifies.
*/ */
char c; char c;
#ifdef DEBUG_INIT #ifdef DEBUG_INIT
pid_t shell_pgid = getpid();
message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
command, shell_pgid, terminal); command, shell_pgid, terminal);
#endif #endif

View File

@ -26,6 +26,10 @@
extern int poweroff_main(int argc, char **argv) extern int poweroff_main(int argc, char **argv)
{ {
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */ /* don't assume init's pid == 1 */
exit(kill(findPidByName("init"), SIGUSR2)); exit(kill(findPidByName("init"), SIGUSR2));
#else
exit(kill(1, SIGUSR2));
#endif
} }

View File

@ -26,8 +26,12 @@
extern int reboot_main(int argc, char **argv) extern int reboot_main(int argc, char **argv)
{ {
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */ /* don't assume init's pid == 1 */
exit(kill(findPidByName("init"), SIGINT)); exit(kill(findPidByName("init"), SIGINT));
#else
exit(kill(1, SIGINT));
#endif
} }
/* /*

View File

@ -25,9 +25,9 @@
#include <stdio.h> #include <stdio.h>
#if ! defined BB_FEATURE_USE_PROCFS //#if ! defined BB_FEATURE_USE_PROCFS
#error Sorry, I depend on the /proc filesystem right now. //#error Sorry, I depend on the /proc filesystem right now.
#endif //#endif
extern int lsmod_main(int argc, char **argv) extern int lsmod_main(int argc, char **argv)
{ {

View File

@ -25,9 +25,9 @@
#include <stdio.h> #include <stdio.h>
#if ! defined BB_FEATURE_USE_PROCFS //#if ! defined BB_FEATURE_USE_PROCFS
#error Sorry, I depend on the /proc filesystem right now. //#error Sorry, I depend on the /proc filesystem right now.
#endif //#endif
extern int lsmod_main(int argc, char **argv) extern int lsmod_main(int argc, char **argv)
{ {

View File

@ -26,6 +26,10 @@
extern int poweroff_main(int argc, char **argv) extern int poweroff_main(int argc, char **argv)
{ {
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */ /* don't assume init's pid == 1 */
exit(kill(findPidByName("init"), SIGUSR2)); exit(kill(findPidByName("init"), SIGUSR2));
#else
exit(kill(1, SIGUSR2));
#endif
} }

View File

@ -35,6 +35,8 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <ctype.h> #include <ctype.h>
#include <sys/ioctl.h>
#if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB #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 path[32], sbuf[512];
char uidName[10] = ""; char uidName[10] = "";
char groupName[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) == '-') if (argc > 1 && **(argv + 1) == '-')
usage ("ps\n\nReport process status\n\nThis version of ps accepts no options.\n"); 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) if (!dir)
fatalError("Can't open /proc"); 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", fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
"State", "Command"); "State", "Command");
while ((entry = readdir(dir)) != NULL) { while ((entry = readdir(dir)) != NULL) {
@ -146,21 +162,21 @@ extern int ps_main(int argc, char **argv)
if (*groupName == '\0') if (*groupName == '\0')
sprintf(groupName, "%d", p.rgid); 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); p.state);
sprintf(path, "/proc/%s/cmdline", entry->d_name); sprintf(path, "/proc/%s/cmdline", entry->d_name);
file = fopen(path, "r"); file = fopen(path, "r");
if (file == NULL) if (file == NULL)
fatalError("Can't open %s: %s\n", path, strerror(errno)); fatalError("Can't open %s: %s\n", path, strerror(errno));
i = 0; i = 0;
while (((c = getc(file)) != EOF) && (i < 53)) { while (((c = getc(file)) != EOF) && (i < (terminal_width-len))) {
i++; i++;
if (c == '\0') if (c == '\0')
c = ' '; c = ' ';
putc(c, stdout); putc(c, stdout);
} }
if (i == 0) if (i == 0)
fprintf(stdout, "%s", p.cmd); fprintf(stdout, "[%s]", p.cmd);
fprintf(stdout, "\n"); fprintf(stdout, "\n");
} }
closedir(dir); closedir(dir);
@ -175,19 +191,24 @@ extern int ps_main(int argc, char **argv)
* this one uses the nifty new devps kernel device. * this one uses the nifty new devps kernel device.
*/ */
#include <sys/ioctl.h>
#include <linux/devps.h> #include <linux/devps.h>
extern int ps_main(int argc, char **argv) extern int ps_main(int argc, char **argv)
{ {
char device[] = "/dev/ps"; char device[] = "/dev/ps";
int i, fd; int i, j, len, fd;
pid_t num_pids; pid_t num_pids;
pid_t* pid_array = NULL; pid_t* pid_array = NULL;
struct pid_info info; struct pid_info info;
char uidName[10] = ""; char uidName[10] = "";
char groupName[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) == '-') if (argc > 1 && **(argv + 1) == '-')
usage("ps-devps\n\nReport process status\n\nThis version of ps accepts no options.\n\n"); 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) if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0)
fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); 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 */ /* Print up a ps listing */
fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
"State", "Command"); "State", "Command");
@ -232,13 +259,19 @@ extern int ps_main(int argc, char **argv)
if (*groupName == '\0') if (*groupName == '\0')
sprintf(groupName, "%ld", info.egid); 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); fprintf(stdout, "%s\n", info.command_line);
else } else {
fprintf(stdout, "[%s]\n", info.name); fprintf(stdout, "[%s]\n", info.name);
}
} }
/* Free memory */ /* Free memory */

53
ps.c
View File

@ -35,6 +35,8 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <ctype.h> #include <ctype.h>
#include <sys/ioctl.h>
#if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB #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 path[32], sbuf[512];
char uidName[10] = ""; char uidName[10] = "";
char groupName[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) == '-') if (argc > 1 && **(argv + 1) == '-')
usage ("ps\n\nReport process status\n\nThis version of ps accepts no options.\n"); 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) if (!dir)
fatalError("Can't open /proc"); 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", fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
"State", "Command"); "State", "Command");
while ((entry = readdir(dir)) != NULL) { while ((entry = readdir(dir)) != NULL) {
@ -146,21 +162,21 @@ extern int ps_main(int argc, char **argv)
if (*groupName == '\0') if (*groupName == '\0')
sprintf(groupName, "%d", p.rgid); 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); p.state);
sprintf(path, "/proc/%s/cmdline", entry->d_name); sprintf(path, "/proc/%s/cmdline", entry->d_name);
file = fopen(path, "r"); file = fopen(path, "r");
if (file == NULL) if (file == NULL)
fatalError("Can't open %s: %s\n", path, strerror(errno)); fatalError("Can't open %s: %s\n", path, strerror(errno));
i = 0; i = 0;
while (((c = getc(file)) != EOF) && (i < 53)) { while (((c = getc(file)) != EOF) && (i < (terminal_width-len))) {
i++; i++;
if (c == '\0') if (c == '\0')
c = ' '; c = ' ';
putc(c, stdout); putc(c, stdout);
} }
if (i == 0) if (i == 0)
fprintf(stdout, "%s", p.cmd); fprintf(stdout, "[%s]", p.cmd);
fprintf(stdout, "\n"); fprintf(stdout, "\n");
} }
closedir(dir); closedir(dir);
@ -175,19 +191,24 @@ extern int ps_main(int argc, char **argv)
* this one uses the nifty new devps kernel device. * this one uses the nifty new devps kernel device.
*/ */
#include <sys/ioctl.h>
#include <linux/devps.h> #include <linux/devps.h>
extern int ps_main(int argc, char **argv) extern int ps_main(int argc, char **argv)
{ {
char device[] = "/dev/ps"; char device[] = "/dev/ps";
int i, fd; int i, j, len, fd;
pid_t num_pids; pid_t num_pids;
pid_t* pid_array = NULL; pid_t* pid_array = NULL;
struct pid_info info; struct pid_info info;
char uidName[10] = ""; char uidName[10] = "";
char groupName[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) == '-') if (argc > 1 && **(argv + 1) == '-')
usage("ps-devps\n\nReport process status\n\nThis version of ps accepts no options.\n\n"); 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) if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0)
fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); 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 */ /* Print up a ps listing */
fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid",
"State", "Command"); "State", "Command");
@ -232,13 +259,19 @@ extern int ps_main(int argc, char **argv)
if (*groupName == '\0') if (*groupName == '\0')
sprintf(groupName, "%ld", info.egid); 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); fprintf(stdout, "%s\n", info.command_line);
else } else {
fprintf(stdout, "[%s]\n", info.name); fprintf(stdout, "[%s]\n", info.name);
}
} }
/* Free memory */ /* Free memory */

View File

@ -26,8 +26,12 @@
extern int reboot_main(int argc, char **argv) extern int reboot_main(int argc, char **argv)
{ {
#ifdef BB_FEATURE_LINUXRC
/* don't assume init's pid == 1 */ /* don't assume init's pid == 1 */
exit(kill(findPidByName("init"), SIGINT)); exit(kill(findPidByName("init"), SIGINT));
#else
exit(kill(1, SIGINT));
#endif
} }
/* /*

View File

@ -1247,7 +1247,7 @@ extern int device_open(char *device, int mode)
#endif /* BB_INIT BB_SYSLOGD */ #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 #ifdef BB_FEATURE_USE_DEVPS_N_DEVMTAB
#include <linux/devps.h> #include <linux/devps.h>
@ -1318,6 +1318,7 @@ extern pid_t findPidByName( char* pidName)
#if ! defined BB_FEATURE_USE_PROCFS #if ! defined BB_FEATURE_USE_PROCFS
#error Sorry, I depend on the /proc filesystem right now. #error Sorry, I depend on the /proc filesystem right now.
#endif #endif
/* findPidByName() /* findPidByName()
* *
* This finds the pid of the specified process. * This finds the pid of the specified process.
@ -1330,15 +1331,24 @@ extern pid_t findPidByName( char* pidName)
*/ */
extern pid_t findPidByName( char* pidName) extern pid_t findPidByName( char* pidName)
{ {
pid_t thePid; DIR *dir;
char filename[256]; struct dirent *next;
char buffer[256];
/* no need to opendir ;) */ dir = opendir("/proc");
for (thePid = 1; thePid < 65536; thePid++) { if (!dir)
fatalError( "Cannot open /proc: %s\n", strerror (errno));
while ((next = readdir(dir)) != NULL) {
FILE *status; FILE *status;
char filename[256];
char buffer[256];
sprintf(filename, "/proc/%d/cmdline", thePid); /* If it isn't a number, we don't want it */
if (!isdigit(*next->d_name))
continue;
/* Now open the command line file */
sprintf(filename, "/proc/%s/status", next->d_name);
status = fopen(filename, "r"); status = fopen(filename, "r");
if (!status) { if (!status) {
continue; continue;
@ -1347,13 +1357,13 @@ extern pid_t findPidByName( char* pidName)
fclose(status); fclose(status);
if ((strstr(buffer, pidName) != NULL)) { if ((strstr(buffer, pidName) != NULL)) {
return thePid; return strtol(next->d_name, NULL, 0);
} }
} }
return 0; return 0;
} }
#endif /* BB_FEATURE_USE_DEVPS_N_DEVMTAB */ #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 \ #if defined BB_GUNZIP \
|| defined BB_GZIP \ || defined BB_GZIP \