busybox: import current stable from upstream Gentoo

BUG=None
TEST=updated busybox, created a recovery image, booted it, recovered system, booted recovered system

Change-Id: I7f7a5389ed0ec63f807cbd0d4aee4f0fbde192ee
Reviewed-on: http://gerrit.chromium.org/gerrit/6736
Tested-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Anush Elangovan <anush@chromium.org>
Reviewed-by: David James <davidjames@chromium.org>
Reviewed-by: Nick Sanders <nsanders@chromium.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Richard Barnette <jrbarnette@chromium.org>
diff --git a/sys-apps/busybox/busybox-1.18.5.ebuild b/sys-apps/busybox/busybox-1.19.0.ebuild
similarity index 92%
rename from sys-apps/busybox/busybox-1.18.5.ebuild
rename to sys-apps/busybox/busybox-1.19.0.ebuild
index 5077886..73915a4 100644
--- a/sys-apps/busybox/busybox-1.18.5.ebuild
+++ b/sys-apps/busybox/busybox-1.19.0.ebuild
@@ -1,6 +1,6 @@
 # Copyright 1999-2011 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
-# $Header: /data/temp/gentoo//vcs-public-cvsroot/gentoo-x86/sys-apps/busybox/busybox-1.18.5.ebuild,v 1.1 2011/08/07 21:08:47 vapier Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-apps/busybox/busybox-1.19.0.ebuild,v 1.6 2011/08/24 19:18:38 maekke Exp $
 
 EAPI="3"
 inherit eutils flag-o-matic savedconfig toolchain-funcs
@@ -57,7 +57,7 @@
 fi
 LICENSE="GPL-2"
 SLOT="0"
-KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-linux"
+KEYWORDS="~alpha amd64 arm hppa ~ia64 ~m68k ~mips ppc ppc64 ~s390 ~sh ~sparc x86 ~x86-linux"
 IUSE="debug ipv6 make-symlinks +mdev nfs -pam selinux static elibc_glibc"
 RESTRICT="test"
 
@@ -84,11 +84,12 @@
 src_prepare() {
 	unset KBUILD_OUTPUT #88088
 	append-flags -fno-strict-aliasing #310413
+	use ppc64 && append-flags -mminimal-toc #130943
 	append-cppflags $($(tc-getPKG_CONFIG) libtirpc --cflags)
 
 	# patches go here!
-	epatch "${FILESDIR}"/busybox-1.18.0-bb.patch
-	#epatch "${FILESDIR}"/busybox-${PV}-*.patch
+	#epatch "${FILESDIR}"/busybox-1.19.0-bb.patch
+	epatch "${FILESDIR}"/busybox-${PV}-*.patch
 
 	# flag cleanup
 	sed -i -r \
@@ -252,7 +253,7 @@
 		ewarn "setting USE=make-symlinks and emerging to / is very dangerous."
 		ewarn "it WILL overwrite lots of system programs like: ls bash awk grep (bug 60805 for full list)."
 		ewarn "If you are creating a binary only and not merging this is probably ok."
-		ewarn "set env VERY_BRAVE_OR_VERY_DUMB=yes if this is realy what you want."
+		ewarn "set env VERY_BRAVE_OR_VERY_DUMB=yes if this is really what you want."
 		die "silly options will destroy your system"
 	fi
 
@@ -269,9 +270,7 @@
 		cp -vpPR _install/* "${ROOT}"/ || die "copying links for ${x} failed"
 	fi
 
-	echo
-	einfo "This ebuild has support for user defined configs"
-	einfo "Please read this ebuild for more details and re-emerge as needed"
-	einfo "if you want to add or remove functionality for ${PN}"
-	echo
+	elog "This ebuild has support for user defined configs"
+	elog "Please read this ebuild for more details and re-emerge as needed"
+	elog "if you want to add or remove functionality for ${PN}"
 }
diff --git a/sys-apps/busybox/files/busybox-1.17.0-bb.patch b/sys-apps/busybox/files/busybox-1.17.0-bb.patch
deleted file mode 100644
index a9d64e0..0000000
--- a/sys-apps/busybox/files/busybox-1.17.0-bb.patch
+++ /dev/null
@@ -1,23 +0,0 @@
---- a/include/applets.src.h
-+++ b/include/applets.src.h
-@@ -77,7 +77,9 @@
- IF_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, _BB_SUID_DROP, basename))
- IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, _BB_DIR_BIN, _BB_SUID_DROP, bash))
- IF_FEATURE_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, _BB_DIR_BIN, _BB_SUID_DROP, bash))
-+IF_ASH(APPLET_ODDNAME(bb, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
- IF_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_DROP))
-+IF_ASH(APPLET_ODDNAME(bbsh, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
- //IF_BBSH(APPLET(bbsh, _BB_DIR_BIN, _BB_SUID_DROP))
- IF_BEEP(APPLET(beep, _BB_DIR_USR_BIN, _BB_SUID_DROP))
- IF_BLKID(APPLET(blkid, _BB_DIR_SBIN, _BB_SUID_DROP))
---- a/shell/ash.c
-+++ b/shell/ash.c
-@@ -7255,6 +7255,8 @@
- 		}
- 		/* re-exec ourselves with the new arguments */
- 		execve(bb_busybox_exec_path, argv, envp);
-+		execve("/bin/busybox.static", argv, envp);
-+		execve("/bin/busybox", argv, envp);
- 		/* If they called chroot or otherwise made the binary no longer
- 		 * executable, fall through */
- 	}
diff --git a/sys-apps/busybox/files/busybox-1.18.0-bb.patch b/sys-apps/busybox/files/busybox-1.18.0-bb.patch
deleted file mode 100644
index 309d243..0000000
--- a/sys-apps/busybox/files/busybox-1.18.0-bb.patch
+++ /dev/null
@@ -1,22 +0,0 @@
---- a/shell/ash.c
-+++ b/shell/ash.c
-@@ -75,6 +75,8 @@
- //applet:IF_ASH(APPLET(ash, _BB_DIR_BIN, _BB_SUID_DROP))
- //applet:IF_FEATURE_SH_IS_ASH(APPLET_ODDNAME(sh, ash, _BB_DIR_BIN, _BB_SUID_DROP, sh))
- //applet:IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, _BB_DIR_BIN, _BB_SUID_DROP, bash))
-+//applet:IF_ASH(APPLET_ODDNAME(bb, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
-+//applet:IF_ASH(APPLET_ODDNAME(bbsh, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
- 
- //kbuild:lib-$(CONFIG_ASH) += ash.o ash_ptr_hack.o shell_common.o
- //kbuild:lib-$(CONFIG_ASH_RANDOM_SUPPORT) += random.o
---- a/shell/ash.c
-+++ b/shell/ash.c
-@@ -7255,6 +7255,8 @@
- 		}
- 		/* re-exec ourselves with the new arguments */
- 		execve(bb_busybox_exec_path, argv, envp);
-+		execve("/bin/busybox.static", argv, envp);
-+		execve("/bin/busybox", argv, envp);
- 		/* If they called chroot or otherwise made the binary no longer
- 		 * executable, fall through */
- 	}
diff --git a/sys-apps/busybox/files/busybox-1.18.1-bzip2.patch b/sys-apps/busybox/files/busybox-1.18.1-bzip2.patch
deleted file mode 100644
index cffa194..0000000
--- a/sys-apps/busybox/files/busybox-1.18.1-bzip2.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-diff -urpN busybox-1.18.1/archival/bzip2.c busybox-1.18.1-bzip2/archival/bzip2.c
---- busybox-1.18.1/archival/bzip2.c	2010-12-20 01:41:26.000000000 +0100
-+++ busybox-1.18.1-bzip2/archival/bzip2.c	2010-12-30 04:43:11.000000000 +0100
-@@ -128,10 +128,12 @@ IF_DESKTOP(long long) int FAST_FUNC comp
- 			break;
- 	}
- 
--#if ENABLE_FEATURE_CLEAN_UP
-+	/* Can't be conditional on ENABLE_FEATURE_CLEAN_UP -
-+	 * we are called repeatedly
-+	 */
- 	BZ2_bzCompressEnd(strm);
- 	free(iobuf);
--#endif
-+
- 	return total;
- }
- 
-diff -urpN busybox-1.18.1/archival/libarchive/bz/bzlib.c busybox-1.18.1-bzip2/archival/libarchive/bz/bzlib.c
---- busybox-1.18.1/archival/libarchive/bz/bzlib.c	2010-12-20 01:41:26.000000000 +0100
-+++ busybox-1.18.1-bzip2/archival/libarchive/bz/bzlib.c	2010-12-30 04:43:11.000000000 +0100
-@@ -361,7 +361,6 @@ int BZ2_bzCompress(bz_stream *strm, int 
- 
- 
- /*---------------------------------------------------*/
--#if ENABLE_FEATURE_CLEAN_UP
- static
- void BZ2_bzCompressEnd(bz_stream *strm)
- {
-@@ -372,9 +371,8 @@ void BZ2_bzCompressEnd(bz_stream *strm)
- 	free(s->arr2);
- 	free(s->ftab);
- 	free(s->crc32table);
--	free(strm->state);
-+	free(s);
- }
--#endif
- 
- 
- /*---------------------------------------------------*/
diff --git a/sys-apps/busybox/files/busybox-1.18.1-cpio.patch b/sys-apps/busybox/files/busybox-1.18.1-cpio.patch
deleted file mode 100644
index 135f809..0000000
--- a/sys-apps/busybox/files/busybox-1.18.1-cpio.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff -urpN busybox-1.18.1/archival/cpio.c busybox-1.18.1-cpio/archival/cpio.c
---- busybox-1.18.1/archival/cpio.c	2010-12-20 01:41:26.000000000 +0100
-+++ busybox-1.18.1-cpio/archival/cpio.c	2010-12-26 02:26:38.000000000 +0100
-@@ -308,16 +308,12 @@ int cpio_main(int argc UNUSED_PARAM, cha
- 	/* -L makes sense only with -o or -p */
- 
- #if !ENABLE_FEATURE_CPIO_O
--	/* no parameters */
--	opt_complementary = "=0";
- 	opt = getopt32(argv, OPTION_STR, &cpio_filename);
- 	argv += optind;
- 	if (opt & CPIO_OPT_FILE) { /* -F */
- 		xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO);
- 	}
- #else
--	/* _exactly_ one parameter for -p, thus <= 1 param if -p is allowed */
--	opt_complementary = ENABLE_FEATURE_CPIO_P ? "?1" : "=0";
- 	opt = getopt32(argv, OPTION_STR "oH:" IF_FEATURE_CPIO_P("p"), &cpio_filename, &cpio_fmt);
- 	argv += optind;
- 	if ((opt & (CPIO_OPT_FILE|CPIO_OPT_CREATE)) == CPIO_OPT_FILE) { /* -F without -o */
diff --git a/sys-apps/busybox/files/busybox-1.18.1-hush.patch b/sys-apps/busybox/files/busybox-1.18.1-hush.patch
deleted file mode 100644
index 5281a52..0000000
--- a/sys-apps/busybox/files/busybox-1.18.1-hush.patch
+++ /dev/null
@@ -1,259 +0,0 @@
-diff -urpN busybox-1.18.1/shell/hush.c busybox-1.18.1-hush/shell/hush.c
---- busybox-1.18.1/shell/hush.c	2010-12-21 05:31:04.000000000 +0100
-+++ busybox-1.18.1-hush/shell/hush.c	2011-01-07 14:59:19.649956156 +0100
-@@ -913,7 +913,7 @@ static const struct built_in_command blt
-  */
- #if HUSH_DEBUG
- /* prevent disasters with G.debug_indent < 0 */
--# define indent() fprintf(stderr, "%*s", (G.debug_indent * 2) & 0xff, "")
-+# define indent() fdprintf(2, "%*s", (G.debug_indent * 2) & 0xff, "")
- # define debug_enter() (G.debug_indent++)
- # define debug_leave() (G.debug_indent--)
- #else
-@@ -923,56 +923,56 @@ static const struct built_in_command blt
- #endif
- 
- #ifndef debug_printf
--# define debug_printf(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_parse
--# define debug_printf_parse(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_parse(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_exec
--#define debug_printf_exec(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+#define debug_printf_exec(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_env
--# define debug_printf_env(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_env(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_jobs
--# define debug_printf_jobs(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_jobs(...) (indent(), fdprintf(2, __VA_ARGS__))
- # define DEBUG_JOBS 1
- #else
- # define DEBUG_JOBS 0
- #endif
- 
- #ifndef debug_printf_expand
--# define debug_printf_expand(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_expand(...) (indent(), fdprintf(2, __VA_ARGS__))
- # define DEBUG_EXPAND 1
- #else
- # define DEBUG_EXPAND 0
- #endif
- 
- #ifndef debug_printf_varexp
--# define debug_printf_varexp(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_varexp(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_glob
--# define debug_printf_glob(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_glob(...) (indent(), fdprintf(2, __VA_ARGS__))
- # define DEBUG_GLOB 1
- #else
- # define DEBUG_GLOB 0
- #endif
- 
- #ifndef debug_printf_list
--# define debug_printf_list(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_list(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_subst
--# define debug_printf_subst(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_subst(...) (indent(), fdprintf(2, __VA_ARGS__))
- #endif
- 
- #ifndef debug_printf_clean
--# define debug_printf_clean(...) (indent(), fprintf(stderr, __VA_ARGS__))
-+# define debug_printf_clean(...) (indent(), fdprintf(2, __VA_ARGS__))
- # define DEBUG_CLEAN 1
- #else
- # define DEBUG_CLEAN 0
-@@ -982,9 +982,9 @@ static const struct built_in_command blt
- static void debug_print_strings(const char *prefix, char **vv)
- {
- 	indent();
--	fprintf(stderr, "%s:\n", prefix);
-+	fdprintf(2, "%s:\n", prefix);
- 	while (*vv)
--		fprintf(stderr, " '%s'\n", *vv++);
-+		fdprintf(2, " '%s'\n", *vv++);
- }
- #else
- # define debug_print_strings(prefix, vv) ((void)0)
-@@ -1416,6 +1416,22 @@ static void hush_exit(int exitcode)
- 		builtin_eval(argv);
- 	}
- 
-+#if ENABLE_FEATURE_CLEAN_UP
-+	{
-+		struct variable *cur_var;
-+		if (G.cwd != bb_msg_unknown)
-+			free((char*)G.cwd);
-+		cur_var = G.top_var;
-+		while (cur_var) {
-+			struct variable *tmp = cur_var;
-+			if (!cur_var->max_len)
-+				free(cur_var->varstr);
-+			cur_var = cur_var->next;
-+			free(tmp);
-+		}
-+	}
-+#endif
-+
- #if ENABLE_HUSH_JOB
- 	fflush_all();
- 	sigexit(- (exitcode & 0xff));
-@@ -2158,22 +2174,22 @@ static void debug_print_list(const char 
- 	int i = 0;
- 
- 	indent();
--	fprintf(stderr, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
-+	fdprintf(2, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
- 			prefix, list, n, string_start, o->length, o->maxlen,
- 			!!(o->o_expflags & EXP_FLAG_GLOB),
- 			o->has_quoted_part,
- 			!!(o->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
- 	while (i < n) {
- 		indent();
--		fprintf(stderr, " list[%d]=%d '%s' %p\n", i, (int)list[i],
--				o->data + (int)list[i] + string_start,
--				o->data + (int)list[i] + string_start);
-+		fdprintf(2, " list[%d]=%d '%s' %p\n", i, (int)(uintptr_t)list[i],
-+				o->data + (int)(uintptr_t)list[i] + string_start,
-+				o->data + (int)(uintptr_t)list[i] + string_start);
- 		i++;
- 	}
- 	if (n) {
--		const char *p = o->data + (int)list[n - 1] + string_start;
-+		const char *p = o->data + (int)(uintptr_t)list[n - 1] + string_start;
- 		indent();
--		fprintf(stderr, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
-+		fdprintf(2, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
- 	}
- }
- #else
-@@ -2672,18 +2688,18 @@ static void debug_print_tree(struct pipe
- 
- 	pin = 0;
- 	while (pi) {
--		fprintf(stderr, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
-+		fdprintf(2, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
- 				pin, RES[pi->res_word], pi->followup, PIPE[pi->followup]);
- 		prn = 0;
- 		while (prn < pi->num_cmds) {
- 			struct command *command = &pi->cmds[prn];
- 			char **argv = command->argv;
- 
--			fprintf(stderr, "%*s cmd %d assignment_cnt:%d",
-+			fdprintf(2, "%*s cmd %d assignment_cnt:%d",
- 					lvl*2, "", prn,
- 					command->assignment_cnt);
- 			if (command->group) {
--				fprintf(stderr, " group %s: (argv=%p)%s%s\n",
-+				fdprintf(2, " group %s: (argv=%p)%s%s\n",
- 						CMDTYPE[command->cmd_type],
- 						argv
- # if !BB_MMU
-@@ -2697,10 +2713,10 @@ static void debug_print_tree(struct pipe
- 				continue;
- 			}
- 			if (argv) while (*argv) {
--				fprintf(stderr, " '%s'", *argv);
-+				fdprintf(2, " '%s'", *argv);
- 				argv++;
- 			}
--			fprintf(stderr, "\n");
-+			fdprintf(2, "\n");
- 			prn++;
- 		}
- 		pi = pi->next;
-@@ -4106,7 +4122,16 @@ static struct pipe *parse_stream(char **
- 				if (IS_NULL_CMD(ctx.command)
- 				 && dest.length == 0 && !dest.has_quoted_part
- 				) {
--					continue;
-+					/* This newline can be ignored. But...
-+					 * without the below check, interactive shell
-+					 * will ignore even lines with bare <newline>,
-+					 * and show the continuation prompt:
-+					 * ps1_prompt$ <enter>
-+					 * ps2> _   <=== wrong prompt, should be ps1
-+					 */
-+					struct pipe *pi = ctx.list_head;
-+					if (pi->num_cmds != 0)
-+						continue;
- 				}
- 				/* Treat newline as a command separator. */
- 				done_pipe(&ctx, PIPE_SEQ);
-@@ -7445,7 +7470,7 @@ int hush_main(int argc, char **argv)
- 	unsigned builtin_argc;
- 	char **e;
- 	struct variable *cur_var;
--	struct variable shell_ver;
-+	struct variable *shell_ver;
- 
- 	INIT_G();
- 	if (EXIT_SUCCESS) /* if EXIT_SUCCESS == 0, it is already done */
-@@ -7454,17 +7479,17 @@ int hush_main(int argc, char **argv)
- 	G.argv0_for_re_execing = argv[0];
- #endif
- 	/* Deal with HUSH_VERSION */
--	memset(&shell_ver, 0, sizeof(shell_ver));
--	shell_ver.flg_export = 1;
--	shell_ver.flg_read_only = 1;
-+	shell_ver = xzalloc(sizeof(*shell_ver));
-+	shell_ver->flg_export = 1;
-+	shell_ver->flg_read_only = 1;
- 	/* Code which handles ${var<op>...} needs writable values for all variables,
- 	 * therefore we xstrdup: */
--	shell_ver.varstr = xstrdup(hush_version_str),
--	G.top_var = &shell_ver;
-+	shell_ver->varstr = xstrdup(hush_version_str);
- 	/* Create shell local variables from the values
- 	 * currently living in the environment */
- 	debug_printf_env("unsetenv '%s'\n", "HUSH_VERSION");
- 	unsetenv("HUSH_VERSION"); /* in case it exists in initial env */
-+	G.top_var = shell_ver;
- 	cur_var = G.top_var;
- 	e = environ;
- 	if (e) while (*e) {
-@@ -7479,8 +7504,8 @@ int hush_main(int argc, char **argv)
- 		e++;
- 	}
- 	/* (Re)insert HUSH_VERSION into env (AFTER we scanned the env!) */
--	debug_printf_env("putenv '%s'\n", shell_ver.varstr);
--	putenv(shell_ver.varstr);
-+	debug_printf_env("putenv '%s'\n", shell_ver->varstr);
-+	putenv(shell_ver->varstr);
- 
- 	/* Export PWD */
- 	set_pwd_var(/*exp:*/ 1);
-@@ -7840,18 +7865,6 @@ int hush_main(int argc, char **argv)
- 	parse_and_run_file(stdin);
- 
-  final_return:
--#if ENABLE_FEATURE_CLEAN_UP
--	if (G.cwd != bb_msg_unknown)
--		free((char*)G.cwd);
--	cur_var = G.top_var->next;
--	while (cur_var) {
--		struct variable *tmp = cur_var;
--		if (!cur_var->max_len)
--			free(cur_var->varstr);
--		cur_var = cur_var->next;
--		free(tmp);
--	}
--#endif
- 	hush_exit(G.last_exitcode);
- }
- 
diff --git a/sys-apps/busybox/files/busybox-1.18.1-mkswap.patch b/sys-apps/busybox/files/busybox-1.18.1-mkswap.patch
deleted file mode 100644
index 41dff57..0000000
--- a/sys-apps/busybox/files/busybox-1.18.1-mkswap.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -urpN busybox-1.18.1/util-linux/mkswap.c busybox-1.18.1-mkswap/util-linux/mkswap.c
---- busybox-1.18.1/util-linux/mkswap.c	2010-12-20 01:41:27.000000000 +0100
-+++ busybox-1.18.1-mkswap/util-linux/mkswap.c	2011-01-05 11:41:24.455856773 +0100
-@@ -15,7 +15,7 @@ static void mkswap_selinux_setcontext(in
- 	if (!is_selinux_enabled())
- 		return;
- 
--	xfstat(fd, &stbuf, argv[0]);
-+	xfstat(fd, &stbuf, path);
- 	if (S_ISREG(stbuf.st_mode)) {
- 		security_context_t newcon;
- 		security_context_t oldcon = NULL;
diff --git a/sys-apps/busybox/files/busybox-1.18.1-warning.patch b/sys-apps/busybox/files/busybox-1.18.1-warning.patch
deleted file mode 100644
index cda94bd..0000000
--- a/sys-apps/busybox/files/busybox-1.18.1-warning.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-diff -urpN busybox-1.18.1/libbb/procps.c busybox-1.18.1-warning/libbb/procps.c
---- busybox-1.18.1/libbb/procps.c	2010-12-21 05:29:45.000000000 +0100
-+++ busybox-1.18.1-warning/libbb/procps.c	2011-01-07 13:41:22.000000000 +0100
-@@ -154,6 +154,7 @@ static unsigned long fast_strtoul_10(cha
- 	return n;
- }
- 
-+# if ENABLE_FEATURE_FAST_TOP
- static long fast_strtol_10(char **endptr)
- {
- 	if (**endptr != '-')
-@@ -162,6 +163,7 @@ static long fast_strtol_10(char **endptr
- 	(*endptr)++;
- 	return - (long)fast_strtoul_10(endptr);
- }
-+# endif
- 
- static char *skip_fields(char *str, int count)
- {
-@@ -448,7 +450,7 @@ procps_status_t* FAST_FUNC procps_scan(p
- //FIXME: is it safe to assume this field exists?
- 			sp->last_seen_on_cpu = fast_strtoul_10(&cp);
- # endif
--#endif /* end of !ENABLE_FEATURE_TOP_SMP_PROCESS */
-+#endif /* FEATURE_FAST_TOP */
- 
- #if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
- 			sp->niceness = tasknice;
diff --git a/sys-apps/busybox/files/busybox-1.18.3-buildsys.patch b/sys-apps/busybox/files/busybox-1.18.3-buildsys.patch
deleted file mode 100644
index 330b73f..0000000
--- a/sys-apps/busybox/files/busybox-1.18.3-buildsys.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- busybox-1.18.3/Config.in
-+++ busybox-1.18.3-buildsys/Config.in
-@@ -126,7 +126,6 @@ config FEATURE_INSTALLER
- config INSTALL_NO_USR
- 	bool "Don't use /usr"
- 	default n
--	depends on FEATURE_INSTALLER
- 	help
- 	  Disable use of /usr. busybox --install and "make install"
- 	  will install applets only to /bin and /sbin,
diff --git a/sys-apps/busybox/files/busybox-1.18.3-modutils24.patch b/sys-apps/busybox/files/busybox-1.18.3-modutils24.patch
deleted file mode 100644
index 2b13787..0000000
--- a/sys-apps/busybox/files/busybox-1.18.3-modutils24.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- busybox-1.18.3/modutils/modutils-24.c
-+++ busybox-1.18.3-modutils24/modutils/modutils-24.c
-@@ -2474,6 +2474,7 @@ new_process_module_arguments(struct obj_
- 		n = 0;
- 		p = val;
- 		while (*p != 0) {
-+			char sv_ch;
- 			char *endp;
- 
- 			if (++n > max)
-@@ -2482,14 +2483,17 @@ new_process_module_arguments(struct obj_
- 			switch (*pinfo) {
- 			case 's':
- 				len = strcspn(p, ",");
-+				sv_ch = p[len];
- 				p[len] = 0;
- 				obj_string_patch(f, sym->secidx,
- 						 loc - contents, p);
- 				loc += tgt_sizeof_char_p;
- 				p += len;
-+				*p = sv_ch;
- 				break;
- 			case 'c':
- 				len = strcspn(p, ",");
-+				sv_ch = p[len];
- 				p[len] = 0;
- 				if (len >= charssize)
- 					bb_error_msg_and_die("string too long for %s (max %ld)", param,
-@@ -2497,6 +2501,7 @@ new_process_module_arguments(struct obj_
- 				strcpy((char *) loc, p);
- 				loc += charssize;
- 				p += len;
-+				*p = sv_ch;
- 				break;
- 			case 'b':
- 				*loc++ = strtoul(p, &endp, 0);
diff --git a/sys-apps/busybox/files/busybox-1.18.3-wget.patch b/sys-apps/busybox/files/busybox-1.18.3-wget.patch
deleted file mode 100644
index 88cfc91..0000000
--- a/sys-apps/busybox/files/busybox-1.18.3-wget.patch
+++ /dev/null
@@ -1,128 +0,0 @@
---- busybox-1.18.3/networking/wget.c
-+++ busybox-1.18.3-wget/networking/wget.c
-@@ -446,7 +446,7 @@ static FILE* prepare_ftp_session(FILE **
- 
- static void NOINLINE retrieve_file_data(FILE *dfp, int output_fd)
- {
--	char buf[512];
-+	char buf[4*1024]; /* made bigger to speed up local xfers */
- #if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
- # if ENABLE_FEATURE_WGET_TIMEOUT
- 	unsigned second_cnt;
-@@ -455,7 +455,6 @@ static void NOINLINE retrieve_file_data(
- 
- 	polldata.fd = fileno(dfp);
- 	polldata.events = POLLIN | POLLPRI;
--	ndelay_on(polldata.fd);
- #endif
- 	progress_meter(PROGRESS_START);
- 
-@@ -464,6 +463,10 @@ static void NOINLINE retrieve_file_data(
- 
- 	/* Loops only if chunked */
- 	while (1) {
-+
-+#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
-+		ndelay_on(polldata.fd);
-+#endif
- 		while (1) {
- 			int n;
- 			unsigned rdsz;
-@@ -493,22 +496,46 @@ static void NOINLINE retrieve_file_data(
- 				progress_meter(PROGRESS_BUMP);
- 			}
- #endif
-+			/* fread internally uses read loop, which in our case
-+			 * is usually exited when we get EAGAIN.
-+			 * In this case, libc sets error marker on the stream.
-+			 * Need to clear it before next fread to avoid possible
-+			 * rare false positive ferror below. Rare because usually
-+			 * fread gets more than zero bytes, and we don't fall
-+			 * into if (n <= 0) ...
-+			 */
-+			clearerr(dfp);
-+			errno = 0;
- 			n = safe_fread(buf, rdsz, dfp);
-+			/* man fread:
-+			 * If error occurs, or EOF is reached, the return value
-+			 * is a short item count (or zero).
-+			 * fread does not distinguish between EOF and error.
-+			 */
- 			if (n <= 0) {
--				if (ferror(dfp)) {
--					/* perror will not work: ferror doesn't set errno */
--					bb_error_msg_and_die(bb_msg_read_error);
--				}
--				break;
-+#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
-+				if (errno == EAGAIN) /* poll lied, there is no data? */
-+					continue; /* yes */
-+#endif
-+				if (ferror(dfp))
-+					bb_perror_msg_and_die(bb_msg_read_error);
-+				break; /* EOF, not error */
- 			}
-+
- 			xwrite(output_fd, buf, n);
- #if ENABLE_FEATURE_WGET_STATUSBAR
- 			G.transferred += n;
- 			progress_meter(PROGRESS_BUMP);
- #endif
--			if (G.got_clen)
-+			if (G.got_clen) {
- 				G.content_len -= n;
-+				if (G.content_len == 0)
-+					break;
-+			}
- 		}
-+#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
-+		ndelay_off(polldata.fd);
-+#endif
- 
- 		if (!G.chunked)
- 			break;
-@@ -706,6 +733,11 @@ int wget_main(int argc UNUSED_PARAM, cha
- 		fprintf(sfp, "Host: %s\r\nUser-Agent: %s\r\n",
- 			target.host, user_agent);
- 
-+		/* Ask server to close the connection as soon as we are done
-+		 * (IOW: we do not intend to send more requests)
-+		 */
-+		fprintf(sfp, "Connection: close\r\n");
-+
- #if ENABLE_FEATURE_WGET_AUTHENTICATION
- 		if (target.user) {
- 			fprintf(sfp, "Proxy-Authorization: Basic %s\r\n"+6,
-@@ -719,22 +751,25 @@ int wget_main(int argc UNUSED_PARAM, cha
- 
- 		if (G.beg_range)
- 			fprintf(sfp, "Range: bytes=%"OFF_FMT"u-\r\n", G.beg_range);
-+
- #if ENABLE_FEATURE_WGET_LONG_OPTIONS
- 		if (extra_headers)
- 			fputs(extra_headers, sfp);
- 
- 		if (opt & WGET_OPT_POST_DATA) {
- 			char *estr = URL_escape(post_data);
--			fprintf(sfp, "Content-Type: application/x-www-form-urlencoded\r\n");
--			fprintf(sfp, "Content-Length: %u\r\n" "\r\n" "%s",
--					(int) strlen(estr), estr);
--			/*fprintf(sfp, "Connection: Keep-Alive\r\n\r\n");*/
--			/*fprintf(sfp, "%s\r\n", estr);*/
-+			fprintf(sfp,
-+				"Content-Type: application/x-www-form-urlencoded\r\n"
-+				"Content-Length: %u\r\n"
-+				"\r\n"
-+				"%s",
-+				(int) strlen(estr), estr
-+			);
- 			free(estr);
- 		} else
- #endif
--		{ /* If "Connection:" is needed, document why */
--			fprintf(sfp, /* "Connection: close\r\n" */ "\r\n");
-+		{
-+			fprintf(sfp, "\r\n");
- 		}
- 
- 		fflush(sfp);
diff --git a/sys-apps/busybox/files/busybox-1.18.4-fuser.patch b/sys-apps/busybox/files/busybox-1.18.4-fuser.patch
deleted file mode 100644
index 838d9ac..0000000
--- a/sys-apps/busybox/files/busybox-1.18.4-fuser.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- busybox-1.18.4/procps/fuser.c
-+++ busybox-1.18.4-fuser/procps/fuser.c
-@@ -271,7 +271,7 @@ Find processes which use FILEs or PORTs
- 		if (sscanf(*pp, "%u/%4s", &port, tproto) != 2)
- 			goto file;
- 		sprintf(path, "/proc/net/%s", tproto);
--		if (access(path, R_OK) != 0) { /* PORT/PROTO */
-+		if (access(path, R_OK) == 0) { /* PORT/PROTO */
- 			scan_proc_net(path, port);
- 		} else { /* FILE */
-  file:
diff --git a/sys-apps/busybox/files/busybox-1.18.4-hush.patch b/sys-apps/busybox/files/busybox-1.18.4-hush.patch
deleted file mode 100644
index 1e5a5cf..0000000
--- a/sys-apps/busybox/files/busybox-1.18.4-hush.patch
+++ /dev/null
@@ -1,183 +0,0 @@
---- busybox-1.18.4/shell/hush.c
-+++ busybox-1.18.4-hush/shell/hush.c
-@@ -427,6 +427,15 @@ enum {
- /* Used for initialization: o_string foo = NULL_O_STRING; */
- #define NULL_O_STRING { NULL }
- 
-+#ifndef debug_printf_parse
-+static const char *const assignment_flag[] = {
-+	"MAYBE_ASSIGNMENT",
-+	"DEFINITELY_ASSIGNMENT",
-+	"NOT_ASSIGNMENT",
-+	"WORD_IS_KEYWORD",
-+};
-+#endif
-+
- /* I can almost use ordinary FILE*.  Is open_memstream() universally
-  * available?  Where is it documented? */
- typedef struct in_str {
-@@ -2885,24 +2894,24 @@ static const struct reserved_combo* matc
- 	 */
- 	static const struct reserved_combo reserved_list[] = {
- # if ENABLE_HUSH_IF
--		{ "!",     RES_NONE,  NOT_ASSIGNMENT , 0 },
--		{ "if",    RES_IF,    WORD_IS_KEYWORD, FLAG_THEN | FLAG_START },
--		{ "then",  RES_THEN,  WORD_IS_KEYWORD, FLAG_ELIF | FLAG_ELSE | FLAG_FI },
--		{ "elif",  RES_ELIF,  WORD_IS_KEYWORD, FLAG_THEN },
--		{ "else",  RES_ELSE,  WORD_IS_KEYWORD, FLAG_FI   },
--		{ "fi",    RES_FI,    NOT_ASSIGNMENT , FLAG_END  },
-+		{ "!",     RES_NONE,  NOT_ASSIGNMENT  , 0 },
-+		{ "if",    RES_IF,    MAYBE_ASSIGNMENT, FLAG_THEN | FLAG_START },
-+		{ "then",  RES_THEN,  MAYBE_ASSIGNMENT, FLAG_ELIF | FLAG_ELSE | FLAG_FI },
-+		{ "elif",  RES_ELIF,  MAYBE_ASSIGNMENT, FLAG_THEN },
-+		{ "else",  RES_ELSE,  MAYBE_ASSIGNMENT, FLAG_FI   },
-+		{ "fi",    RES_FI,    NOT_ASSIGNMENT  , FLAG_END  },
- # endif
- # if ENABLE_HUSH_LOOPS
--		{ "for",   RES_FOR,   NOT_ASSIGNMENT , FLAG_IN | FLAG_DO | FLAG_START },
--		{ "while", RES_WHILE, WORD_IS_KEYWORD, FLAG_DO | FLAG_START },
--		{ "until", RES_UNTIL, WORD_IS_KEYWORD, FLAG_DO | FLAG_START },
--		{ "in",    RES_IN,    NOT_ASSIGNMENT , FLAG_DO   },
--		{ "do",    RES_DO,    WORD_IS_KEYWORD, FLAG_DONE },
--		{ "done",  RES_DONE,  NOT_ASSIGNMENT , FLAG_END  },
-+		{ "for",   RES_FOR,   NOT_ASSIGNMENT  , FLAG_IN | FLAG_DO | FLAG_START },
-+		{ "while", RES_WHILE, MAYBE_ASSIGNMENT, FLAG_DO | FLAG_START },
-+		{ "until", RES_UNTIL, MAYBE_ASSIGNMENT, FLAG_DO | FLAG_START },
-+		{ "in",    RES_IN,    NOT_ASSIGNMENT  , FLAG_DO   },
-+		{ "do",    RES_DO,    MAYBE_ASSIGNMENT, FLAG_DONE },
-+		{ "done",  RES_DONE,  NOT_ASSIGNMENT  , FLAG_END  },
- # endif
- # if ENABLE_HUSH_CASE
--		{ "case",  RES_CASE,  NOT_ASSIGNMENT , FLAG_MATCH | FLAG_START },
--		{ "esac",  RES_ESAC,  NOT_ASSIGNMENT , FLAG_END  },
-+		{ "case",  RES_CASE,  NOT_ASSIGNMENT  , FLAG_MATCH | FLAG_START },
-+		{ "esac",  RES_ESAC,  NOT_ASSIGNMENT  , FLAG_END  },
- # endif
- 	};
- 	const struct reserved_combo *r;
-@@ -2968,6 +2977,7 @@ static int reserved_word(o_string *word,
- 	ctx->ctx_res_w = r->res;
- 	ctx->old_flag = r->flag;
- 	word->o_assignment = r->assignment_flag;
-+	debug_printf_parse("word->o_assignment='%s'\n", assignment_flag[word->o_assignment]);
- 
- 	if (ctx->old_flag & FLAG_END) {
- 		struct parse_context *old;
-@@ -3034,18 +3044,6 @@ static int done_word(o_string *word, str
- 		debug_printf_parse("word stored in rd_filename: '%s'\n", word->data);
- 		ctx->pending_redirect = NULL;
- 	} else {
--		/* If this word wasn't an assignment, next ones definitely
--		 * can't be assignments. Even if they look like ones. */
--		if (word->o_assignment != DEFINITELY_ASSIGNMENT
--		 && word->o_assignment != WORD_IS_KEYWORD
--		) {
--			word->o_assignment = NOT_ASSIGNMENT;
--		} else {
--			if (word->o_assignment == DEFINITELY_ASSIGNMENT)
--				command->assignment_cnt++;
--			word->o_assignment = MAYBE_ASSIGNMENT;
--		}
--
- #if HAS_KEYWORDS
- # if ENABLE_HUSH_CASE
- 		if (ctx->ctx_dsemicolon
-@@ -3065,8 +3063,9 @@ static int done_word(o_string *word, str
- 		 && ctx->ctx_res_w != RES_CASE
- # endif
- 		) {
--			debug_printf_parse("checking '%s' for reserved-ness\n", word->data);
--			if (reserved_word(word, ctx)) {
-+			int reserved = reserved_word(word, ctx);
-+			debug_printf_parse("checking for reserved-ness: %d\n", reserved);
-+			if (reserved) {
- 				o_reset_to_empty_unquoted(word);
- 				debug_printf_parse("done_word return %d\n",
- 						(ctx->ctx_res_w == RES_SNTX));
-@@ -3087,6 +3086,23 @@ static int done_word(o_string *word, str
- 					"groups and arglists don't mix\n");
- 			return 1;
- 		}
-+
-+		/* If this word wasn't an assignment, next ones definitely
-+		 * can't be assignments. Even if they look like ones. */
-+		if (word->o_assignment != DEFINITELY_ASSIGNMENT
-+		 && word->o_assignment != WORD_IS_KEYWORD
-+		) {
-+			word->o_assignment = NOT_ASSIGNMENT;
-+		} else {
-+			if (word->o_assignment == DEFINITELY_ASSIGNMENT) {
-+				command->assignment_cnt++;
-+				debug_printf_parse("++assignment_cnt=%d\n", command->assignment_cnt);
-+			}
-+			debug_printf_parse("word->o_assignment was:'%s'\n", assignment_flag[word->o_assignment]);
-+			word->o_assignment = MAYBE_ASSIGNMENT;
-+		}
-+		debug_printf_parse("word->o_assignment='%s'\n", assignment_flag[word->o_assignment]);
-+
- 		if (word->has_quoted_part
- 		 /* optimization: and if it's ("" or '') or ($v... or `cmd`...): */
- 		 && (word->data[0] == '\0' || word->data[0] == SPECIAL_VAR_SYMBOL)
-@@ -4105,6 +4121,7 @@ static struct pipe *parse_stream(char **
- 			 && is_well_formed_var_name(dest.data, '=')
- 			) {
- 				dest.o_assignment = DEFINITELY_ASSIGNMENT;
-+				debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
- 			}
- 			continue;
- 		}
-@@ -4154,6 +4171,7 @@ static struct pipe *parse_stream(char **
- 					heredoc_cnt = 0;
- 				}
- 				dest.o_assignment = MAYBE_ASSIGNMENT;
-+				debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
- 				ch = ';';
- 				/* note: if (is_blank) continue;
- 				 * will still trigger for us */
-@@ -4203,6 +4221,7 @@ static struct pipe *parse_stream(char **
- 			}
- 			done_pipe(&ctx, PIPE_SEQ);
- 			dest.o_assignment = MAYBE_ASSIGNMENT;
-+			debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
- 			/* Do we sit outside of any if's, loops or case's? */
- 			if (!HAS_KEYWORDS
- 			 IF_HAS_KEYWORDS(|| (ctx.ctx_res_w == RES_NONE && ctx.old_flag == 0))
-@@ -4309,6 +4328,7 @@ static struct pipe *parse_stream(char **
- 			/* ch is a special char and thus this word
- 			 * cannot be an assignment */
- 			dest.o_assignment = NOT_ASSIGNMENT;
-+			debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
- 		}
- 
- 		/* Note: nommu_addchr(&ctx.as_string, ch) is already done */
-@@ -4406,6 +4426,7 @@ static struct pipe *parse_stream(char **
- 			/* We just finished a cmd. New one may start
- 			 * with an assignment */
- 			dest.o_assignment = MAYBE_ASSIGNMENT;
-+			debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
- 			break;
- 		case '&':
- 			if (done_word(&dest, &ctx)) {
-@@ -7292,7 +7313,10 @@ static int run_list(struct pipe *pi)
- #endif
- #if ENABLE_HUSH_LOOPS
- 		/* Beware of "while false; true; do ..."! */
--		if (pi->next && pi->next->res_word == RES_DO) {
-+		if (pi->next
-+		 && (pi->next->res_word == RES_DO || pi->next->res_word == RES_DONE)
-+		/* (the second check above is needed for "while ...; do \n done" case) */
-+		) {
- 			if (rword == RES_WHILE) {
- 				if (rcode) {
- 					/* "while false; do...done" - exitcode 0 */
---- busybox-1.18.4/shell/hush_test/hush-misc/while3.right
-+++ busybox-1.18.4-hush/shell/hush_test/hush-misc/while3.right
-@@ -0,0 +1 @@
-+OK:0
---- busybox-1.18.4/shell/hush_test/hush-misc/while3.tests
-+++ busybox-1.18.4-hush/shell/hush_test/hush-misc/while3.tests
-@@ -0,0 +1,4 @@
-+while false; do
-+    # bash will require at least ":" here...
-+done
-+echo OK:$?
diff --git a/sys-apps/busybox/files/busybox-1.19.0-bb.patch b/sys-apps/busybox/files/busybox-1.19.0-bb.patch
new file mode 100644
index 0000000..a66b45a
--- /dev/null
+++ b/sys-apps/busybox/files/busybox-1.19.0-bb.patch
@@ -0,0 +1,22 @@
+--- a/shell/ash.c
++++ b/shell/ash.c
+@@ -75,6 +75,8 @@
+ //applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
+ //applet:IF_FEATURE_SH_IS_ASH(APPLET_ODDNAME(sh, ash, BB_DIR_BIN, BB_SUID_DROP, sh))
+ //applet:IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, BB_DIR_BIN, BB_SUID_DROP, bash))
++//applet:IF_ASH(APPLET_ODDNAME(bb, ash, BB_DIR_BIN, BB_SUID_DROP, ash))
++//applet:IF_ASH(APPLET_ODDNAME(bbsh, ash, BB_DIR_BIN, BB_SUID_DROP, ash))
+ 
+ //kbuild:lib-$(CONFIG_ASH) += ash.o ash_ptr_hack.o shell_common.o
+ //kbuild:lib-$(CONFIG_ASH_RANDOM_SUPPORT) += random.o
+--- a/shell/ash.c
++++ b/shell/ash.c
+@@ -7255,6 +7255,8 @@
+ 		}
+ 		/* re-exec ourselves with the new arguments */
+ 		execve(bb_busybox_exec_path, argv, envp);
++		execve("/bin/busybox.static", argv, envp);
++		execve("/bin/busybox", argv, envp);
+ 		/* If they called chroot or otherwise made the binary no longer
+ 		 * executable, fall through */
+ 	}
diff --git a/sys-apps/busybox/files/busybox-1.19.0-cttyhack.patch b/sys-apps/busybox/files/busybox-1.19.0-cttyhack.patch
new file mode 100644
index 0000000..ef2781d
--- /dev/null
+++ b/sys-apps/busybox/files/busybox-1.19.0-cttyhack.patch
@@ -0,0 +1,18 @@
+--- busybox-1.19.0/shell/cttyhack.c
++++ busybox-1.19.0-cttyhack/shell/cttyhack.c
+@@ -122,10 +122,12 @@ int cttyhack_main(int argc UNUSED_PARAM,
+ 		do {
+ #ifdef __linux__
+ 			int s = open_read_close("/sys/class/tty/console/active",
+-				console + 5, sizeof(console) - 5 - 1);
++				console + 5, sizeof(console) - 5);
+ 			if (s > 0) {
+-				/* found active console via sysfs (Linux 2.6.38+) */
+-				console[5 + s] = '\0';
++				/* found active console via sysfs (Linux 2.6.38+)
++				 * sysfs string looks like "ttyS0\n" so zap the newline:
++				 */
++				console[4 + s] = '\0';
+ 				break;
+ 			}
+ 
diff --git a/sys-apps/busybox/files/busybox-1.19.0-less.patch b/sys-apps/busybox/files/busybox-1.19.0-less.patch
new file mode 100644
index 0000000..a1d3374
--- /dev/null
+++ b/sys-apps/busybox/files/busybox-1.19.0-less.patch
@@ -0,0 +1,12 @@
+--- busybox-1.19.0/miscutils/less.c
++++ busybox-1.19.0-less/miscutils/less.c
+@@ -990,7 +990,8 @@ static int64_t less_getch(int pos)
+ 	 */
+ 	if (key >= 0 && key < ' ' && key != 0x0d && key != 8)
+ 		goto again;
+-	return key;
++
++	return key64;
+ }
+ 
+ static char* less_gets(int sz)
diff --git a/sys-apps/busybox/files/busybox-1.19.0-sed.patch b/sys-apps/busybox/files/busybox-1.19.0-sed.patch
new file mode 100644
index 0000000..c71e9c2
--- /dev/null
+++ b/sys-apps/busybox/files/busybox-1.19.0-sed.patch
@@ -0,0 +1,237 @@
+--- busybox-1.19.0/editors/sed.c
++++ busybox-1.19.0-sed/editors/sed.c
+@@ -75,6 +75,13 @@
+ #include "libbb.h"
+ #include "xregex.h"
+ 
++#if 0
++# define dbg(...) bb_error_msg(__VA_ARGS__)
++#else
++# define dbg(...) ((void)0)
++#endif
++
++
+ enum {
+ 	OPT_in_place = 1 << 0,
+ };
+@@ -89,6 +96,7 @@ typedef struct sed_cmd_s {
+ 	regex_t *end_match;     /* sed -e '/match/,/end_match/cmd' */
+ 	regex_t *sub_match;     /* For 's/sub_match/string/' */
+ 	int beg_line;           /* 'sed 1p'   0 == apply commands to all lines */
++	int beg_line_orig;      /* copy of the above, needed for -i */
+ 	int end_line;           /* 'sed 1,3p' 0 == one line only. -1 = last line ($) */
+ 
+ 	FILE *sw_file;          /* File (sw) command writes to, -1 for none. */
+@@ -123,7 +131,7 @@ struct globals {
+ 	regex_t *previous_regex_ptr;
+ 
+ 	/* linked list of sed commands */
+-	sed_cmd_t sed_cmd_head, *sed_cmd_tail;
++	sed_cmd_t *sed_cmd_head, **sed_cmd_tail;
+ 
+ 	/* Linked list of append lines */
+ 	llist_t *append_head;
+@@ -148,7 +156,7 @@ struct BUG_G_too_big {
+ #if ENABLE_FEATURE_CLEAN_UP
+ static void sed_free_and_close_stuff(void)
+ {
+-	sed_cmd_t *sed_cmd = G.sed_cmd_head.next;
++	sed_cmd_t *sed_cmd = G.sed_cmd_head;
+ 
+ 	llist_free(G.append_head, free);
+ 
+@@ -599,6 +607,7 @@ static void add_cmd(const char *cmdstr)
+ 
+ 		/* first part (if present) is an address: either a '$', a number or a /regex/ */
+ 		cmdstr += get_address(cmdstr, &sed_cmd->beg_line, &sed_cmd->beg_match);
++		sed_cmd->beg_line_orig = sed_cmd->beg_line;
+ 
+ 		/* second part (if present) will begin with a comma */
+ 		if (*cmdstr == ',') {
+@@ -630,8 +639,8 @@ static void add_cmd(const char *cmdstr)
+ 		cmdstr = parse_cmd_args(sed_cmd, cmdstr);
+ 
+ 		/* Add the command to the command array */
+-		G.sed_cmd_tail->next = sed_cmd;
+-		G.sed_cmd_tail = G.sed_cmd_tail->next;
++		*G.sed_cmd_tail = sed_cmd;
++		G.sed_cmd_tail = &sed_cmd->next;
+ 	}
+ 
+ 	/* If we glued multiple lines together, free the memory. */
+@@ -777,7 +786,7 @@ static sed_cmd_t *branch_to(char *label)
+ {
+ 	sed_cmd_t *sed_cmd;
+ 
+-	for (sed_cmd = G.sed_cmd_head.next; sed_cmd; sed_cmd = sed_cmd->next) {
++	for (sed_cmd = G.sed_cmd_head; sed_cmd; sed_cmd = sed_cmd->next) {
+ 		if (sed_cmd->cmd == ':' && sed_cmd->string && !strcmp(sed_cmd->string, label)) {
+ 			return sed_cmd;
+ 		}
+@@ -953,24 +962,24 @@ static void process_files(void)
+ 
+ 	/* For every line, go through all the commands */
+  restart:
+-	for (sed_cmd = G.sed_cmd_head.next; sed_cmd; sed_cmd = sed_cmd->next) {
++	for (sed_cmd = G.sed_cmd_head; sed_cmd; sed_cmd = sed_cmd->next) {
+ 		int old_matched, matched;
+ 
+ 		old_matched = sed_cmd->in_match;
+ 
+ 		/* Determine if this command matches this line: */
+ 
+-		//bb_error_msg("match1:%d", sed_cmd->in_match);
+-		//bb_error_msg("match2:%d", (!sed_cmd->beg_line && !sed_cmd->end_line
+-		//		&& !sed_cmd->beg_match && !sed_cmd->end_match));
+-		//bb_error_msg("match3:%d", (sed_cmd->beg_line > 0
+-		//	&& (sed_cmd->end_line || sed_cmd->end_match
+-		//	    ? (sed_cmd->beg_line <= linenum)
+-		//	    : (sed_cmd->beg_line == linenum)
+-		//	    )
+-		//	)
+-		//bb_error_msg("match4:%d", (beg_match(sed_cmd, pattern_space)));
+-		//bb_error_msg("match5:%d", (sed_cmd->beg_line == -1 && next_line == NULL));
++		dbg("match1:%d", sed_cmd->in_match);
++		dbg("match2:%d", (!sed_cmd->beg_line && !sed_cmd->end_line
++				&& !sed_cmd->beg_match && !sed_cmd->end_match));
++		dbg("match3:%d", (sed_cmd->beg_line > 0
++			&& (sed_cmd->end_line || sed_cmd->end_match
++			    ? (sed_cmd->beg_line <= linenum)
++			    : (sed_cmd->beg_line == linenum)
++			    )
++			));
++		dbg("match4:%d", (beg_match(sed_cmd, pattern_space)));
++		dbg("match5:%d", (sed_cmd->beg_line == -1 && next_line == NULL));
+ 
+ 		/* Are we continuing a previous multi-line match? */
+ 		sed_cmd->in_match = sed_cmd->in_match
+@@ -981,7 +990,14 @@ static void process_files(void)
+ 			|| (sed_cmd->beg_line > 0
+ 			    && (sed_cmd->end_line || sed_cmd->end_match
+ 				  /* note: even if end is numeric and is < linenum too,
+-				   * GNU sed matches! We match too */
++				   * GNU sed matches! We match too, therefore we don't
++				   * check here that linenum <= end.
++				   * Example:
++				   * printf '1\n2\n3\n4\n' | sed -n '1{N;N;d};1p;2,3p;3p;4p'
++				   * first three input lines are deleted;
++				   * 4th line is matched and printed
++				   * by "2,3" (!) and by "4" ranges
++				   */
+ 				? (sed_cmd->beg_line <= linenum)    /* N,end */
+ 				: (sed_cmd->beg_line == linenum)    /* N */
+ 				)
+@@ -994,16 +1010,14 @@ static void process_files(void)
+ 		/* Snapshot the value */
+ 		matched = sed_cmd->in_match;
+ 
+-		//bb_error_msg("cmd:'%c' matched:%d beg_line:%d end_line:%d linenum:%d",
+-		//sed_cmd->cmd, matched, sed_cmd->beg_line, sed_cmd->end_line, linenum);
++		dbg("cmd:'%c' matched:%d beg_line:%d end_line:%d linenum:%d",
++			sed_cmd->cmd, matched, sed_cmd->beg_line, sed_cmd->end_line, linenum);
+ 
+ 		/* Is this line the end of the current match? */
+ 
+ 		if (matched) {
+ 			/* once matched, "n,xxx" range is dead, disabling it */
+-			if (sed_cmd->beg_line > 0
+-			 && !(option_mask32 & OPT_in_place) /* but not for -i */
+-			) {
++			if (sed_cmd->beg_line > 0) {
+ 				sed_cmd->beg_line = -2;
+ 			}
+ 			sed_cmd->in_match = !(
+@@ -1017,7 +1031,8 @@ static void process_files(void)
+ 				/* or does this line matches our last address regex */
+ 				|| (sed_cmd->end_match && old_matched
+ 				     && (regexec(sed_cmd->end_match,
+-				                 pattern_space, 0, NULL, 0) == 0))
++				                 pattern_space, 0, NULL, 0) == 0)
++				)
+ 			);
+ 		}
+ 
+@@ -1407,11 +1422,12 @@ int sed_main(int argc UNUSED_PARAM, char
+ 		add_input_file(stdin);
+ 	} else {
+ 		int i;
+-		FILE *file;
+ 
+ 		for (i = 0; argv[i]; i++) {
+ 			struct stat statbuf;
+ 			int nonstdoutfd;
++			FILE *file;
++			sed_cmd_t *sed_cmd;
+ 
+ 			if (LONE_DASH(argv[i]) && !(opt & OPT_in_place)) {
+ 				add_input_file(stdin);
+@@ -1423,11 +1439,13 @@ int sed_main(int argc UNUSED_PARAM, char
+ 				status = EXIT_FAILURE;
+ 				continue;
+ 			}
++			add_input_file(file);
+ 			if (!(opt & OPT_in_place)) {
+-				add_input_file(file);
+ 				continue;
+ 			}
+ 
++			/* -i: process each FILE separately: */
++
+ 			G.outname = xasprintf("%sXXXXXX", argv[i]);
+ 			nonstdoutfd = xmkstemp(G.outname);
+ 			G.nonstdout = xfdopen_for_write(nonstdoutfd);
+@@ -1438,15 +1456,20 @@ int sed_main(int argc UNUSED_PARAM, char
+ 			 * but GNU sed 4.2.1 does not preserve them either */
+ 			fchmod(nonstdoutfd, statbuf.st_mode);
+ 			fchown(nonstdoutfd, statbuf.st_uid, statbuf.st_gid);
+-			add_input_file(file);
++
+ 			process_files();
+ 			fclose(G.nonstdout);
+-
+ 			G.nonstdout = stdout;
++
+ 			/* unlink(argv[i]); */
+ 			xrename(G.outname, argv[i]);
+ 			free(G.outname);
+ 			G.outname = NULL;
++
++			/* Re-enable disabled range matches */
++			for (sed_cmd = G.sed_cmd_head; sed_cmd; sed_cmd = sed_cmd->next) {
++				sed_cmd->beg_line = sed_cmd->beg_line_orig;
++			}
+ 		}
+ 		/* Here, to handle "sed 'cmds' nonexistent_file" case we did:
+ 		 * if (G.current_input_file >= G.input_file_count)
+--- busybox-1.19.0/testsuite/sed.tests
++++ busybox-1.19.0-sed/testsuite/sed.tests
+@@ -6,7 +6,7 @@
+ 
+ . ./testing.sh
+ 
+-# testing "description" "arguments" "result" "infile" "stdin"
++# testing "description" "commands" "result" "infile" "stdin"
+ 
+ # Corner cases
+ testing "sed no files (stdin)" 'sed ""' "hello\n" "" "hello\n"
+@@ -225,7 +225,7 @@ testing "sed s/xxx/[/" "sed -e 's/xxx/[/
+ #testing "sed -g (exhaustive)" "sed -e 's/[[:space:]]*/,/g'" ",1,2,3,4,5," \
+ #	"" "12345"
+ 
+-# testing "description" "arguments" "result" "infile" "stdin"
++# testing "description" "commands" "result" "infile" "stdin"
+ 
+ testing "sed n command must reset 'substituted' bit" \
+ 	"sed 's/1/x/;T;n;: next;s/3/y/;t quit;n;b next;: quit;q'" \
+@@ -291,6 +291,10 @@ testing "sed understands \r" \
+ 	"sed 's/r/\r/'" \
+ 	"\rrr\n" "" "rrr\n"
+ 
+-# testing "description" "arguments" "result" "infile" "stdin"
++testing "sed -i finishes ranges correctly" \
++	"sed '1,2d' -i input; echo \$?; cat input" \
++	"0\n3\n4\n" "1\n2\n3\n4\n" ""
++
++# testing "description" "commands" "result" "infile" "stdin"
+ 
+ exit $FAILCOUNT
diff --git a/sys-apps/busybox/files/busybox-1.19.0-swap.patch b/sys-apps/busybox/files/busybox-1.19.0-swap.patch
new file mode 100644
index 0000000..c783945
--- /dev/null
+++ b/sys-apps/busybox/files/busybox-1.19.0-swap.patch
@@ -0,0 +1,12 @@
+--- busybox-1.19.0/util-linux/swaponoff.c
++++ busybox-1.19.0-swap/util-linux/swaponoff.c
+@@ -114,7 +114,8 @@ int swap_on_off_main(int argc UNUSED_PAR
+ #if !ENABLE_FEATURE_SWAPON_PRI
+ 	ret = getopt32(argv, "a");
+ #else
+-	opt_complementary = "p+";
++	if (applet_name[5] == 'n')
++		opt_complementary = "p+";
+ 	ret = getopt32(argv, (applet_name[5] == 'n') ? "ap:" : "a", &g_flags);
+ 
+ 	if (ret & 2) { // -p
diff --git a/sys-apps/busybox/files/busybox-1.19.0-uncompress.patch b/sys-apps/busybox/files/busybox-1.19.0-uncompress.patch
new file mode 100644
index 0000000..3033739
--- /dev/null
+++ b/sys-apps/busybox/files/busybox-1.19.0-uncompress.patch
@@ -0,0 +1,50 @@
+--- busybox-1.19.0/archival/libarchive/decompress_uncompress.c
++++ busybox-1.19.0-uncompress/archival/libarchive/decompress_uncompress.c
+@@ -163,7 +163,8 @@ unpack_Z_stream(int fd_in, int fd_out)
+ 
+ 		if (insize < (int) (IBUFSIZ + 64) - IBUFSIZ) {
+ 			rsize = safe_read(fd_in, inbuf + insize, IBUFSIZ);
+-//error check??
++			if (rsize < 0)
++				bb_error_msg(bb_msg_read_error);
+ 			insize += rsize;
+ 		}
+ 
+@@ -195,6 +196,8 @@ unpack_Z_stream(int fd_in, int fd_out)
+ 
+ 
+ 			if (oldcode == -1) {
++				if (code >= 256)
++					bb_error_msg_and_die("corrupted data"); /* %ld", code); */
+ 				oldcode = code;
+ 				finchar = (int) oldcode;
+ 				outbuf[outpos++] = (unsigned char) finchar;
+@@ -239,6 +242,8 @@ unpack_Z_stream(int fd_in, int fd_out)
+ 
+ 			/* Generate output characters in reverse order */
+ 			while ((long) code >= (long) 256) {
++				if (stackp <= &htabof(0))
++					bb_error_msg_and_die("corrupted data");
+ 				*--stackp = tab_suffixof(code);
+ 				code = tab_prefixof(code);
+ 			}
+@@ -263,8 +268,7 @@ unpack_Z_stream(int fd_in, int fd_out)
+ 						}
+ 
+ 						if (outpos >= OBUFSIZ) {
+-							full_write(fd_out, outbuf, outpos);
+-//error check??
++							xwrite(fd_out, outbuf, outpos);
+ 							IF_DESKTOP(total_written += outpos;)
+ 							outpos = 0;
+ 						}
+@@ -292,8 +296,7 @@ unpack_Z_stream(int fd_in, int fd_out)
+ 	} while (rsize > 0);
+ 
+ 	if (outpos > 0) {
+-		full_write(fd_out, outbuf, outpos);
+-//error check??
++		xwrite(fd_out, outbuf, outpos);
+ 		IF_DESKTOP(total_written += outpos;)
+ 	}
+