Init is now _more_ perfect then before.
 -Erik
diff --git a/init.c b/init.c
index 95c2322..0472208 100644
--- a/init.c
+++ b/init.c
@@ -319,22 +319,6 @@
     message(LOG, "console=%s\n", console );
 }
 
-static int waitfor(int pid)
-{
-    int status, wpid;
-
-    while (1) {
-	wpid = wait(&status);
-	if (wpid > 0 ) {
-	    message(LOG, "pid %d exited, status=0x%x.\n", wpid, status);
-	    break;
-	}
-	if (wpid == pid )
-	    break;
-    }
-    return wpid;
-}
-
 static pid_t run(char* command, 
 	char *terminal, int get_enter)
 {
@@ -415,18 +399,37 @@
     return pid;
 }
 
+static int waitfor(char* command, 
+	char *terminal, int get_enter)
+{
+    int status, wpid;
+    int pid = run( command, terminal, get_enter);
+
+    while (1) {
+	wpid = wait(&status);
+	if (wpid > 0 ) {
+	    message(LOG, "Process '%s' (pid %d) exited.\n", 
+			    command, wpid);
+	    break;
+	}
+	if (wpid == pid )
+	    break;
+    }
+    return wpid;
+}
+
 /* 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;
+    struct stat statBuf;
 
     if (mem_total() > 3500)
 	return;
 
-    if (stat("/etc/fstab", &statbuf) == 0) {
+    if (stat("/etc/fstab", &statBuf) == 0) {
 	/* Try to turn on swap */
-	waitfor(run("/bin/swapon swapon -a", log, FALSE));
+	waitfor("/bin/swapon swapon -a", log, FALSE);
 	if (mem_total() < 3500)
 	    goto goodnight;
     } else
@@ -457,13 +460,12 @@
     sleep(1);
 
     message(CONSOLE, "Disabling swap.\r\n");
-    waitfor(run( "swapoff -a", console, FALSE));
+    waitfor( "swapoff -a", console, FALSE);
     message(CONSOLE, "Unmounting filesystems.\r\n");
-    waitfor(run( "umount -a", console, FALSE));
+    waitfor("umount -a", console, FALSE);
     sync();
     if (kernel_version > 0 && kernel_version <= 2 * 65536 + 2 * 256 + 11) {
 	/* bdflush, kupdate not needed for kernels >2.2.11 */
-	message(CONSOLE, "Flushing buffers.\r\n");
 	bdflush(1, 0);
 	sync();
     }
@@ -503,23 +505,26 @@
     /* If BusyBox detects that a serial console is in use, 
      * then entries containing non-empty id fields will _not_ be run.
      */
-    if (second_console != NULL && *cons != '\0')
+    if (second_console == NULL && *cons != '\0') {
 	return;
+    }
 
     newAction = calloc ((size_t)(1), sizeof(initAction));
     if (!newAction) {
-	fprintf(stderr, "Memory allocation failure\n");
+	message(LOG|CONSOLE,"Memory allocation failure\n");
 	while (1) sleep(1);
     }
     newAction->nextPtr = initActionList;
     initActionList = newAction;
     strncpy( newAction->process, process, 255);
     newAction->action = a->action;
-    if (*cons != '\0')
+    if (*cons != '\0') {
 	strncpy(newAction->console, cons, 255);
-    else
+    } else
 	strncpy(newAction->console, console, 255);
     newAction->pid = 0;
+    message(LOG|CONSOLE, "process='%s' action='%d' console='%s'\n",
+	    newAction->process, newAction->action, newAction->console);
 }
 
 void delete_initAction (initAction *action)
@@ -545,7 +550,7 @@
 {
 #ifdef BB_FEATURE_USE_INITTAB
     FILE* file;
-    char buf[256], buf1[256];
+    char buf[256], lineAsRead[256], tmpConsole[256];
     char *p, *q, *r, *s;
     const struct initActionType *a = actions;
     int foundIt;
@@ -578,7 +583,8 @@
 	    *q='\0';
 
 	/* Keep a copy around for posterity's sake (and error msgs) */
-	strcpy(buf1, buf);
+	strcpy(lineAsRead, buf);
+message(LOG|CONSOLE, "read='%s'\n", lineAsRead);
 
 	/* Grab the ID field */
 	s=p;
@@ -592,7 +598,7 @@
 	 * of the string */
 	q = strrchr( p, ':');
 	if ( q == NULL || *(q+1) == '\0' ) {
-	    fprintf(stderr, "Bad inittab entry: %s\n", buf1);
+	    message(LOG|CONSOLE,"Bad inittab entry: %s\n", lineAsRead);
 	    continue;
 	} else {
 	    *q='\0';
@@ -602,7 +608,7 @@
 	/* Now peal off the action field */
 	r = strrchr( p, ':');
 	if ( r == NULL || *(r+1) == '\0') {
-	    fprintf(stderr, "Bad inittab entry: %s\n", buf1);
+	    message(LOG|CONSOLE,"Bad inittab entry: %s\n", lineAsRead);
 	    continue;
 	} else {
 	    ++r;
@@ -612,6 +618,16 @@
 	a = actions;
 	while (a->name != 0) {
 	    if (strcmp(a->name, r) == 0) {
+		if (*s != '\0') {
+		    struct stat statBuf;
+		    strcpy(tmpConsole, "/dev/");
+		    strncat(tmpConsole, s, 200);
+		    if (stat(tmpConsole, &statBuf) != 0) {
+			message(LOG|CONSOLE, "device '%s' does not exist.  Did you read the directions?\n", tmpConsole);
+			break;
+		    }
+		    s = tmpConsole;
+		}
 		new_initAction( a, q, s);
 		foundIt=TRUE;
 	    }
@@ -621,7 +637,7 @@
 	    continue;
 	else {
 	    /* Choke on an unknown action */
-	    fprintf(stderr, "Bad inittab entry: %s\n", buf1);
+	    message(LOG|CONSOLE, "Bad inittab entry: %s\n", lineAsRead);
 	}
     }
     return;
@@ -670,11 +686,11 @@
    
     /* Hello world */
 #ifndef DEBUG_INIT
-    message(CONSOLE|LOG, 
+    message(LOG|CONSOLE, 
 	    "init started:  BusyBox v%s (%s) multi-call binary\r\n", 
 	    BB_VER, BB_BT);
 #else
-    message(CONSOLE|LOG, 
+    message(LOG|CONSOLE, 
 	    "init(%d) started:  BusyBox v%s (%s) multi-call binary\r\n", 
 	    getpid(), BB_VER, BB_BT);
 #endif
@@ -682,10 +698,10 @@
     
     /* Mount /proc */
     if (mount ("proc", "/proc", "proc", 0, 0) == 0) {
-	message(CONSOLE|LOG, "Mounting /proc: done.\n");
+	message(LOG|CONSOLE, "Mounting /proc: done.\n");
 	kernel_version = get_kernel_revision();
     } else
-	message(CONSOLE|LOG, "Mounting /proc: failed!\n");
+	message(LOG|CONSOLE, "Mounting /proc: failed!\n");
 
     /* Make sure there is enough memory to do something useful. */
     check_memory();
@@ -711,10 +727,11 @@
 
     /* Now run everything that needs to be run */
 
+    message(LOG|CONSOLE, "Running SYSINIT\n");
     /* First run the sysinit command */
     for( a=initActionList ; a; a=a->nextPtr) {
 	if (a->action == SYSINIT) {
-	    waitfor(run(a->process, console, FALSE));
+	    waitfor(a->process, console, FALSE);
 	    /* Now remove the "sysinit" entry from the list */
 	    delete_initAction( a);
 	}
@@ -722,7 +739,7 @@
     /* Next run anything that wants to block */
     for( a=initActionList ; a; a=a->nextPtr) {
 	if (a->action == WAIT) {
-	    waitfor(run(a->process, console, FALSE));
+	    waitfor(a->process, console, FALSE);
 	    /* Now remove the "wait" entry from the list */
 	    delete_initAction( a);
 	}
@@ -735,9 +752,15 @@
 	    delete_initAction( a);
 	}
     }
+    /* If there is nothing else to do, stop */
+    if (initActionList == NULL) {
+	message(LOG|CONSOLE, "No more tasks for init -- sleeping forever.\n");
+	while (1) sleep(1);
+    }
 
     /* Now run the looping stuff for the rest of forever */
     while (1) {
+	message(LOG|CONSOLE, "Looping\n");
 	for( a=initActionList ; a; a=a->nextPtr) {
 	    /* Only run stuff with pid==0.  If they have
 	     * a pid, that means they are still running */