Correct some init issues, update email address, last_patch78 by Vladimir
N. Oleynik
diff --git a/init/init.c b/init/init.c
index 91a19c5..ad9ff94 100644
--- a/init/init.c
+++ b/init/init.c
@@ -120,6 +120,8 @@
 
 #define MAXENV	16		/* Number of env. vars */
 
+#define CONSOLE_BUFF_SIZE 32
+
 /* Allowed init action types */
 #define SYSINIT     0x001
 #define RESPAWN     0x002
@@ -152,16 +154,15 @@
 struct init_action {
 	pid_t pid;
 	char command[INIT_BUFFS_SIZE];
-	char terminal[INIT_BUFFS_SIZE];
+	char terminal[CONSOLE_BUFF_SIZE];
 	struct init_action *next;
 	int action;
 };
 
 /* Static variables */
 static struct init_action *init_action_list = NULL;
-static int kernelVersion = 0;
-static char termType[32] = "TERM=linux";
-static char console[32] = _PATH_CONSOLE;
+static int kernelVersion;
+static char console[CONSOLE_BUFF_SIZE] = _PATH_CONSOLE;
 
 #ifndef CONFIG_SYSLOGD
 static char *log = VC_5;
@@ -184,9 +185,17 @@
 static const int RB_AUTOBOOT = 0x01234567;
 #endif
 
+static const char * const environment[] = {
+	"HOME=/",
+	"PATH=" _PATH_STDPATH,
+	"SHELL=" SHELL,
+	"USER=root",
+	NULL
+};
+
 /* Function prototypes */
 static void delete_init_action(struct init_action *a);
-static int waitfor(struct init_action *a);
+static int waitfor(const struct init_action *a);
 
 
 static void loop_forever(void)
@@ -197,38 +206,44 @@
 
 /* Print a message to the specified device.
  * Device may be bitwise-or'd from LOG | CONSOLE */
-#ifdef DEBUG_INIT
-static inline messageND(int device, char *fmt, ...)
+#ifndef DEBUG_INIT
+static inline void messageD(int device, const char *fmt, ...)
 {
 }
 #else
-#define messageND message
+#define messageD message
 #endif
-static void message(int device, char *fmt, ...)
+static void message(int device, const char *fmt, ...)
 	__attribute__ ((format(printf, 2, 3)));
-static void message(int device, char *fmt, ...)
+static void message(int device, const char *fmt, ...)
 {
 	va_list arguments;
-	int fd;
-
-#ifdef CONFIG_SYSLOGD
-
-	/* Log the message to syslogd */
-	if (device & LOG) {
+	int l;
 		char msg[1024];
 
+	msg[0] = '\r';
 		va_start(arguments, fmt);
-		vsnprintf(msg, sizeof(msg), fmt, arguments);
+	l = vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments) + 1;
 		va_end(arguments);
-		syslog_msg(LOG_USER, LOG_INFO, msg);
+
+#ifdef CONFIG_SYSLOGD
+	/* Log the message to syslogd */
+	if (device & LOG) {
+		/* don`t out "\r\n" */
+		syslog_msg(LOG_DAEMON, LOG_INFO, msg + 1);
 	}
+
+	msg[l++] = '\n';
+	msg[l] = 0;
 #else
 	static int log_fd = -1;
 
+	msg[l++] = '\n';
+	msg[l] = 0;
 	/* Take full control of the log tty, and never close it.
 	 * It's mine, all mine!  Muhahahaha! */
 	if (log_fd < 0) {
-		if ((log_fd = device_open(log, O_RDWR | O_NDELAY)) < 0) {
+		if ((log_fd = device_open(log, O_RDWR | O_NDELAY | O_NOCTTY)) < 0) {
 			log_fd = -2;
 			error_msg("Bummer, can't write to log on %s!", log);
 			device = CONSOLE;
@@ -237,26 +252,25 @@
 		}
 	}
 	if ((device & LOG) && (log_fd >= 0)) {
-		va_start(arguments, fmt);
-		vdprintf(log_fd, fmt, arguments);
-		va_end(arguments);
+		full_write(log_fd, msg, l);
 	}
 #endif
 
 	if (device & CONSOLE) {
+		int fd = device_open(_PATH_CONSOLE,
+					O_WRONLY | O_NOCTTY | O_NDELAY);
 		/* Always send console messages to /dev/console so people will see them. */
-		if ((fd =
-			 device_open(_PATH_CONSOLE,
-						 O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) {
-			va_start(arguments, fmt);
-			vdprintf(fd, fmt, arguments);
-			va_end(arguments);
+		if (fd >= 0) {
+			full_write(fd, msg, l);
 			close(fd);
+#ifdef DEBUG_INIT
+		/* all descriptors may be closed */
 		} else {
 			error_msg("Bummer, can't print: ");
 			va_start(arguments, fmt);
 			vfprintf(stderr, fmt, arguments);
 			va_end(arguments);
+#endif
 		}
 	}
 }
@@ -330,31 +344,23 @@
 static void console_init(void)
 {
 	int fd;
-	int tried_devcons = 0;
-	int tried_vtprimary = 0;
+	int tried = 0;
 	struct vt_stat vt;
 	struct serial_struct sr;
 	char *s;
 
-	if ((s = getenv("TERM")) != NULL) {
-		snprintf(termType, sizeof(termType) - 1, "TERM=%s", s);
-	}
-
-	if ((s = getenv("CONSOLE")) != NULL) {
+	if ((s = getenv("CONSOLE")) != NULL || (s = getenv("console")) != NULL) {
 		safe_strncpy(console, s, sizeof(console));
-	}
 #if #cpu(sparc)
 	/* sparc kernel supports console=tty[ab] parameter which is also 
 	 * passed to init, so catch it here */
-	else if ((s = getenv("console")) != NULL) {
 		/* remap tty[ab] to /dev/ttyS[01] */
 		if (strcmp(s, "ttya") == 0)
 			safe_strncpy(console, SC_0, sizeof(console));
 		else if (strcmp(s, "ttyb") == 0)
 			safe_strncpy(console, SC_1, sizeof(console));
-	}
 #endif
-	else {
+	} else {
 		/* 2.2 kernels: identify the real console backend and try to use it */
 		if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
 			/* this is a serial console */
@@ -364,39 +370,41 @@
 			snprintf(console, sizeof(console) - 1, VC_FORMAT, vt.v_active);
 		} else {
 			safe_strncpy(console, _PATH_CONSOLE, sizeof(console));
-			tried_devcons++;
+			tried++;
 		}
 	}
 
-	while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0) {
-		/* Can't open selected console -- try /dev/console */
-		if (!tried_devcons) {
-			tried_devcons++;
-			safe_strncpy(console, _PATH_CONSOLE, sizeof(console));
-			continue;
-		}
-		/* Can't open selected console -- try vt1 */
-		if (!tried_vtprimary) {
-			tried_vtprimary++;
-			safe_strncpy(console, VC_1, sizeof(console));
-			continue;
-		}
-		break;
+	while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0 && tried < 2) {
+		/* Can't open selected console -- try
+			logical system console and VT_MASTER */
+		safe_strncpy(console, (tried == 0 ? _PATH_CONSOLE : CURRENT_VC),
+							sizeof(console));
+		tried++;
 	}
 	if (fd < 0) {
 		/* Perhaps we should panic here? */
+#ifndef CONFIG_SYSLOGD
+		log =
+#endif
 		safe_strncpy(console, "/dev/null", sizeof(console));
 	} else {
+		s = getenv("TERM");
 		/* check for serial console */
-		if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
+		if (ioctl(fd, TIOCGSERIAL, &sr) == 0) {
 			/* Force the TERM setting to vt102 for serial console --
 			 * if TERM is set to linux (the default) */
-			if (strcmp(termType, "TERM=linux") == 0)
-				safe_strncpy(termType, "TERM=vt102", sizeof(termType));
+			if (s == NULL || strcmp(s, "linux") == 0)
+				putenv("TERM=vt102");
+#ifndef CONFIG_SYSLOGD
+			log = console;
+#endif
+		} else {
+			if (s == NULL)
+				putenv("TERM=linux");
 		}
 		close(fd);
 	}
-	message(LOG, "console=%s\n", console);
+	messageD(LOG, "console=%s", console);
 }
 
 static void fixup_argv(int argc, char **argv, char *new_argv0)
@@ -416,68 +424,20 @@
 	}
 }
 
-/* Make sure there is enough memory to do something useful. *
- * Calls "swapon -a" if needed so be sure /etc/fstab is present... */
-static void check_memory(void)
-{
-	struct stat statBuf;
-
-	if (check_free_memory() > 1000)
-		return;
-
-#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
-	if (stat("/etc/fstab", &statBuf) == 0) {
-		/* swapon -a requires /proc typically */
-		system("/bin/mount -t proc proc /proc");
-		/* Try to turn on swap */
-		system("/sbin/swapon -a");
-		if (check_free_memory() < 1000)
-			goto goodnight;
-	} else
-		goto goodnight;
-	return;
-#endif
-
-  goodnight:
-	message(CONSOLE, "\rSorry, your computer does not have enough memory.\n");
-	loop_forever();
-}
-
-static pid_t run(struct init_action *a)
+static pid_t run(const struct init_action *a)
 {
 	struct stat sb;
-	int i, j, junk;
+	int i, junk;
 	pid_t pid, pgrp, tmp_pid;
 	char *s, *tmpCmd, *cmd[INIT_BUFFS_SIZE], *cmdpath;
 	char buf[INIT_BUFFS_SIZE + 6];	/* INIT_BUFFS_SIZE+strlen("exec ")+1 */
 	sigset_t nmask, omask;
-	char *environment[MAXENV + 1] = {
-		termType,
-		"HOME=/",
-		"PATH=" _PATH_STDPATH,
-		"SHELL=" SHELL,
-		"USER=root",
-		NULL
-	};
 	static const char press_enter[] =
 #ifdef CUSTOMIZED_BANNER
 #include CUSTOMIZED_BANNER
 #endif
 		"\nPlease press Enter to activate this console. ";
 
-	/* inherit environment to the child, merging our values -andy */
-	for (i = 0; environ[i]; i++) {
-		for (j = 0; environment[j]; j++) {
-			s = strchr(environment[j], '=');
-			if (!strncmp(environ[i], environment[j], s - environment[j]))
-				break;
-		}
-		if (!environment[j]) {
-			environment[j++] = environ[i];
-			environment[j] = NULL;
-		}
-	}
-
 	/* Block sigchild while forking.  */
 	sigemptyset(&nmask);
 	sigaddset(&nmask, SIGCHLD);
@@ -507,11 +467,11 @@
 		/* Open the new terminal device */
 		if ((device_open(a->terminal, O_RDWR)) < 0) {
 			if (stat(a->terminal, &sb) != 0) {
-				message(LOG | CONSOLE, "\rdevice '%s' does not exist.\n",
+				message(LOG | CONSOLE, "device '%s' does not exist.",
 						a->terminal);
 				_exit(1);
 			}
-			message(LOG | CONSOLE, "\rBummer, can't open %s\n", a->terminal);
+			message(LOG | CONSOLE, "Bummer, can't open %s", a->terminal);
 			_exit(1);
 		}
 
@@ -528,7 +488,7 @@
 
 			/* Now fork off another process to just hang around */
 			if ((pid = fork()) < 0) {
-				message(LOG | CONSOLE, "Can't fork!\n");
+				message(LOG | CONSOLE, "Can't fork!");
 				_exit(1);
 			}
 
@@ -550,7 +510,7 @@
 
 				/* Use a temporary process to steal the controlling tty. */
 				if ((pid = fork()) < 0) {
-					message(LOG | CONSOLE, "\rCan't fork!\n");
+					message(LOG | CONSOLE, "Can't fork!");
 					_exit(1);
 				}
 				if (pid == 0) {
@@ -572,8 +532,7 @@
 		if (strpbrk(a->command, "~`!$^&*()=|\\{}[];\"'<>?") != NULL) {
 			cmd[0] = SHELL;
 			cmd[1] = "-c";
-			strcat(strcpy(buf, "exec "), a->command);
-			cmd[2] = buf;
+			cmd[2] = strcat(strcpy(buf, "exec "), a->command);
 			cmd[3] = NULL;
 		} else {
 			/* Convert command (char*) into cmd (char**, one word per string) */
@@ -607,7 +566,7 @@
 
 			/* make a new argv[0] */
 			if ((cmd[0] = malloc(strlen(s) + 2)) == NULL) {
-				message(LOG | CONSOLE, "malloc failed");
+				message(LOG | CONSOLE, memory_exhausted);
 				cmd[0] = cmdpath;
 			} else {
 				cmd[0][0] = '-';
@@ -616,6 +575,7 @@
 		}
 
 		if (a->action & ASKFIRST) {
+			char c;
 			/*
 			 * Save memory by not exec-ing anything large (like a shell)
 			 * before the user wants it. This is critical if swap is not
@@ -624,16 +584,16 @@
 			 * be allowed to start a shell or whatever an init script 
 			 * specifies.
 			 */
-			messageND(LOG,
-					  "Waiting for enter to start '%s' (pid %d, terminal %s)\n",
+			messageD(LOG, "Waiting for enter to start '%s'"
+						"(pid %d, terminal %s)\n",
 					  cmdpath, getpid(), a->terminal);
-			fflush(stdout);
-			write(fileno(stdout), press_enter, sizeof(press_enter) - 1);
-			getc(stdin);
+			full_write(1, press_enter, sizeof(press_enter) - 1);
+			while(read(0, &c, 1) == 1 && c != '\n')
+				;
 		}
 
 		/* Log the process name and args */
-		messageND(LOG, "Starting pid %d, console %s: '%s'\n",
+		message(LOG, "Starting pid %d, console %s: '%s'",
 				  getpid(), a->terminal, cmdpath);
 
 #if defined CONFIG_FEATURE_INIT_COREDUMPS
@@ -648,17 +608,17 @@
 
 		/* Now run it.  The new program will take over this PID, 
 		 * so nothing further in init.c should be run. */
-		execve(cmdpath, cmd, environment);
+		execv(cmdpath, cmd);
 
 		/* We're still here?  Some error happened. */
-		message(LOG | CONSOLE, "\rBummer, could not run '%s': %m\n", cmdpath);
+		message(LOG | CONSOLE, "Bummer, could not run '%s': %m", cmdpath);
 		_exit(-1);
 	}
 	sigprocmask(SIG_SETMASK, &omask, NULL);
 	return pid;
 }
 
-static int waitfor(struct init_action *a)
+static int waitfor(const struct init_action *a)
 {
 	int pid;
 	int status, wpid;
@@ -700,7 +660,6 @@
 	}
 }
 
-
 #ifndef DEBUG_INIT
 static void shutdown_system(void)
 {
@@ -727,16 +686,16 @@
 	/* Allow Ctrl-Alt-Del to reboot system. */
 	init_reboot(RB_ENABLE_CAD);
 
-	message(CONSOLE | LOG, "\n\rThe system is going down NOW !!\n");
+	message(CONSOLE | LOG, "The system is going down NOW !!");
 	sync();
 
 	/* Send signals to every process _except_ pid 1 */
-	message(CONSOLE | LOG, "\rSending SIGTERM to all processes.\n");
+	message(CONSOLE | LOG, "Sending SIGTERM to all processes.");
 	kill(-1, SIGTERM);
 	sleep(1);
 	sync();
 
-	message(CONSOLE | LOG, "\rSending SIGKILL to all processes.\n");
+	message(CONSOLE | LOG, "Sending SIGKILL to all processes.");
 	kill(-1, SIGKILL);
 	sleep(1);
 
@@ -771,10 +730,10 @@
 			sigaddset(&unblock_signals, SIGTSTP);
 			sigprocmask(SIG_UNBLOCK, &unblock_signals, NULL);
 
-			message(CONSOLE | LOG, "\rTrying to re-exec %s\n", a->command);
+			messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command);
 			execl(a->command, a->command, NULL);
 
-			message(CONSOLE | LOG, "\rexec of '%s' failed: %m\n",
+			message(CONSOLE | LOG, "exec of '%s' failed: %m",
 					a->command);
 			sync();
 			sleep(2);
@@ -790,9 +749,9 @@
 	message(CONSOLE | LOG,
 #if #cpu(s390)
 			/* Seems the s390 console is Wierd(tm). */
-			"\rThe system is halted. You may reboot now.\n"
+			"The system is halted. You may reboot now."
 #else
-			"\rThe system is halted. Press Reset or turn off power\n"
+			"The system is halted. Press Reset or turn off power"
 #endif
 		);
 	sync();
@@ -811,7 +770,7 @@
 static void reboot_signal(int sig)
 {
 	shutdown_system();
-	message(CONSOLE | LOG, "\rPlease stand by while rebooting the system.\n");
+	message(CONSOLE | LOG, "Please stand by while rebooting the system.");
 	sync();
 
 	/* allow time for last message to reach serial console */
@@ -847,7 +806,7 @@
 
 #endif							/* ! DEBUG_INIT */
 
-static void new_init_action(int action, char *command, char *cons)
+static void new_init_action(int action, char *command, const char *cons)
 {
 	struct init_action *new_action, *a;
 
@@ -862,7 +821,7 @@
 
 	new_action = calloc((size_t) (1), sizeof(struct init_action));
 	if (!new_action) {
-		message(LOG | CONSOLE, "\rMemory allocation failure\n");
+		message(LOG | CONSOLE, "Memory allocation failure");
 		loop_forever();
 	}
 
@@ -876,9 +835,11 @@
 	strcpy(new_action->command, command);
 	new_action->action = action;
 	strcpy(new_action->terminal, cons);
+#if 0   /* calloc zeroed always */
 	new_action->pid = 0;
-/*    message(LOG|CONSOLE, "command='%s' action='%d' terminal='%s'\n",
-		new_action->command, new_action->action, new_action->terminal); */
+#endif
+	messageD(LOG|CONSOLE, "command='%s' action='%d' terminal='%s'\n",
+		new_action->command, new_action->action, new_action->terminal);
 }
 
 static void delete_init_action(struct init_action *action)
@@ -898,6 +859,34 @@
 	}
 }
 
+/* Make sure there is enough memory to do something useful. *
+ * Calls "swapon -a" if needed so be sure /etc/fstab is present... */
+static void check_memory(void)
+{
+	struct stat statBuf;
+
+	if (check_free_memory() > 1000)
+		return;
+
+#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
+	if (stat("/etc/fstab", &statBuf) == 0) {
+		/* swapon -a requires /proc typically */
+		new_init_action(SYSINIT, "/bin/mount -t proc proc /proc", "");
+		/* Try to turn on swap */
+		new_init_action(SYSINIT, "/sbin/swapon -a", "");
+		run_actions(SYSINIT);   /* wait and removing */
+		if (check_free_memory() < 1000)
+			goto goodnight;
+	} else
+		goto goodnight;
+	return;
+#endif
+
+  goodnight:
+	message(CONSOLE, "Sorry, your computer does not have enough memory.");
+	loop_forever();
+}
+
 /* NOTE that if CONFIG_FEATURE_USE_INITTAB is NOT defined,
  * then parse_inittab() simply adds in some default
  * actions(i.e., runs INIT_SCRIPT and then starts a pair 
@@ -909,11 +898,10 @@
 {
 #ifdef CONFIG_FEATURE_USE_INITTAB
 	FILE *file;
-	char buf[INIT_BUFFS_SIZE], lineAsRead[INIT_BUFFS_SIZE],
-		tmpConsole[INIT_BUFFS_SIZE];
+	char buf[INIT_BUFFS_SIZE], lineAsRead[INIT_BUFFS_SIZE];
+	char tmpConsole[CONSOLE_BUFF_SIZE];
 	char *id, *runlev, *action, *command, *eol;
 	const struct init_action_type *a = actions;
-	int foundIt;
 
 
 	file = fopen(INITTAB, "r");
@@ -921,29 +909,28 @@
 		/* No inittab file -- set up some default behavior */
 #endif
 		/* Reboot on Ctrl-Alt-Del */
-		new_init_action(CTRLALTDEL, "/sbin/reboot", console);
+		new_init_action(CTRLALTDEL, "/sbin/reboot", "");
 		/* Umount all filesystems on halt/reboot */
-		new_init_action(SHUTDOWN, "/bin/umount -a -r", console);
+		new_init_action(SHUTDOWN, "/bin/umount -a -r", "");
 #if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
 		/* Swapoff on halt/reboot */
-		new_init_action(SHUTDOWN, "/sbin/swapoff -a", console);
+		new_init_action(SHUTDOWN, "/sbin/swapoff -a", "");
 #endif
 		/* Prepare to restart init when a HUP is received */
-		new_init_action(RESTART, "/sbin/init", console);
+		new_init_action(RESTART, "/sbin/init", "");
 		/* Askfirst shell on tty1-4 */
-		new_init_action(ASKFIRST, LOGIN_SHELL, console);
+		new_init_action(ASKFIRST, LOGIN_SHELL, "");
 		new_init_action(ASKFIRST, LOGIN_SHELL, VC_2);
 		new_init_action(ASKFIRST, LOGIN_SHELL, VC_3);
 		new_init_action(ASKFIRST, LOGIN_SHELL, VC_4);
 		/* sysinit */
-		new_init_action(SYSINIT, INIT_SCRIPT, console);
+		new_init_action(SYSINIT, INIT_SCRIPT, "");
 
 		return;
 #ifdef CONFIG_FEATURE_USE_INITTAB
 	}
 
 	while (fgets(buf, INIT_BUFFS_SIZE, file) != NULL) {
-		foundIt = FALSE;
 		/* Skip leading spaces */
 		for (id = buf; *id == ' ' || *id == '\t'; id++);
 
@@ -962,7 +949,7 @@
 		/* Separate the ID field from the runlevels */
 		runlev = strchr(id, ':');
 		if (runlev == NULL || *(runlev + 1) == '\0') {
-			message(LOG | CONSOLE, "\rBad inittab entry: %s\n", lineAsRead);
+			message(LOG | CONSOLE, "Bad inittab entry: %s", lineAsRead);
 			continue;
 		} else {
 			*runlev = '\0';
@@ -972,7 +959,7 @@
 		/* Separate the runlevels from the action */
 		action = strchr(runlev, ':');
 		if (action == NULL || *(action + 1) == '\0') {
-			message(LOG | CONSOLE, "\rBad inittab entry: %s\n", lineAsRead);
+			message(LOG | CONSOLE, "Bad inittab entry: %s", lineAsRead);
 			continue;
 		} else {
 			*action = '\0';
@@ -982,7 +969,7 @@
 		/* Separate the action from the command */
 		command = strchr(action, ':');
 		if (command == NULL || *(command + 1) == '\0') {
-			message(LOG | CONSOLE, "\rBad inittab entry: %s\n", lineAsRead);
+			message(LOG | CONSOLE, "Bad inittab entry: %s", lineAsRead);
 			continue;
 		} else {
 			*command = '\0';
@@ -990,24 +977,23 @@
 		}
 
 		/* Ok, now process it */
-		a = actions;
-		while (a->name != 0) {
+		for (a = actions; a->name != 0; a++) {
 			if (strcmp(a->name, action) == 0) {
 				if (*id != '\0') {
+					if(strncmp(id, "/dev/", 5) == 0)
+						id += 5;
 					strcpy(tmpConsole, "/dev/");
-					strncat(tmpConsole, id, INIT_BUFFS_SIZE - 6);
+					safe_strncpy(tmpConsole + 5, id,
+						CONSOLE_BUFF_SIZE - 5);
 					id = tmpConsole;
 				}
 				new_init_action(a->action, command, id);
-				foundIt = TRUE;
+				break;
 			}
-			a++;
 		}
-		if (foundIt == TRUE)
-			continue;
-		else {
+		if (a->name == 0) {
 			/* Choke on an unknown action */
-			message(LOG | CONSOLE, "\rBad inittab entry: %s\n", lineAsRead);
+			message(LOG | CONSOLE, "Bad inittab entry: %s", lineAsRead);
 		}
 	}
 	fclose(file);
@@ -1016,7 +1002,6 @@
 }
 
 
-
 extern int init_main(int argc, char **argv)
 {
 	struct init_action *a;
@@ -1032,8 +1017,7 @@
 			if (!pid || *pid <= 0)
 				error_msg_and_die("no process killed");
 		}
-		kill(*pid, SIGHUP);
-		exit(0);
+		return kill(*pid, SIGHUP);
 	}
 #ifndef DEBUG_INIT
 	/* Expect to be invoked as init with PID=1 or be invoked as linuxrc */
@@ -1078,12 +1062,14 @@
 
 	chdir("/");
 	setsid();
-
-	/* Make sure PATH is set to something sane */
-	putenv("PATH=" _PATH_STDPATH);
-
+	{
+		const char * const *e;
+		/* Make sure environs is set to something sane */
+		for(e = environment; *e; e++)
+			putenv(*e);
+	}
 	/* Hello world */
-	message(MAYBE_CONSOLE | LOG, "\rinit started:  %s\n", full_version);
+	message(MAYBE_CONSOLE | LOG, "init started:  %s", full_version);
 
 	/* Make sure there is enough memory to do something useful. */
 	check_memory();
@@ -1091,12 +1077,8 @@
 	/* 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"))) {
-		/* Ask first then start a shell on tty2-4 */
-		new_init_action(ASKFIRST, LOGIN_SHELL, VC_2);
-		new_init_action(ASKFIRST, LOGIN_SHELL, VC_3);
-		new_init_action(ASKFIRST, LOGIN_SHELL, VC_4);
-		/* Start a shell on tty1 */
-		new_init_action(RESPAWN, LOGIN_SHELL, console);
+		/* Start a shell on console */
+		new_init_action(RESPAWN, LOGIN_SHELL, "");
 	} else {
 		/* Not in single user mode -- see what inittab says */
 
@@ -1124,7 +1106,7 @@
 	/* If there is nothing else to do, stop */
 	if (init_action_list == NULL) {
 		message(LOG | CONSOLE,
-				"\rNo more tasks for init -- sleeping forever.\n");
+				"No more tasks for init -- sleeping forever.");
 		loop_forever();
 	}
 
@@ -1149,7 +1131,8 @@
 					 * restarted by run_actions() */
 					a->pid = 0;
 					message(LOG, "Process '%s' (pid %d) exited.  "
-							"Scheduling it for restart.\n", a->command, wpid);
+							"Scheduling it for restart.",
+							a->command, wpid);
 				}
 			}
 			/* see if anyone else is waiting to be reaped */