Add in some (theoretical) uClinux support.  Some init cleanups
diff --git a/init/init.c b/init/init.c
index b6eaa46..1a5056c 100644
--- a/init/init.c
+++ b/init/init.c
@@ -75,6 +75,12 @@
 };
 
 
+#if (__GNU_LIBRARY__ > 5) || defined(__dietlibc__) 
+  #include <sys/reboot.h>
+  #define init_reboot(magic) reboot(magic)
+#else
+  #define init_reboot(magic) reboot(0xfee1dead, 672274793, magic)
+#endif
 
 #ifndef RB_HALT_SYSTEM
 static const int RB_HALT_SYSTEM = 0xcdef0123;
@@ -84,13 +90,6 @@
 static const int RB_AUTOBOOT = 0x01234567;
 #endif
 
-#if (__GNU_LIBRARY__ > 5) || defined(__dietlibc__) 
-  #include <sys/reboot.h>
-  #define init_reboot(magic) reboot(magic)
-#else
-  #define init_reboot(magic) reboot(0xfee1dead, 672274793, magic)
-#endif
-
 #ifndef _PATH_STDPATH
 #define _PATH_STDPATH	"/usr/bin:/bin:/usr/sbin:/sbin"
 #endif
@@ -218,7 +217,7 @@
 			device = CONSOLE;
 		} else if ((log_fd = device_open(log, O_RDWR|O_NDELAY)) < 0) {
 			log_fd = -2;
-			fprintf(stderr, "Bummer, can't write to log on %s!\r\n", log);
+			fprintf(stderr, "Bummer, can't write to log on %s!\n", log);
 			log = NULL;
 			device = CONSOLE;
 		}
@@ -382,7 +381,7 @@
 			if (strcmp( termType, "TERM=linux" ) == 0)
 				safe_strncpy(termType, "TERM=vt102", sizeof(termType));
 			message(LOG | CONSOLE,
-					"serial console detected.  Disabling virtual terminals.\r\n");
+					"serial console detected.  Disabling virtual terminals.\n");
 		}
 		close(fd);
 	}
@@ -395,7 +394,7 @@
 	/* Fix up argv[0] to be certain we claim to be init */
 	len = strlen(argv[0]);
 	memset(argv[0], 0, len);
-	strncpy(argv[0], new_argv0, len);
+	safe_strncpy(argv[0], new_argv0, len + 1);
 
 	/* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
 	len = 1;
@@ -425,7 +424,7 @@
 	char *environment[MAXENV+1] = {
 		termType,
 		"HOME=/",
-		"PATH=/usr/bin:/bin:/usr/sbin:/sbin",
+		"PATH=" _PATH_STDPATH,
 		"SHELL=" SHELL,
 		"USER=root",
 		NULL
@@ -444,7 +443,12 @@
 		}
 	}
 
-	if ((pid = fork()) == 0) {
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
+	if ((pid = fork()) == 0) 
+#else
+	if ((pid = vfork()) == 0) 
+#endif
+	{
 		/* Clean up */
 		ioctl(0, TIOCNOTTY, 0);
 		close(0);
@@ -465,7 +469,7 @@
 						terminal);
 				exit(1);
 			}
-			message(LOG | CONSOLE, "Bummer, can't open %s\r\n", terminal);
+			message(LOG | CONSOLE, "Bummer, can't open %s\n", terminal);
 			exit(1);
 		}
 		dup2(fd, 0);
@@ -480,13 +484,16 @@
 			cmd[0] = SHELL;
 			cmd[1] = "-c";
 			strcpy(buf, "exec ");
-			strncat(buf, command, sizeof(buf) - strlen(buf) - 1);
+			safe_strncpy(buf + sizeof("exec "), command, 
+					sizeof(buf) - sizeof("exec "));
 			cmd[2] = buf;
 			cmd[3] = NULL;
 		} else {
 			/* Convert command (char*) into cmd (char**, one word per string) */
-			for (tmpCmd = command, i = 0;
-					(tmpCmd = strsep(&command, " \t")) != NULL;) {
+			safe_strncpy(buf, command, sizeof(buf));
+			s = buf;
+			for (tmpCmd = buf, i = 0;
+					(tmpCmd = strsep(&s, " \t")) != NULL;) {
 				if (*tmpCmd != '\0') {
 					cmd[i] = tmpCmd;
 					tmpCmd++;
@@ -533,7 +540,7 @@
 			 * specifies.
 			 */
 #ifdef DEBUG_INIT
-			message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\r\n",
+			message(LOG, "Waiting for enter to start '%s' (pid %d, console %s)\n",
 					cmd[0], getpid(), terminal);
 #endif
 			write(fileno(stdout), press_enter, sizeof(press_enter) - 1);
@@ -542,7 +549,7 @@
 
 #ifdef DEBUG_INIT
 		/* Log the process name and args */
-		message(LOG, "Starting pid %d, console %s: '%s'\r\n",
+		message(LOG, "Starting pid %d, console %s: '%s'\n",
 				getpid(), terminal, command);
 #endif
 
@@ -592,6 +599,7 @@
 	if (check_free_memory() > 1000)
 		return;
 
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 	if (stat("/etc/fstab", &statBuf) == 0) {
 		/* swapon -a requires /proc typically */
 		waitfor("mount proc /proc -t proc", console, FALSE);
@@ -602,10 +610,11 @@
 	} else
 		goto goodnight;
 	return;
+#endif
 
   goodnight:
 	message(CONSOLE,
-			"Sorry, your computer does not have enough memory.\r\n");
+			"Sorry, your computer does not have enough memory.\n");
 	loop_forever();
 }
 
@@ -627,22 +636,29 @@
 static void shutdown_system(void)
 {
 
-	/* first disable our SIGHUP signal */
-	signal(SIGHUP, SIG_DFL);
+	/* first disable all our signals */
+	sigemptyset(&block_signals);
+	sigaddset(&block_signals, SIGHUP);
+	sigaddset(&block_signals, SIGCHLD);
+	sigaddset(&block_signals, SIGUSR1);
+	sigaddset(&block_signals, SIGUSR2);
+	sigaddset(&block_signals, SIGINT);
+	sigaddset(&block_signals, SIGTERM);
+	sigprocmask(SIG_BLOCK, &block_signals, NULL);
 
 	/* Allow Ctrl-Alt-Del to reboot system. */
 	init_reboot(RB_ENABLE_CAD);
 
-	message(CONSOLE|LOG, "\r\nThe system is going down NOW !!\r\n");
+	message(CONSOLE|LOG, "\nThe system is going down NOW !!\n");
 	sync();
 
 	/* Send signals to every process _except_ pid 1 */
-	message(CONSOLE|LOG, "Sending SIGTERM to all processes.\r\n");
+	message(CONSOLE|LOG, "Sending SIGTERM to all processes.\n");
 	kill(-1, SIGTERM);
 	sleep(1);
 	sync();
 
-	message(CONSOLE|LOG, "Sending SIGKILL to all processes.\r\n");
+	message(CONSOLE|LOG, "Sending SIGKILL to all processes.\n");
 	kill(-1, SIGKILL);
 	sleep(1);
 
@@ -661,7 +677,7 @@
 {
 	shutdown_system();
 	message(CONSOLE|LOG,
-			"The system is halted. Press %s or turn off power\r\n",
+			"The system is halted. Press %s or turn off power\n",
 			(secondConsole == NULL)	/* serial console */
 			? "Reset" : "CTRL-ALT-DEL");
 	sync();
@@ -680,7 +696,7 @@
 static void reboot_signal(int sig)
 {
 	shutdown_system();
-	message(CONSOLE|LOG, "Please stand by while rebooting the system.\r\n");
+	message(CONSOLE|LOG, "Please stand by while rebooting the system.\n");
 	sync();
 
 	/* allow time for last message to reach serial console */
@@ -701,9 +717,7 @@
 static void new_initAction(initActionEnum action, char *process, char *cons)
 {
 	initAction *newAction;
-#ifdef CONFIG_FEATURE_INIT_NORMAL_ORDER
 	initAction *a;
-#endif
 
 	if (*cons == '\0')
 		cons = console;
@@ -723,20 +737,15 @@
 		message(LOG | CONSOLE, "Memory allocation failure\n");
 		loop_forever();
 	}
-#ifdef CONFIG_FEATURE_INIT_NORMAL_ORDER
 	for (a = initActionList; a && a->nextPtr; a = a->nextPtr) ;
 	if (a) {
 		a->nextPtr = newAction;
 	} else {
 		initActionList = newAction;
 	}
-#else
-	newAction->nextPtr = initActionList;
-	initActionList = newAction;
-#endif
-	strncpy(newAction->process, process, 255);
+	safe_strncpy(newAction->process, process, 255);
 	newAction->action = action;
-	strncpy(newAction->console, cons, 255);
+	safe_strncpy(newAction->console, cons, 255);
 	newAction->pid = 0;
 //    message(LOG|CONSOLE, "process='%s' action='%d' console='%s'\n",
 //      newAction->process, newAction->action, newAction->console);
@@ -782,16 +791,11 @@
 #endif
 		/* Reboot on Ctrl-Alt-Del */
 		new_initAction(CTRLALTDEL, "/sbin/reboot", console);
-#ifdef CONFIG_FEATURE_INIT_NORMAL_ORDER
 		/* Umount all filesystems on halt/reboot */
 		new_initAction(SHUTDOWN, "/bin/umount -a -r", console);
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 		/* Swapoff on halt/reboot */
 		new_initAction(SHUTDOWN, "/sbin/swapoff -a", console);
-#else
-		/* Swapoff on halt/reboot */
-		new_initAction(SHUTDOWN, "/sbin/swapoff -a", console);
-		/* Umount all filesystems on halt/reboot */
-		new_initAction(SHUTDOWN, "/bin/umount -a -r", console);
 #endif
 		/* Askfirst shell on tty1 */
 		new_initAction(ASKFIRST, LOGIN_SHELL, console);
@@ -916,13 +920,14 @@
 	/* Figure out what kernel this is running */
 	kernelVersion = get_kernel_revision();
 
-	/* Figure out where the default console should be */
-	console_init();
-
 	/* Close whatever files are open, and reset the console. */
 	close(0);
 	close(1);
 	close(2);
+
+	/* Figure out where the default console should be */
+	console_init();
+
 	set_term(0);
 	chdir("/");
 	setsid();
@@ -937,14 +942,14 @@
 			CONSOLE|
 #endif
 			LOG,
-			"init started:  %s\r\n", full_version);
+			"init started:  %s\n", full_version);
 #else
 	message(
 #if ! defined CONFIG_FEATURE_EXTRA_QUIET
 			CONSOLE|
 #endif
 			LOG,
-			"init(%d) started:  %s\r\n", getpid(), full_version);
+			"init(%d) started:  %s\n", getpid(), full_version);
 #endif
 
 
diff --git a/networking/ifconfig.c b/networking/ifconfig.c
index 3beecaf..295c89c 100644
--- a/networking/ifconfig.c
+++ b/networking/ifconfig.c
@@ -15,7 +15,7 @@
  * Foundation;  either  version 2 of the License, or  (at
  * your option) any later version.
  *
- * $Id: ifconfig.c,v 1.13 2001/10/24 04:59:56 andersen Exp $
+ * $Id: ifconfig.c,v 1.14 2001/10/28 05:12:18 andersen Exp $
  *
  */
 
@@ -135,7 +135,7 @@
 #define ARG_MTU          (A_ARG_REQ /*| A_CAST_INT*/)
 #define ARG_TXQUEUELEN   (A_ARG_REQ /*| A_CAST_INT*/)
 #define ARG_MEM_START    (A_ARG_REQ | A_MAP_ULONG)
-#define ARG_IO_ADDR      (A_ARG_REQ | A_MAP_USHORT)
+#define ARG_IO_ADDR      (A_ARG_REQ | A_MAP_ULONG)
 #define ARG_IRQ          (A_ARG_REQ | A_MAP_UCHAR)
 #define ARG_DSTADDR      (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE)
 #define ARG_NETMASK      (A_ARG_REQ | A_CAST_HOST_COPY_RESOLVE | A_NETMASK)
diff --git a/shell/ash.c b/shell/ash.c
index ffafcfe..0c89399 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -6756,7 +6756,11 @@
 	TRACE(("forkshell(%%%d, 0x%lx, %d) called\n", jp - jobtab, (long)n,
 	    mode));
 	INTOFF;
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 	pid = fork();
+#else
+	pid = vfork();
+#endif
 	if (pid == -1) {
 		TRACE(("Fork failed, errno=%d\n", errno));
 		INTON;
@@ -12627,7 +12631,7 @@
 /*
  * Copyright (c) 1999 Herbert Xu <herbert@debian.org>
  * This file contains code for the times builtin.
- * $Id: ash.c,v 1.31 2001/10/24 17:19:35 andersen Exp $
+ * $Id: ash.c,v 1.32 2001/10/28 05:12:18 andersen Exp $
  */
 static int timescmd (int argc, char **argv)
 {
diff --git a/shell/hush.c b/shell/hush.c
index d37842b..1950138 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -1403,7 +1403,12 @@
 		}
 
 		/* XXX test for failed fork()? */
-		if (!(child->pid = fork())) {
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
+		if (!(child->pid = fork()))
+#else
+		if (!(child->pid = vfork())) 
+#endif
+		{
 			/* Set the handling for job control signals back to the default.  */
 			signal(SIGINT, SIG_DFL);
 			signal(SIGQUIT, SIG_DFL);
@@ -2118,7 +2123,11 @@
 #if 1
 	int pid, channel[2];
 	if (pipe(channel)<0) perror_msg_and_die("pipe");
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 	pid=fork();
+#else
+	pid=vfork();
+#endif
 	if (pid<0) {
 		perror_msg_and_die("fork");
 	} else if (pid==0) {
diff --git a/shell/lash.c b/shell/lash.c
index 004d949..5b9d0a6 100644
--- a/shell/lash.c
+++ b/shell/lash.c
@@ -1347,7 +1347,12 @@
 			}
 		}
 
-		if (!(child->pid = fork())) {
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
+		if (!(child->pid = fork())) 
+#else
+		if (!(child->pid = vfork())) 
+#endif
+		{
 			/* Set the handling for job control signals back to the default.  */
 			signal(SIGINT, SIG_DFL);
 			signal(SIGQUIT, SIG_DFL);
diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c
index 33bc783..52a815d 100644
--- a/sysklogd/klogd.c
+++ b/sysklogd/klogd.c
@@ -136,8 +136,12 @@
 	}
 
 	if (doFork == TRUE) {
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 		if (daemon(0, 1) < 0)
 			perror_msg_and_die("daemon");
+#else
+			error_msg_and_die("daemon not supported");
+#endif
 	}
 	doKlogd();
 	
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 236f119..8441443 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -630,8 +630,12 @@
 	umask(0);
 
 	if (doFork == TRUE) {
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 		if (daemon(0, 1) < 0)
 			perror_msg_and_die("daemon");
+#else
+			error_msg_and_die("daemon not supported");
+#endif
 	}
 	doSyslogd();