diff options
| author | Erik Andersen <andersen@codepoet.org> | 2000-03-07 23:32:17 +0000 |
|---|---|---|
| committer | Erik Andersen <andersen@codepoet.org> | 2000-03-07 23:32:17 +0000 |
| commit | 2ac2fae728cca8a535b29bdd2fa6899e6f4992f2 (patch) | |
| tree | 76eb5871ac3cde7d58048aadba75c7f40fab93b7 | |
| parent | cbd0d625c7466af80f141e0ae24186e15987bf3e (diff) | |
| download | busybox-w32-2ac2fae728cca8a535b29bdd2fa6899e6f4992f2.tar.gz busybox-w32-2ac2fae728cca8a535b29bdd2fa6899e6f4992f2.tar.bz2 busybox-w32-2ac2fae728cca8a535b29bdd2fa6899e6f4992f2.zip | |
Fix bugs related to finding PIDs.
-Erik
| -rw-r--r-- | Changelog | 8 | ||||
| -rw-r--r-- | halt.c | 4 | ||||
| -rw-r--r-- | init.c | 6 | ||||
| -rw-r--r-- | init/halt.c | 4 | ||||
| -rw-r--r-- | init/init.c | 6 | ||||
| -rw-r--r-- | init/poweroff.c | 4 | ||||
| -rw-r--r-- | init/reboot.c | 4 | ||||
| -rw-r--r-- | lsmod.c | 6 | ||||
| -rw-r--r-- | modutils/lsmod.c | 6 | ||||
| -rw-r--r-- | poweroff.c | 4 | ||||
| -rw-r--r-- | procps/ps.c | 53 | ||||
| -rw-r--r-- | ps.c | 53 | ||||
| -rw-r--r-- | reboot.c | 4 | ||||
| -rw-r--r-- | utility.c | 28 |
14 files changed, 144 insertions, 46 deletions
| @@ -1,4 +1,9 @@ | |||
| 1 | 0.43 | 1 | 0.43 |
| 2 | * Busybox can now work perfectly when /proc is disabled, thereby | ||
| 3 | saving a bunch of memory (kernel /proc support is not thin). | ||
| 4 | This is done by making use of some nice kernel patches I | ||
| 5 | wrote up to support the features that busybox requires and | ||
| 6 | that /proc usually provides. | ||
| 2 | * Wrote basename, killall, and uptime. | 7 | * Wrote basename, killall, and uptime. |
| 3 | * Added freeramdisk, which will free up all memory associated | 8 | * Added freeramdisk, which will free up all memory associated |
| 4 | with a ram disk. Contributed by Emanuele Caratti <wiz@iol.it> | 9 | with a ram disk. Contributed by Emanuele Caratti <wiz@iol.it> |
| @@ -36,7 +41,8 @@ | |||
| 36 | * An initial telnet implementation was added by | 41 | * An initial telnet implementation was added by |
| 37 | Randolph Chung <tausq@debian.org>. | 42 | Randolph Chung <tausq@debian.org>. |
| 38 | * Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e") | 43 | * Fixed a bug where "sed 's/foo/bar/g'" (i.e. a script w/o a "-e") |
| 39 | would go into an infinite loop. | 44 | * ps now supports BB_FEATURE_AUTOWIDTH, and can adjust its width |
| 45 | to match the terminal (defaults to width=79 when this is off). | ||
| 40 | 46 | ||
| 41 | 47 | ||
| 42 | -Erik Andersen | 48 | -Erik Andersen |
| @@ -26,6 +26,10 @@ | |||
| 26 | 26 | ||
| 27 | extern int halt_main(int argc, char **argv) | 27 | extern int halt_main(int argc, char **argv) |
| 28 | { | 28 | { |
| 29 | #ifdef BB_FEATURE_LINUXRC | ||
| 29 | /* don't assume init's pid == 1 */ | 30 | /* don't assume init's pid == 1 */ |
| 30 | exit(kill(findPidByName("init"), SIGUSR1)); | 31 | exit(kill(findPidByName("init"), SIGUSR1)); |
| 32 | #else | ||
| 33 | exit(kill(1, SIGUSR1)); | ||
| 34 | #endif | ||
| 31 | } | 35 | } |
| @@ -336,10 +336,6 @@ static pid_t run(char *command, char *terminal, int get_enter) | |||
| 336 | 336 | ||
| 337 | 337 | ||
| 338 | if ((pid = fork()) == 0) { | 338 | if ((pid = fork()) == 0) { |
| 339 | #ifdef DEBUG_INIT | ||
| 340 | pid_t shell_pgid = getpid(); | ||
| 341 | #endif | ||
| 342 | |||
| 343 | /* Clean up */ | 339 | /* Clean up */ |
| 344 | close(0); | 340 | close(0); |
| 345 | close(1); | 341 | close(1); |
| @@ -373,8 +369,8 @@ static pid_t run(char *command, char *terminal, int get_enter) | |||
| 373 | * specifies. | 369 | * specifies. |
| 374 | */ | 370 | */ |
| 375 | char c; | 371 | char c; |
| 376 | |||
| 377 | #ifdef DEBUG_INIT | 372 | #ifdef DEBUG_INIT |
| 373 | pid_t shell_pgid = getpid(); | ||
| 378 | message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", | 374 | message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", |
| 379 | command, shell_pgid, terminal); | 375 | command, shell_pgid, terminal); |
| 380 | #endif | 376 | #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 @@ | |||
| 26 | 26 | ||
| 27 | extern int halt_main(int argc, char **argv) | 27 | extern int halt_main(int argc, char **argv) |
| 28 | { | 28 | { |
| 29 | #ifdef BB_FEATURE_LINUXRC | ||
| 29 | /* don't assume init's pid == 1 */ | 30 | /* don't assume init's pid == 1 */ |
| 30 | exit(kill(findPidByName("init"), SIGUSR1)); | 31 | exit(kill(findPidByName("init"), SIGUSR1)); |
| 32 | #else | ||
| 33 | exit(kill(1, SIGUSR1)); | ||
| 34 | #endif | ||
| 31 | } | 35 | } |
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) | |||
| 336 | 336 | ||
| 337 | 337 | ||
| 338 | if ((pid = fork()) == 0) { | 338 | if ((pid = fork()) == 0) { |
| 339 | #ifdef DEBUG_INIT | ||
| 340 | pid_t shell_pgid = getpid(); | ||
| 341 | #endif | ||
| 342 | |||
| 343 | /* Clean up */ | 339 | /* Clean up */ |
| 344 | close(0); | 340 | close(0); |
| 345 | close(1); | 341 | close(1); |
| @@ -373,8 +369,8 @@ static pid_t run(char *command, char *terminal, int get_enter) | |||
| 373 | * specifies. | 369 | * specifies. |
| 374 | */ | 370 | */ |
| 375 | char c; | 371 | char c; |
| 376 | |||
| 377 | #ifdef DEBUG_INIT | 372 | #ifdef DEBUG_INIT |
| 373 | pid_t shell_pgid = getpid(); | ||
| 378 | message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", | 374 | message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n", |
| 379 | command, shell_pgid, terminal); | 375 | command, shell_pgid, terminal); |
| 380 | #endif | 376 | #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 @@ | |||
| 26 | 26 | ||
| 27 | extern int poweroff_main(int argc, char **argv) | 27 | extern int poweroff_main(int argc, char **argv) |
| 28 | { | 28 | { |
| 29 | #ifdef BB_FEATURE_LINUXRC | ||
| 29 | /* don't assume init's pid == 1 */ | 30 | /* don't assume init's pid == 1 */ |
| 30 | exit(kill(findPidByName("init"), SIGUSR2)); | 31 | exit(kill(findPidByName("init"), SIGUSR2)); |
| 32 | #else | ||
| 33 | exit(kill(1, SIGUSR2)); | ||
| 34 | #endif | ||
| 31 | } | 35 | } |
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 @@ | |||
| 26 | 26 | ||
| 27 | extern int reboot_main(int argc, char **argv) | 27 | extern int reboot_main(int argc, char **argv) |
| 28 | { | 28 | { |
| 29 | #ifdef BB_FEATURE_LINUXRC | ||
| 29 | /* don't assume init's pid == 1 */ | 30 | /* don't assume init's pid == 1 */ |
| 30 | exit(kill(findPidByName("init"), SIGINT)); | 31 | exit(kill(findPidByName("init"), SIGINT)); |
| 32 | #else | ||
| 33 | exit(kill(1, SIGINT)); | ||
| 34 | #endif | ||
| 31 | } | 35 | } |
| 32 | 36 | ||
| 33 | /* | 37 | /* |
| @@ -25,9 +25,9 @@ | |||
| 25 | #include <stdio.h> | 25 | #include <stdio.h> |
| 26 | 26 | ||
| 27 | 27 | ||
| 28 | #if ! defined BB_FEATURE_USE_PROCFS | 28 | //#if ! defined BB_FEATURE_USE_PROCFS |
| 29 | #error Sorry, I depend on the /proc filesystem right now. | 29 | //#error Sorry, I depend on the /proc filesystem right now. |
| 30 | #endif | 30 | //#endif |
| 31 | 31 | ||
| 32 | extern int lsmod_main(int argc, char **argv) | 32 | extern int lsmod_main(int argc, char **argv) |
| 33 | { | 33 | { |
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 @@ | |||
| 25 | #include <stdio.h> | 25 | #include <stdio.h> |
| 26 | 26 | ||
| 27 | 27 | ||
| 28 | #if ! defined BB_FEATURE_USE_PROCFS | 28 | //#if ! defined BB_FEATURE_USE_PROCFS |
| 29 | #error Sorry, I depend on the /proc filesystem right now. | 29 | //#error Sorry, I depend on the /proc filesystem right now. |
| 30 | #endif | 30 | //#endif |
| 31 | 31 | ||
| 32 | extern int lsmod_main(int argc, char **argv) | 32 | extern int lsmod_main(int argc, char **argv) |
| 33 | { | 33 | { |
diff --git a/poweroff.c b/poweroff.c index 14dc2f5b9..0f23b9562 100644 --- a/poweroff.c +++ b/poweroff.c | |||
| @@ -26,6 +26,10 @@ | |||
| 26 | 26 | ||
| 27 | extern int poweroff_main(int argc, char **argv) | 27 | extern int poweroff_main(int argc, char **argv) |
| 28 | { | 28 | { |
| 29 | #ifdef BB_FEATURE_LINUXRC | ||
| 29 | /* don't assume init's pid == 1 */ | 30 | /* don't assume init's pid == 1 */ |
| 30 | exit(kill(findPidByName("init"), SIGUSR2)); | 31 | exit(kill(findPidByName("init"), SIGUSR2)); |
| 32 | #else | ||
| 33 | exit(kill(1, SIGUSR2)); | ||
| 34 | #endif | ||
| 31 | } | 35 | } |
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 @@ | |||
| 35 | #include <errno.h> | 35 | #include <errno.h> |
| 36 | #include <fcntl.h> | 36 | #include <fcntl.h> |
| 37 | #include <ctype.h> | 37 | #include <ctype.h> |
| 38 | #include <sys/ioctl.h> | ||
| 39 | |||
| 38 | 40 | ||
| 39 | #if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB | 41 | #if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB |
| 40 | 42 | ||
| @@ -116,7 +118,15 @@ extern int ps_main(int argc, char **argv) | |||
| 116 | char path[32], sbuf[512]; | 118 | char path[32], sbuf[512]; |
| 117 | char uidName[10] = ""; | 119 | char uidName[10] = ""; |
| 118 | char groupName[10] = ""; | 120 | char groupName[10] = ""; |
| 119 | int i, c; | 121 | int len, i, c; |
| 122 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 123 | struct winsize win = { 0, 0 }; | ||
| 124 | int terminal_width = 0; | ||
| 125 | #else | ||
| 126 | #define terminal_width 79 | ||
| 127 | #endif | ||
| 128 | |||
| 129 | |||
| 120 | 130 | ||
| 121 | if (argc > 1 && **(argv + 1) == '-') | 131 | if (argc > 1 && **(argv + 1) == '-') |
| 122 | usage ("ps\n\nReport process status\n\nThis version of ps accepts no options.\n"); | 132 | 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) | |||
| 125 | if (!dir) | 135 | if (!dir) |
| 126 | fatalError("Can't open /proc"); | 136 | fatalError("Can't open /proc"); |
| 127 | 137 | ||
| 138 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 139 | ioctl(fileno(stdout), TIOCGWINSZ, &win); | ||
| 140 | if (win.ws_col > 0) | ||
| 141 | terminal_width = win.ws_col - 1; | ||
| 142 | #endif | ||
| 143 | |||
| 128 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", | 144 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", |
| 129 | "State", "Command"); | 145 | "State", "Command"); |
| 130 | while ((entry = readdir(dir)) != NULL) { | 146 | while ((entry = readdir(dir)) != NULL) { |
| @@ -146,21 +162,21 @@ extern int ps_main(int argc, char **argv) | |||
| 146 | if (*groupName == '\0') | 162 | if (*groupName == '\0') |
| 147 | sprintf(groupName, "%d", p.rgid); | 163 | sprintf(groupName, "%d", p.rgid); |
| 148 | 164 | ||
| 149 | fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName, | 165 | len = fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName, |
| 150 | p.state); | 166 | p.state); |
| 151 | sprintf(path, "/proc/%s/cmdline", entry->d_name); | 167 | sprintf(path, "/proc/%s/cmdline", entry->d_name); |
| 152 | file = fopen(path, "r"); | 168 | file = fopen(path, "r"); |
| 153 | if (file == NULL) | 169 | if (file == NULL) |
| 154 | fatalError("Can't open %s: %s\n", path, strerror(errno)); | 170 | fatalError("Can't open %s: %s\n", path, strerror(errno)); |
| 155 | i = 0; | 171 | i = 0; |
| 156 | while (((c = getc(file)) != EOF) && (i < 53)) { | 172 | while (((c = getc(file)) != EOF) && (i < (terminal_width-len))) { |
| 157 | i++; | 173 | i++; |
| 158 | if (c == '\0') | 174 | if (c == '\0') |
| 159 | c = ' '; | 175 | c = ' '; |
| 160 | putc(c, stdout); | 176 | putc(c, stdout); |
| 161 | } | 177 | } |
| 162 | if (i == 0) | 178 | if (i == 0) |
| 163 | fprintf(stdout, "%s", p.cmd); | 179 | fprintf(stdout, "[%s]", p.cmd); |
| 164 | fprintf(stdout, "\n"); | 180 | fprintf(stdout, "\n"); |
| 165 | } | 181 | } |
| 166 | closedir(dir); | 182 | closedir(dir); |
| @@ -175,19 +191,24 @@ extern int ps_main(int argc, char **argv) | |||
| 175 | * this one uses the nifty new devps kernel device. | 191 | * this one uses the nifty new devps kernel device. |
| 176 | */ | 192 | */ |
| 177 | 193 | ||
| 178 | #include <sys/ioctl.h> | ||
| 179 | #include <linux/devps.h> | 194 | #include <linux/devps.h> |
| 180 | 195 | ||
| 181 | 196 | ||
| 182 | extern int ps_main(int argc, char **argv) | 197 | extern int ps_main(int argc, char **argv) |
| 183 | { | 198 | { |
| 184 | char device[] = "/dev/ps"; | 199 | char device[] = "/dev/ps"; |
| 185 | int i, fd; | 200 | int i, j, len, fd; |
| 186 | pid_t num_pids; | 201 | pid_t num_pids; |
| 187 | pid_t* pid_array = NULL; | 202 | pid_t* pid_array = NULL; |
| 188 | struct pid_info info; | 203 | struct pid_info info; |
| 189 | char uidName[10] = ""; | 204 | char uidName[10] = ""; |
| 190 | char groupName[10] = ""; | 205 | char groupName[10] = ""; |
| 206 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 207 | struct winsize win = { 0, 0 }; | ||
| 208 | int terminal_width = 0; | ||
| 209 | #else | ||
| 210 | #define terminal_width 79 | ||
| 211 | #endif | ||
| 191 | 212 | ||
| 192 | if (argc > 1 && **(argv + 1) == '-') | 213 | if (argc > 1 && **(argv + 1) == '-') |
| 193 | usage("ps-devps\n\nReport process status\n\nThis version of ps accepts no options.\n\n"); | 214 | 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) | |||
| 212 | if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0) | 233 | if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0) |
| 213 | fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); | 234 | fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); |
| 214 | 235 | ||
| 236 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 237 | ioctl(fileno(stdout), TIOCGWINSZ, &win); | ||
| 238 | if (win.ws_col > 0) | ||
| 239 | terminal_width = win.ws_col - 1; | ||
| 240 | #endif | ||
| 241 | |||
| 215 | /* Print up a ps listing */ | 242 | /* Print up a ps listing */ |
| 216 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", | 243 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", |
| 217 | "State", "Command"); | 244 | "State", "Command"); |
| @@ -232,13 +259,19 @@ extern int ps_main(int argc, char **argv) | |||
| 232 | if (*groupName == '\0') | 259 | if (*groupName == '\0') |
| 233 | sprintf(groupName, "%ld", info.egid); | 260 | sprintf(groupName, "%ld", info.egid); |
| 234 | 261 | ||
| 235 | fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state); | 262 | len = fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state); |
| 236 | 263 | ||
| 237 | if (strlen(info.command_line) > 1) | 264 | if (strlen(info.command_line) > 1) { |
| 265 | for( j=0; j<(sizeof(info.command_line)-1) && j < (terminal_width-len); j++) { | ||
| 266 | if (*(info.command_line+j) == '\0' && *(info.command_line+j+1) != '\0') { | ||
| 267 | *(info.command_line+j) = ' '; | ||
| 268 | } | ||
| 269 | } | ||
| 270 | *(info.command_line+j) = '\0'; | ||
| 238 | fprintf(stdout, "%s\n", info.command_line); | 271 | fprintf(stdout, "%s\n", info.command_line); |
| 239 | else | 272 | } else { |
| 240 | fprintf(stdout, "[%s]\n", info.name); | 273 | fprintf(stdout, "[%s]\n", info.name); |
| 241 | 274 | } | |
| 242 | } | 275 | } |
| 243 | 276 | ||
| 244 | /* Free memory */ | 277 | /* Free memory */ |
| @@ -35,6 +35,8 @@ | |||
| 35 | #include <errno.h> | 35 | #include <errno.h> |
| 36 | #include <fcntl.h> | 36 | #include <fcntl.h> |
| 37 | #include <ctype.h> | 37 | #include <ctype.h> |
| 38 | #include <sys/ioctl.h> | ||
| 39 | |||
| 38 | 40 | ||
| 39 | #if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB | 41 | #if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB |
| 40 | 42 | ||
| @@ -116,7 +118,15 @@ extern int ps_main(int argc, char **argv) | |||
| 116 | char path[32], sbuf[512]; | 118 | char path[32], sbuf[512]; |
| 117 | char uidName[10] = ""; | 119 | char uidName[10] = ""; |
| 118 | char groupName[10] = ""; | 120 | char groupName[10] = ""; |
| 119 | int i, c; | 121 | int len, i, c; |
| 122 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 123 | struct winsize win = { 0, 0 }; | ||
| 124 | int terminal_width = 0; | ||
| 125 | #else | ||
| 126 | #define terminal_width 79 | ||
| 127 | #endif | ||
| 128 | |||
| 129 | |||
| 120 | 130 | ||
| 121 | if (argc > 1 && **(argv + 1) == '-') | 131 | if (argc > 1 && **(argv + 1) == '-') |
| 122 | usage ("ps\n\nReport process status\n\nThis version of ps accepts no options.\n"); | 132 | 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) | |||
| 125 | if (!dir) | 135 | if (!dir) |
| 126 | fatalError("Can't open /proc"); | 136 | fatalError("Can't open /proc"); |
| 127 | 137 | ||
| 138 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 139 | ioctl(fileno(stdout), TIOCGWINSZ, &win); | ||
| 140 | if (win.ws_col > 0) | ||
| 141 | terminal_width = win.ws_col - 1; | ||
| 142 | #endif | ||
| 143 | |||
| 128 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", | 144 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", |
| 129 | "State", "Command"); | 145 | "State", "Command"); |
| 130 | while ((entry = readdir(dir)) != NULL) { | 146 | while ((entry = readdir(dir)) != NULL) { |
| @@ -146,21 +162,21 @@ extern int ps_main(int argc, char **argv) | |||
| 146 | if (*groupName == '\0') | 162 | if (*groupName == '\0') |
| 147 | sprintf(groupName, "%d", p.rgid); | 163 | sprintf(groupName, "%d", p.rgid); |
| 148 | 164 | ||
| 149 | fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName, | 165 | len = fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName, |
| 150 | p.state); | 166 | p.state); |
| 151 | sprintf(path, "/proc/%s/cmdline", entry->d_name); | 167 | sprintf(path, "/proc/%s/cmdline", entry->d_name); |
| 152 | file = fopen(path, "r"); | 168 | file = fopen(path, "r"); |
| 153 | if (file == NULL) | 169 | if (file == NULL) |
| 154 | fatalError("Can't open %s: %s\n", path, strerror(errno)); | 170 | fatalError("Can't open %s: %s\n", path, strerror(errno)); |
| 155 | i = 0; | 171 | i = 0; |
| 156 | while (((c = getc(file)) != EOF) && (i < 53)) { | 172 | while (((c = getc(file)) != EOF) && (i < (terminal_width-len))) { |
| 157 | i++; | 173 | i++; |
| 158 | if (c == '\0') | 174 | if (c == '\0') |
| 159 | c = ' '; | 175 | c = ' '; |
| 160 | putc(c, stdout); | 176 | putc(c, stdout); |
| 161 | } | 177 | } |
| 162 | if (i == 0) | 178 | if (i == 0) |
| 163 | fprintf(stdout, "%s", p.cmd); | 179 | fprintf(stdout, "[%s]", p.cmd); |
| 164 | fprintf(stdout, "\n"); | 180 | fprintf(stdout, "\n"); |
| 165 | } | 181 | } |
| 166 | closedir(dir); | 182 | closedir(dir); |
| @@ -175,19 +191,24 @@ extern int ps_main(int argc, char **argv) | |||
| 175 | * this one uses the nifty new devps kernel device. | 191 | * this one uses the nifty new devps kernel device. |
| 176 | */ | 192 | */ |
| 177 | 193 | ||
| 178 | #include <sys/ioctl.h> | ||
| 179 | #include <linux/devps.h> | 194 | #include <linux/devps.h> |
| 180 | 195 | ||
| 181 | 196 | ||
| 182 | extern int ps_main(int argc, char **argv) | 197 | extern int ps_main(int argc, char **argv) |
| 183 | { | 198 | { |
| 184 | char device[] = "/dev/ps"; | 199 | char device[] = "/dev/ps"; |
| 185 | int i, fd; | 200 | int i, j, len, fd; |
| 186 | pid_t num_pids; | 201 | pid_t num_pids; |
| 187 | pid_t* pid_array = NULL; | 202 | pid_t* pid_array = NULL; |
| 188 | struct pid_info info; | 203 | struct pid_info info; |
| 189 | char uidName[10] = ""; | 204 | char uidName[10] = ""; |
| 190 | char groupName[10] = ""; | 205 | char groupName[10] = ""; |
| 206 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 207 | struct winsize win = { 0, 0 }; | ||
| 208 | int terminal_width = 0; | ||
| 209 | #else | ||
| 210 | #define terminal_width 79 | ||
| 211 | #endif | ||
| 191 | 212 | ||
| 192 | if (argc > 1 && **(argv + 1) == '-') | 213 | if (argc > 1 && **(argv + 1) == '-') |
| 193 | usage("ps-devps\n\nReport process status\n\nThis version of ps accepts no options.\n\n"); | 214 | 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) | |||
| 212 | if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0) | 233 | if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0) |
| 213 | fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); | 234 | fatalError("\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); |
| 214 | 235 | ||
| 236 | #ifdef BB_FEATURE_AUTOWIDTH | ||
| 237 | ioctl(fileno(stdout), TIOCGWINSZ, &win); | ||
| 238 | if (win.ws_col > 0) | ||
| 239 | terminal_width = win.ws_col - 1; | ||
| 240 | #endif | ||
| 241 | |||
| 215 | /* Print up a ps listing */ | 242 | /* Print up a ps listing */ |
| 216 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", | 243 | fprintf(stdout, "%5s %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", |
| 217 | "State", "Command"); | 244 | "State", "Command"); |
| @@ -232,13 +259,19 @@ extern int ps_main(int argc, char **argv) | |||
| 232 | if (*groupName == '\0') | 259 | if (*groupName == '\0') |
| 233 | sprintf(groupName, "%ld", info.egid); | 260 | sprintf(groupName, "%ld", info.egid); |
| 234 | 261 | ||
| 235 | fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state); | 262 | len = fprintf(stdout, "%5d %-8s %-8s %c ", info.pid, uidName, groupName, info.state); |
| 236 | 263 | ||
| 237 | if (strlen(info.command_line) > 1) | 264 | if (strlen(info.command_line) > 1) { |
| 265 | for( j=0; j<(sizeof(info.command_line)-1) && j < (terminal_width-len); j++) { | ||
| 266 | if (*(info.command_line+j) == '\0' && *(info.command_line+j+1) != '\0') { | ||
| 267 | *(info.command_line+j) = ' '; | ||
| 268 | } | ||
| 269 | } | ||
| 270 | *(info.command_line+j) = '\0'; | ||
| 238 | fprintf(stdout, "%s\n", info.command_line); | 271 | fprintf(stdout, "%s\n", info.command_line); |
| 239 | else | 272 | } else { |
| 240 | fprintf(stdout, "[%s]\n", info.name); | 273 | fprintf(stdout, "[%s]\n", info.name); |
| 241 | 274 | } | |
| 242 | } | 275 | } |
| 243 | 276 | ||
| 244 | /* Free memory */ | 277 | /* Free memory */ |
| @@ -26,8 +26,12 @@ | |||
| 26 | 26 | ||
| 27 | extern int reboot_main(int argc, char **argv) | 27 | extern int reboot_main(int argc, char **argv) |
| 28 | { | 28 | { |
| 29 | #ifdef BB_FEATURE_LINUXRC | ||
| 29 | /* don't assume init's pid == 1 */ | 30 | /* don't assume init's pid == 1 */ |
| 30 | exit(kill(findPidByName("init"), SIGINT)); | 31 | exit(kill(findPidByName("init"), SIGINT)); |
| 32 | #else | ||
| 33 | exit(kill(1, SIGINT)); | ||
| 34 | #endif | ||
| 31 | } | 35 | } |
| 32 | 36 | ||
| 33 | /* | 37 | /* |
| @@ -1247,7 +1247,7 @@ extern int device_open(char *device, int mode) | |||
| 1247 | #endif /* BB_INIT BB_SYSLOGD */ | 1247 | #endif /* BB_INIT BB_SYSLOGD */ |
| 1248 | 1248 | ||
| 1249 | 1249 | ||
| 1250 | #if defined BB_INIT || defined BB_HALT || defined BB_REBOOT || defined BB_KILLALL | 1250 | #if defined BB_KILLALL || defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF ) |
| 1251 | 1251 | ||
| 1252 | #ifdef BB_FEATURE_USE_DEVPS_N_DEVMTAB | 1252 | #ifdef BB_FEATURE_USE_DEVPS_N_DEVMTAB |
| 1253 | #include <linux/devps.h> | 1253 | #include <linux/devps.h> |
| @@ -1318,6 +1318,7 @@ extern pid_t findPidByName( char* pidName) | |||
| 1318 | #if ! defined BB_FEATURE_USE_PROCFS | 1318 | #if ! defined BB_FEATURE_USE_PROCFS |
| 1319 | #error Sorry, I depend on the /proc filesystem right now. | 1319 | #error Sorry, I depend on the /proc filesystem right now. |
| 1320 | #endif | 1320 | #endif |
| 1321 | |||
| 1321 | /* findPidByName() | 1322 | /* findPidByName() |
| 1322 | * | 1323 | * |
| 1323 | * This finds the pid of the specified process. | 1324 | * This finds the pid of the specified process. |
| @@ -1330,15 +1331,24 @@ extern pid_t findPidByName( char* pidName) | |||
| 1330 | */ | 1331 | */ |
| 1331 | extern pid_t findPidByName( char* pidName) | 1332 | extern pid_t findPidByName( char* pidName) |
| 1332 | { | 1333 | { |
| 1333 | pid_t thePid; | 1334 | DIR *dir; |
| 1334 | char filename[256]; | 1335 | struct dirent *next; |
| 1335 | char buffer[256]; | ||
| 1336 | 1336 | ||
| 1337 | /* no need to opendir ;) */ | 1337 | dir = opendir("/proc"); |
| 1338 | for (thePid = 1; thePid < 65536; thePid++) { | 1338 | if (!dir) |
| 1339 | fatalError( "Cannot open /proc: %s\n", strerror (errno)); | ||
| 1340 | |||
| 1341 | while ((next = readdir(dir)) != NULL) { | ||
| 1339 | FILE *status; | 1342 | FILE *status; |
| 1343 | char filename[256]; | ||
| 1344 | char buffer[256]; | ||
| 1345 | |||
| 1346 | /* If it isn't a number, we don't want it */ | ||
| 1347 | if (!isdigit(*next->d_name)) | ||
| 1348 | continue; | ||
| 1340 | 1349 | ||
| 1341 | sprintf(filename, "/proc/%d/cmdline", thePid); | 1350 | /* Now open the command line file */ |
| 1351 | sprintf(filename, "/proc/%s/status", next->d_name); | ||
| 1342 | status = fopen(filename, "r"); | 1352 | status = fopen(filename, "r"); |
| 1343 | if (!status) { | 1353 | if (!status) { |
| 1344 | continue; | 1354 | continue; |
| @@ -1347,13 +1357,13 @@ extern pid_t findPidByName( char* pidName) | |||
| 1347 | fclose(status); | 1357 | fclose(status); |
| 1348 | 1358 | ||
| 1349 | if ((strstr(buffer, pidName) != NULL)) { | 1359 | if ((strstr(buffer, pidName) != NULL)) { |
| 1350 | return thePid; | 1360 | return strtol(next->d_name, NULL, 0); |
| 1351 | } | 1361 | } |
| 1352 | } | 1362 | } |
| 1353 | return 0; | 1363 | return 0; |
| 1354 | } | 1364 | } |
| 1355 | #endif /* BB_FEATURE_USE_DEVPS_N_DEVMTAB */ | 1365 | #endif /* BB_FEATURE_USE_DEVPS_N_DEVMTAB */ |
| 1356 | #endif /* BB_INIT || BB_HALT || BB_REBOOT || KILLALL */ | 1366 | #endif /* BB_INIT || BB_HALT || BB_REBOOT || BB_KILLALL || BB_POWEROFF */ |
| 1357 | 1367 | ||
| 1358 | #if defined BB_GUNZIP \ | 1368 | #if defined BB_GUNZIP \ |
| 1359 | || defined BB_GZIP \ | 1369 | || defined BB_GZIP \ |
