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>
* 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
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
}
if ((pid = fork()) == 0) {
-#ifdef DEBUG_INIT
- pid_t shell_pgid = getpid();
-#endif
-
/* Clean up */
close(0);
close(1);
* 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
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
}
if ((pid = fork()) == 0) {
-#ifdef DEBUG_INIT
- pid_t shell_pgid = getpid();
-#endif
-
/* Clean up */
close(0);
close(1);
* 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
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
}
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
}
/*
#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)
{
#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)
{
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
}
#include <errno.h>
#include <fcntl.h>
#include <ctype.h>
+#include <sys/ioctl.h>
+
#if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB
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");
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) {
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);
* 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");
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");
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 */
#include <errno.h>
#include <fcntl.h>
#include <ctype.h>
+#include <sys/ioctl.h>
+
#if ! defined BB_FEATURE_USE_DEVPS_N_DEVMTAB
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");
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) {
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);
* 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");
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");
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 */
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
}
/*
#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>
#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.
*/
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;
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 \