*/
#include "internal.h"
-#include <asm/types.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <errno.h>
-#include <linux/serial.h> /* for serial_struct */
-#include <linux/version.h>
#include <paths.h>
#include <signal.h>
#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <asm/types.h>
+#include <linux/serial.h> /* for serial_struct */
+#include <linux/version.h>
+#include <linux/reboot.h>
+#include <linux/unistd.h>
#include <sys/fcntl.h>
#include <sys/ioctl.h>
-#include <sys/kdaemon.h>
#include <sys/mount.h>
-#include <sys/reboot.h>
-#include <sys/sysinfo.h> /* For check_free_memory() */
-#ifdef BB_SYSLOGD
-# include <sys/syslog.h>
-#endif
-#include <sys/sysmacros.h>
#include <sys/types.h>
#include <sys/vt.h> /* for vt_stat */
#include <sys/wait.h>
-#include <termios.h>
-#include <unistd.h>
+#ifdef BB_SYSLOGD
+# include <sys/syslog.h>
+#endif
+
+
+#ifndef RB_HALT_SYSTEM
+#define RB_HALT_SYSTEM 0xcdef0123
+#define RB_ENABLE_CAD 0x89abcdef
+#define RB_DISABLE_CAD 0
+#define RB_POWER_OFF 0x4321fedc
+#define RB_AUTOBOOT 0x01234567
+#if defined(__GLIBC__)
+#include <sys/reboot.h>
+ #define init_reboot(magic) reboot(magic)
+#else
+ #define init_reboot(magic) reboot(0xfee1dead, 672274793, magic)
+#endif
+#endif
+
+#ifndef _PATH_STDPATH
+#define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin"
+#endif
#if defined BB_FEATURE_INIT_COREDUMPS
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#endif
+#if defined(__GLIBC__)
+#include <sys/kdaemon.h>
+#else
+static _syscall2(int, bdflush, int, func, int, data);
+#endif /* __GLIBC__ */
+
#define VT_PRIMARY "/dev/tty1" /* Primary virtual console */
#define VT_SECONDARY "/dev/tty2" /* Virtual console */
{
struct sysinfo info;
+ /* Pre initialize mem_unit in case this kernel is something prior to
+ * the linux 2.4 kernel (which will actually fill in mem_unit... */
sysinfo(&info);
if (sysinfo(&info) != 0) {
- message(LOG, "Error checking free memory: %s\n", strerror(errno));
+ printf("Error checking free memory: %s\n", strerror(errno));
return -1;
}
+ if (info.mem_unit==0) {
+ /* Looks like we have a kernel prior to Linux 2.4.x */
+ info.mem_unit=1024;
+ info.totalram/=info.mem_unit;
+ info.totalswap/=info.mem_unit;
+ } else {
+ /* Bah. Linux 2.4.x completely changed sysinfo. This can in theory
+ overflow a 32 bit unsigned long, but who puts more then 4GiB ram+swap
+ on an embedded system? */
+ info.mem_unit/=1024;
+ info.totalram*=info.mem_unit;
+ info.totalswap*=info.mem_unit;
+ }
- return((info.totalram+info.totalswap)/1024);
+ return(info.totalram+info.totalswap);
}
static void console_init()
signal(SIGHUP, SIG_DFL);
/* Allow Ctrl-Alt-Del to reboot system. */
- reboot(RB_ENABLE_CAD);
+ init_reboot(RB_ENABLE_CAD);
message(CONSOLE|LOG, "\r\nThe system is going down NOW !!\r\n");
sync();
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
if (sig == SIGUSR2)
- reboot(RB_POWER_OFF);
+ init_reboot(RB_POWER_OFF);
else
#endif
- reboot(RB_HALT_SYSTEM);
+ init_reboot(RB_HALT_SYSTEM);
exit(0);
}
/* allow time for last message to reach serial console */
sleep(2);
- reboot(RB_AUTOBOOT);
+ init_reboot(RB_AUTOBOOT);
exit(0);
}
#ifdef BB_FEATURE_USE_INITTAB
FILE *file;
char buf[256], lineAsRead[256], tmpConsole[256];
- char *p, *q, *r, *s;
+ char *id, *runlev, *action, *process, *eol;
const struct initActionType *a = actions;
int foundIt;
while (fgets(buf, 255, file) != NULL) {
foundIt = FALSE;
- for (p = buf; *p == ' ' || *p == '\t'; p++);
- if (*p == '#' || *p == '\n')
+ /* Skip leading spaces */
+ for (id = buf; *id == ' ' || *id == '\t'; id++);
+
+ /* Skip the line if it's a comment */
+ if (*id == '#' || *id == '\n')
continue;
/* Trim the trailing \n */
- q = strrchr(p, '\n');
- if (q != NULL)
- *q = '\0';
+ eol = strrchr(id, '\n');
+ if (eol != NULL)
+ *eol = '\0';
/* Keep a copy around for posterity's sake (and error msgs) */
strcpy(lineAsRead, buf);
- /* Grab the ID field */
- s = p;
- p = strchr(p, ':');
- if (p != NULL || *(p + 1) != '\0') {
- *p = '\0';
- ++p;
+ /* Separate the ID field from the runlevels */
+ runlev = strchr(id, ':');
+ if (runlev == NULL || *(runlev + 1) == '\0') {
+ message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
+ continue;
+ } else {
+ *runlev = '\0';
+ ++runlev;
}
- /* Now peel off the process field from the end
- * of the string */
- q = strrchr(p, ':');
- if (q == NULL || *(q + 1) == '\0') {
+ /* Separate the runlevels from the action */
+ action = strchr(runlev, ':');
+ if (action == NULL || *(action + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue;
} else {
- *q = '\0';
- ++q;
+ *action = '\0';
+ ++action;
}
- /* Now peel off the action field */
- r = strrchr(p, ':');
- if (r == NULL || *(r + 1) == '\0') {
+ /* Separate the action from the process */
+ process = strchr(action, ':');
+ if (process == NULL || *(process + 1) == '\0') {
message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
continue;
} else {
- ++r;
+ *process = '\0';
+ ++process;
}
/* Ok, now process it */
a = actions;
while (a->name != 0) {
- if (strcmp(a->name, r) == 0) {
- if (*s != '\0') {
+ if (strcmp(a->name, action) == 0) {
+ if (*id != '\0') {
struct stat statBuf;
strcpy(tmpConsole, "/dev/");
- strncat(tmpConsole, s, 200);
+ strncat(tmpConsole, id, 200);
if (stat(tmpConsole, &statBuf) != 0) {
message(LOG | CONSOLE,
"device '%s' does not exist. Did you read the directions?\n",
tmpConsole);
break;
}
- s = tmpConsole;
+ id = tmpConsole;
}
- new_initAction(a->action, q, s);
+ new_initAction(a->action, process, id);
foundIt = TRUE;
}
a++;
/* Turn off rebooting via CTL-ALT-DEL -- we get a
* SIGINT on CAD so we can shut things down gracefully... */
- reboot(RB_DISABLE_CAD);
+ init_reboot(RB_DISABLE_CAD);
#endif
/* Figure out what kernel this is running */