busybox: squashed commit of merging cm-12.1

With fixes to LOCAL_C_INCLUDES for libsepol in M and fixed
some missing includes to enable building for 64 bit devices

Conflicts:
	Android.mk
	android/libc/arch-x86/syscalls/swapoff.S
	android/libc/arch-x86/syscalls/swapon.S
	android/libc/arch-x86/syscalls/sysinfo.S
	android/librpc/pmap_rmt.c
	android/reboot.c
	include-full/copy-current.sh
	include-minimal/copy-current.sh
	include/platform.h
	networking/interface.c
	networking/nslookup.c

Change-Id: If6092fa87f3d21190db1af4f70daa150eb462660
diff --git a/init/init.c b/init/init.c
index b84bdcc..d29328c 100644
--- a/init/init.c
+++ b/init/init.c
@@ -9,11 +9,6 @@
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
 
-//applet:IF_INIT(APPLET(init, BB_DIR_SBIN, BB_SUID_DROP))
-//applet:IF_FEATURE_INITRD(APPLET_ODDNAME(linuxrc, init, BB_DIR_ROOT, BB_SUID_DROP, linuxrc))
-
-//kbuild:lib-$(CONFIG_INIT) += init.o
-
 //config:config INIT
 //config:	bool "init"
 //config:	default y
@@ -108,6 +103,11 @@
 //config:	  Note that on Linux, init attempts to detect serial terminal and
 //config:	  sets TERM to "vt102" if one is found.
 
+//applet:IF_INIT(APPLET(init, BB_DIR_SBIN, BB_SUID_DROP))
+//applet:IF_FEATURE_INITRD(APPLET_ODDNAME(linuxrc, init, BB_DIR_ROOT, BB_SUID_DROP, linuxrc))
+
+//kbuild:lib-$(CONFIG_INIT) += init.o
+
 #define DEBUG_SEGV_HANDLER 0
 
 #include "libbb.h"
@@ -140,12 +140,11 @@
  * not fully functional init by switching it on! */
 #define DEBUG_INIT 0
 
-#define COMMAND_SIZE      256
 #define CONSOLE_NAME_SIZE 32
 
 /* Default sysinit script. */
 #ifndef INIT_SCRIPT
-#define INIT_SCRIPT  "/etc/init.d/rcS"
+# define INIT_SCRIPT  "/etc/init.d/rcS"
 #endif
 
 /* Each type of actions can appear many times. They will be
@@ -195,7 +194,7 @@
 	pid_t pid;
 	uint8_t action_type;
 	char terminal[CONSOLE_NAME_SIZE];
-	char command[COMMAND_SIZE];
+	char command[1];
 };
 
 static struct init_action *init_action_list = NULL;
@@ -223,8 +222,8 @@
 	msg[0] = '\r';
 	va_start(arguments, fmt);
 	l = 1 + vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments);
-	if (l > sizeof(msg) - 1)
-		l = sizeof(msg) - 1;
+	if (l > sizeof(msg) - 2)
+		l = sizeof(msg) - 2;
 	va_end(arguments);
 
 #if ENABLE_FEATURE_INIT_SYSLOG
@@ -398,7 +397,7 @@
 }
 
 /* Wrapper around exec:
- * Takes string (max COMMAND_SIZE chars).
+ * Takes string.
  * If chars like '>' detected, execs '[-]/bin/sh -c "exec ......."'.
  * Otherwise splits words on whitespace, deals with leading dash,
  * and uses plain exec().
@@ -406,10 +405,15 @@
  */
 static void init_exec(const char *command)
 {
-	char *cmd[COMMAND_SIZE / 2];
-	char buf[COMMAND_SIZE + 6];  /* COMMAND_SIZE+strlen("exec ")+1 */
-	int dash = (command[0] == '-' /* maybe? && command[1] == '/' */);
+	/* +8 allows to write VLA sizes below more efficiently: */
+	unsigned command_size = strlen(command) + 8;
+	/* strlen(command) + strlen("exec ")+1: */
+	char buf[command_size];
+	/* strlen(command) / 2 + 4: */
+	char *cmd[command_size / 2];
+	int dash;
 
+	dash = (command[0] == '-' /* maybe? && command[1] == '/' */);
 	command += dash;
 
 	/* See if any special /bin/sh requiring characters are present */
@@ -626,21 +630,21 @@
 		nextp = &a->next;
 	}
 
-	a = xzalloc(sizeof(*a));
+	a = xzalloc(sizeof(*a) + strlen(command));
 
 	/* Append to the end of the list */
  append:
 	*nextp = a;
 	a->action_type = action_type;
-	safe_strncpy(a->command, command, sizeof(a->command));
+	strcpy(a->command, command);
 	safe_strncpy(a->terminal, cons, sizeof(a->terminal));
-	dbg_message(L_LOG | L_CONSOLE, "command='%s' action=%d tty='%s'\n",
+	dbg_message(L_LOG | L_CONSOLE, "command='%s' action=%x tty='%s'\n",
 		a->command, a->action_type, a->terminal);
 }
 
 /* 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
+ * actions (i.e., runs INIT_SCRIPT and then starts a pair
  * of "askfirst" shells).  If CONFIG_FEATURE_USE_INITTAB
  * _is_ defined, but /etc/inittab is missing, this
  * results in the same set of default behaviors.
@@ -655,23 +659,22 @@
 #endif
 	{
 		/* No inittab file - set up some default behavior */
-		/* Reboot on Ctrl-Alt-Del */
-		new_init_action(CTRLALTDEL, "reboot", "");
-		/* Umount all filesystems on halt/reboot */
-		new_init_action(SHUTDOWN, "umount -a -r", "");
-		/* Swapoff on halt/reboot */
-		if (ENABLE_SWAPONOFF)
-			new_init_action(SHUTDOWN, "swapoff -a", "");
-		/* Prepare to restart init when a QUIT is received */
-		new_init_action(RESTART, "init", "");
+		/* Sysinit */
+		new_init_action(SYSINIT, INIT_SCRIPT, "");
 		/* Askfirst shell on tty1-4 */
 		new_init_action(ASKFIRST, bb_default_login_shell, "");
 //TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users
 		new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
 		new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
 		new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
-		/* sysinit */
-		new_init_action(SYSINIT, INIT_SCRIPT, "");
+		/* Reboot on Ctrl-Alt-Del */
+		new_init_action(CTRLALTDEL, "reboot", "");
+		/* Umount all filesystems on halt/reboot */
+		new_init_action(SHUTDOWN, "umount -a -r", "");
+		/* Swapoff on halt/reboot */
+		new_init_action(SHUTDOWN, "swapoff -a", "");
+		/* Restart init when a QUIT is received */
+		new_init_action(RESTART, "init", "");
 		return;
 	}
 
@@ -786,7 +789,7 @@
  * and only one will be remembered and acted upon.
  */
 
-/* The SIGUSR[12]/SIGTERM handler */
+/* The SIGPWR/SIGUSR[12]/SIGTERM handler */
 static void halt_reboot_pwoff(int sig) NORETURN;
 static void halt_reboot_pwoff(int sig)
 {
@@ -931,10 +934,17 @@
 
 	/* Remove stale entries and SYSINIT entries.
 	 * We never rerun SYSINIT entries anyway,
-	 * removing them too saves a few bytes */
+	 * removing them too saves a few bytes
+	 */
 	nextp = &init_action_list;
 	while ((a = *nextp) != NULL) {
-		if ((a->action_type & ~SYSINIT) == 0) {
+		/*
+		 * Why pid == 0 check?
+		 * Process can be removed from inittab and added *later*.
+		 * If we delete its entry but process still runs,
+		 * duplicate is spawned when the entry is re-added.
+		 */
+		if ((a->action_type & ~SYSINIT) == 0 && a->pid == 0) {
 			*nextp = a->next;
 			free(a);
 		} else {
@@ -1058,10 +1068,13 @@
 	message(L_CONSOLE | L_LOG, "init started: %s", bb_banner);
 #endif
 
+#if 0
+/* It's 2013, does anyone really still depend on this? */
+/* If you do, consider adding swapon to sysinot actions then! */
 /* struct sysinfo is linux-specific */
-#ifdef __linux__
+# ifdef __linux__
 	/* Make sure there is enough memory to do something useful. */
-	if (ENABLE_SWAPONOFF) {
+	/*if (ENABLE_SWAPONOFF) - WRONG: we may have non-bbox swapon*/ {
 		struct sysinfo info;
 
 		if (sysinfo(&info) == 0
@@ -1075,6 +1088,7 @@
 			run_actions(SYSINIT);   /* wait and removing */
 		}
 	}
+# endif
 #endif
 
 	/* Check if we are supposed to be in single user mode */
@@ -1089,8 +1103,8 @@
 
 		/* NOTE that if CONFIG_FEATURE_USE_INITTAB is NOT defined,
 		 * then parse_inittab() simply adds in some default
-		 * actions(i.e., INIT_SCRIPT and a pair
-		 * of "askfirst" shells */
+		 * actions (i.e., INIT_SCRIPT and a pair
+		 * of "askfirst" shells) */
 		parse_inittab();
 	}
 
@@ -1114,13 +1128,14 @@
 	strncpy(argv[0], "init", strlen(argv[0]));
 	/* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
 	while (*++argv)
-		memset(*argv, 0, strlen(*argv));
+		nuke_str(*argv);
 
 	/* Set up signal handlers */
 	if (!DEBUG_INIT) {
 		struct sigaction sa;
 
 		bb_signals(0
+			+ (1 << SIGPWR)  /* halt */
 			+ (1 << SIGUSR1) /* halt */
 			+ (1 << SIGTERM) /* reboot */
 			+ (1 << SIGUSR2) /* poweroff */
@@ -1216,7 +1231,14 @@
 //usage:#define init_trivial_usage
 //usage:       ""
 //usage:#define init_full_usage "\n\n"
-//usage:       "Init is the parent of all processes"
+//usage:       "Init is the first process started during boot. It never exits."
+//usage:	IF_FEATURE_USE_INITTAB(
+//usage:   "\n""It (re)spawns children according to /etc/inittab."
+//usage:	)
+//usage:	IF_NOT_FEATURE_USE_INITTAB(
+//usage:   "\n""This version of init doesn't use /etc/inittab,"
+//usage:   "\n""has fixed set of processed to run."
+//usage:	)
 //usage:
 //usage:#define init_notes_usage
 //usage:	"This version of init is designed to be run only by the kernel.\n"
@@ -1234,9 +1256,6 @@
 //usage:	"	::shutdown:/sbin/swapoff -a\n"
 //usage:	"	::shutdown:/bin/umount -a -r\n"
 //usage:	"	::restart:/sbin/init\n"
-//usage:	"\n"
-//usage:	"if it detects that /dev/console is _not_ a serial console, it will also run:\n"
-//usage:	"\n"
 //usage:	"	tty2::askfirst:/bin/sh\n"
 //usage:	"	tty3::askfirst:/bin/sh\n"
 //usage:	"	tty4::askfirst:/bin/sh\n"
@@ -1252,11 +1271,7 @@
 //usage:	"		the specified process to run on. The contents of this field are\n"
 //usage:	"		appended to \"/dev/\" and used as-is. There is no need for this field to\n"
 //usage:	"		be unique, although if it isn't you may have strange results. If this\n"
-//usage:	"		field is left blank, the controlling tty is set to the console. Also\n"
-//usage:	"		note that if BusyBox detects that a serial console is in use, then only\n"
-//usage:	"		entries whose controlling tty is either the serial console or /dev/null\n"
-//usage:	"		will be run. BusyBox init does nothing with utmp. We don't need no\n"
-//usage:	"		stinkin' utmp.\n"
+//usage:	"		field is left blank, then the init's stdin/out will be used.\n"
 //usage:	"\n"
 //usage:	"	<runlevels>:\n"
 //usage:	"\n"