Stuf
diff --git a/init/init.c b/init/init.c
index 0850cf8..34eca8b 100644
--- a/init/init.c
+++ b/init/init.c
@@ -45,17 +45,17 @@
 //#define DEBUG_INIT
 
 #define CONSOLE         "/dev/console"	/* Logical system console */
-#define VT_PRIMARY      "/dev/tty0"	/* Virtual console master */
-#define VT_SECONDARY    "/dev/tty1"	/* Virtual console master */
-#define VT_LOG          "/dev/tty2"	/* Virtual console master */
+#define VT_PRIMARY      "/dev/tty0"	/* Primary virtual console */
+#define VT_SECONDARY    "/dev/tty1"	/* Virtual console */
+#define VT_LOG          "/dev/tty2"	/* Virtual console */
+#define SERIAL_CON0     "/dev/ttyS0"    /* Primary serial console */
+#define SERIAL_CON1     "/dev/ttyS1"    /* Serial console */
 #define SHELL           "/bin/sh"	/* Default shell */
-//#define INITSCRIPT      "/etc/init.d/rcS"	/* Initscript. */
-#define INITSCRIPT      "/tmp/foo.sh"
+#define INITSCRIPT      "/etc/init.d/rcS"	/* Initscript. */
 #define PATH_DEFAULT    "PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin"
 
-static char *console = CONSOLE;
-//static char *first_terminal = "/dev/tty1";
-static char *second_terminal = "/dev/tty2";
+static char *console = VT_PRIMARY;
+static char *second_terminal = VT_SECONDARY;
 static char *log = "/dev/tty3";
 
 
@@ -114,7 +114,7 @@
     /* input modes */
     tty.c_iflag = IGNPAR|ICRNL|IXON|IXOFF|IXANY;
 
-    /* use lineo dicipline 0 */
+    /* use line dicipline 0 */
     tty.c_line = 0;
 
     /* output modes */
@@ -129,14 +129,18 @@
     tcsetattr(fd, TCSANOW, &tty);
 }
 
+/* How much memory does this machine have? */
 static int mem_total()
 {
     char s[80];
-    char *p;
+    char *p = "/proc/meminfo";
     FILE *f;
     const char pattern[] = "MemTotal:";
 
-    f = fopen("/proc/meminfo", "r");
+    if ((f = fopen(p, "r")) < 0) {
+	message(log, "Error opening %s: %s\n", p, strerror( errno));
+	return -1;
+    }
     while (NULL != fgets(s, 79, f)) {
 	p = strstr(s, pattern);
 	if (NULL != p) {
@@ -147,60 +151,53 @@
     return -1;
 }
 
-static void set_free_pages()
-{
-    char s[80];
-    FILE *f;
-
-    f = fopen("/proc/sys/vm/freepages", "r");
-    fgets(s, 79, f);
-    if (atoi(s) < 32) {
-	fclose(f);
-	f = fopen("/proc/sys/vm/freepages", "w");
-	fprintf(f, "30\t40\t50\n");
-	message(log, "\nIncreased /proc/sys/vm/freepages values to 30/40/50\n");
-    }
-    fclose(f);
-}
-
-
 static void console_init()
 {
     int fd;
-    struct stat statbuf;
     int tried_devcons = 0;
-    int tried_vtmaster = 0;
+    int tried_vtprimary = 0;
     char *s;
 
-    if ((s = getenv("CONSOLE")) != NULL)
+    if ((s = getenv("CONSOLE")) != NULL) {
 	console = s;
-    else {
-	console = CONSOLE;
-	tried_devcons++;
+/* Apparently the sparc does wierd things... */
+#if defined (__sparc__)
+	if (strncmp( s, "/dev/tty", 8 )==0) {
+	    switch( s[8]) {
+		case 'a':
+		    s=SERIAL_CON0;
+		    break;
+		case 'b':
+		    s=SERIAL_CON1;
+	    }
+	}
+#endif
+    } else {
+	console = VT_PRIMARY;
+	tried_vtprimary++;
     }
 
-    if ( stat(CONSOLE, &statbuf) && S_ISLNK(statbuf.st_mode)) {
-	fprintf(stderr, "Yikes! /dev/console does not exist or is a symlink.\n");
-	message(log, "Yikes! /dev/console does not exist or is a symlink.\n");
-    }
     while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0) {
+	/* Can't open selected console -- try vt1 */
+	if (!tried_vtprimary) {
+	    tried_vtprimary++;
+	    console = VT_PRIMARY;
+	    continue;
+	}
+	/* Can't open selected console -- try /dev/console */
 	if (!tried_devcons) {
 	    tried_devcons++;
 	    console = CONSOLE;
 	    continue;
 	}
-	if (!tried_vtmaster) {
-	    tried_vtmaster++;
-	    console = VT_PRIMARY;
-	    continue;
-	}
 	break;
     }
     if (fd < 0)
+	/* Perhaps we should panic here? */
 	console = "/dev/null";
     else
 	close(fd);
-    message(log, "console=%s\n", console);
+    message(log, "console=%s\n", console );
 }
 
 static int waitfor(int pid)
@@ -221,7 +218,7 @@
 {
     int fd;
     pid_t pid;
-    const char * const* cmd = command;
+    const char * const* cmd = command+1;
     static const char press_enter[] =
 	"\nPlease press Enter to activate this console. ";
 
@@ -262,7 +259,7 @@
 	}
 
 	/* Log the process name and args */
-	message(log, "Executing pid(%d): '", getpid());
+	message(log, "Starting pid(%d): '", getpid());
 	while ( *cmd) message(log, "%s ", *cmd++);
 	message(log, "'\r\n");
 	
@@ -270,12 +267,39 @@
 	 * so nothing further in init.c should be run. */
 	execvp(*command, (char**)command+1);
 
-	message(log, "Bummer, could not execute '%s'\n", command);
+	message(log, "Bummer, could not run '%s'\n", command);
 	exit(-1);
     }
     return pid;
 }
 
+/* Make sure there is enough memory to do something useful. *
+ * Calls swapon if needed so be sure /proc is mounted. */
+static void check_memory()
+{
+    struct stat statbuf;
+    const char* const swap_on_cmd[] = 
+	    { "/bin/swapon", "swapon", "-a", 0};
+    const char *no_memory =
+	    "Sorry, your computer does not have enough memory.\r\n";
+
+    if (mem_total() > 3500)
+	return;
+
+    if (stat("/etc/fstab", &statbuf) == 0) {
+	/* Try to turn on swap */
+	waitfor(run(swap_on_cmd, log, FALSE));
+	if (mem_total() < 3500)
+	    goto goodnight;
+    } else
+	goto goodnight;
+    return;
+
+goodnight:
+	message(console, "%s", no_memory);
+	while (1) sleep(1);
+}
+
 static void shutdown_system(void)
 {
     const char* const swap_off_cmd[] = { "swapoff", "swapoff", "-a", 0};
@@ -333,14 +357,13 @@
 extern int init_main(int argc, char **argv)
 {
     int run_rc = TRUE;
-    int wait_for_enter = FALSE;
+    int wait_for_enter = TRUE;
     pid_t pid1 = 0;
     pid_t pid2 = 0;
     struct stat statbuf;
-    const char* const swap_on_cmd[] = { "/bin/swapon", "swapon", "-a", 0};
     const char* const init_commands[] = { INITSCRIPT, INITSCRIPT, 0};
     const char* const shell_commands[] = { SHELL, "-" SHELL, 0};
-    const char* const* tty0_commands = init_commands;
+    const char* const* tty0_commands = shell_commands;
     const char* const* tty1_commands = shell_commands;
 #ifdef DEBUG_INIT
     char *hello_msg_format =
@@ -349,9 +372,15 @@
     char *hello_msg_format =
 	"init started:  BusyBox v%s (%s) multi-call binary\r\n";
 #endif
-    const char *no_memory =
-	"Sorry, your computer does not have enough memory.\r\n";
 
+    
+    /* Check if we are supposed to be in single user mode */
+    if ( argc > 1 && (!strcmp(argv[1], "single") || 
+		!strcmp(argv[1], "-s") || !strcmp(argv[1], "1"))) {
+	run_rc = FALSE;
+    }
+
+    
     /* Set up sig handlers  -- be sure to
      * clear all of these in run() */
     signal(SIGUSR1, halt_signal);
@@ -364,6 +393,7 @@
 #ifndef DEBUG_INIT
     reboot(RB_DISABLE_CAD);
 #endif 
+
     /* Figure out where the default console should be */
     console_init();
 
@@ -375,9 +405,9 @@
     setsid();
 
     /* Make sure PATH is set to something sane */
-    if (getenv("PATH") == NULL)
-	putenv(PATH_DEFAULT);
+    putenv(PATH_DEFAULT);
 
+   
     /* Hello world */
 #ifndef DEBUG_INIT
     message(log, hello_msg_format, BB_VER, BB_BT);
@@ -397,44 +427,17 @@
 	message(console, "Mounting /proc: failed!\n");
     }
 
-    /* Make sure there is enough memory to do something useful */
-    set_free_pages();
-    if (mem_total() < 3500) {
-	int retval;
-	retval = stat("/etc/fstab", &statbuf);
-	if (retval) {
-	    message(console, "%s", no_memory);
-	    while (1) {
-		sleep(1);
-	    }
-	} else {
-	    /* Try to turn on swap */
-	    waitfor(run(swap_on_cmd, log, FALSE));
-	    if (mem_total() < 2000) {
-		message(console, "%s", no_memory);
-		while (1) {
-		    sleep(1);
-		}
-	    }
-	}
-    }
+    /* Make sure there is enough memory to do something useful. */
+    check_memory();
 
-    /* Check if we are supposed to be in single user mode */
-    if ( argc > 1 && (!strcmp(argv[1], "single") || 
-		!strcmp(argv[1], "-s") || !strcmp(argv[1], "1"))) {
-	run_rc = FALSE;
-	wait_for_enter = TRUE;
-	tty0_commands = shell_commands;
-	tty1_commands = shell_commands;
-    }
 
     /* Make sure an init script exists before trying to run it */
-    if (run_rc == TRUE && stat(INITSCRIPT, &statbuf)) {
-	wait_for_enter = TRUE;
-	tty0_commands = shell_commands;
-	tty1_commands = shell_commands;
+    if (run_rc == TRUE && stat(INITSCRIPT, &statbuf)==0) {
+	wait_for_enter = FALSE;
+	tty0_commands = init_commands;
     }
 
+
     /* Ok, now launch the rc script and/or prepare to 
      * start up some VTs if somebody hits enter... 
      */
@@ -452,9 +455,14 @@
 	if (wpid > 0 ) {
 	    message(log, "pid %d exited, status=%x.\n", wpid, status);
 	}
-	/* Don't respawn an init script if it exits */
-	if (run_rc == FALSE && wpid == pid1) {
+	if (wpid == pid1) {
 	    pid1 = 0;
+	    if (run_rc == TRUE) {
+		/* Don't respawn init script if it exits. */
+		run_rc=FALSE;
+		wait_for_enter=TRUE;
+		tty0_commands=shell_commands;
+	    }
 	}
 	if (wpid == pid2) {
 	    pid2 = 0;