BASH for Akaros.

This is a Makefile, a patch, and a line in the top-level
Makefile bringing in BASH for Akaros.  I've been using this
as my shell for a few months now.

Change-Id: I09032cf55dc596f04cdc4ed4f741c9bddd2d78a2
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/Makefile b/Makefile
index cf34227..5a95b57 100644
--- a/Makefile
+++ b/Makefile
@@ -687,6 +687,7 @@
 	@$(call make_as_parent, -C tools/apps/ipconfig install)
 	@$(call make_as_parent, -C tools/dev-libs/elfutils install)
 	@$(call make_as_parent, -C tools/dev-util/perf install)
+	@$(call make_as_parent, -C tools/sys-apps/bash install)
 
 PHONY += apps-clean
 apps-clean: $(app-dirs-clean)
diff --git a/tools/sys-apps/bash/Makefile b/tools/sys-apps/bash/Makefile
new file mode 100644
index 0000000..b0a181e
--- /dev/null
+++ b/tools/sys-apps/bash/Makefile
@@ -0,0 +1,57 @@
+include ../../Makefrag
+
+########## Package-specific variables
+version := 4.3.30
+src-dir = bash-$(version)
+build-dir = $(src-dir)/build
+tarball = bash-$(version).tar.gz
+fetch-url = http://ftp.gnu.org/gnu/bash/$(tarball)
+config-opts = --prefix=/usr \
+              --bindir=/bin \
+              --without-bash-malloc \
+              --disable-nls \
+              --host=x86_64-ucb-akaros \
+              --build=i686-pc-linux-gnu
+
+########## Generic Infrastructure
+
+PHONY := all
+all: make
+
+%.tar.gz:
+	$(Q)wget $(fetch-url)
+
+akaros-patches := $(sort $(wildcard akaros-patches/$(version)/*))
+
+$(build-dir): $(tarball) $(akaros-patches)
+	rm -fr $(src-dir)
+	tar -xf $<
+	$(Q)mkdir $(build-dir) &&                                                  \
+	for i in $(akaros-patches); do                                             \
+		(cd $(src-dir) && patch -p1 < ../$$i);                                 \
+	done
+
+PHONY += config
+$(build-dir)/Makefile config: $(build-dir)
+	cd $(build-dir) && env ../configure $(config-opts)
+
+PHONY += make
+make: config
+	$(Q)$(MAKE) -C $(build-dir)
+
+PHONY += install
+install: make
+	rm -f $(KFS_ROOT)/bin/bash
+	$(Q)$(MAKE) -C $(build-dir) install DESTDIR=$(KFS_ROOT)
+
+PHONY += clean
+clean:
+	$(Q)[ -d $(build-dir) ] &&                                                 \
+	    [ -f $(build-dir)/Makefile ] &&                                        \
+	    $(MAKE) -C $(build-dir) clean || true
+
+PHONY += mrproper
+mrproper:
+	$(Q)rm -rf $(src-dir)
+
+.PHONY: $(PHONY)
diff --git a/tools/sys-apps/bash/akaros-patches/4.3.30/bash-4.3.30.patch b/tools/sys-apps/bash/akaros-patches/4.3.30/bash-4.3.30.patch
new file mode 100644
index 0000000..c84c561
--- /dev/null
+++ b/tools/sys-apps/bash/akaros-patches/4.3.30/bash-4.3.30.patch
@@ -0,0 +1,179 @@
+Only in bash-4.3.30: build
+diff -ur bash-4.3.30.dist/builtins/echo.def bash-4.3.30/builtins/echo.def
+--- bash-4.3.30.dist/builtins/echo.def	2011-06-29 09:55:58.000000000 -0400
++++ bash-4.3.30/builtins/echo.def	2016-06-03 17:40:57.834915855 -0400
+@@ -108,8 +108,9 @@
+ echo_builtin (list)
+      WORD_LIST *list;
+ {
+-  int display_return, do_v9, i, len;
+-  char *temp, *s;
++  int display_return, do_v9, i, j, len, malloc_len;
++  char *temp, *s, *m;
++  WORD_LIST *save_list;
+ 
+   do_v9 = xpg_echo;
+   display_return = 1;
+@@ -162,6 +163,30 @@
+   clearerr (stdout);	/* clear error before writing and testing success */
+ 
+   terminate_immediately++;
++  malloc_len = 0;
++  m = NULL;
++  save_list = list;
++  while (list)
++    {
++      i = len = 0;
++      temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
++		   : list->word->word;
++      if (!temp)
++        continue;
++      malloc_len += do_v9 ? len : strlen(temp);
++      if (do_v9)
++	free (temp);
++      list = list->next;
++      if (list)
++        malloc_len++;
++    }
++  if (display_return)
++    malloc_len++;
++  m = malloc(malloc_len);
++  if (m == NULL)
++    fatal_error ("echo: could not allocate %lu bytes", (unsigned long)malloc_len);
++  list = save_list;
++  j = 0;
+   while (list)
+     {
+       i = len = 0;
+@@ -169,19 +194,13 @@
+ 		   : list->word->word;
+       if (temp)
+ 	{
+-	  if (do_v9)
+-	    {
+-	      for (s = temp; len > 0; len--)
+-		putchar (*s++);
+-	    }
+-	  else	    
+-	    printf ("%s", temp);
+-#if defined (SunOS5)
+-	  fflush (stdout);	/* Fix for bug in SunOS 5.5 printf(3) */
+-#endif
++	  if (!do_v9)
++              len = strlen(temp);
++          memmove(m + j, temp, len);
++          j += len;
++          if (do_v9)
++            free (temp);
+ 	}
+-      if (do_v9 && temp)
+-	free (temp);
+       list = list->next;
+       if (i)
+ 	{
+@@ -189,11 +208,15 @@
+ 	  break;
+ 	}
+       if (list)
+-	putchar(' ');
++	m[j++] = ' ';
+     }
+-
+   if (display_return)
+-    putchar ('\n');
++    m[j++] = '\n';
++  write(STDOUT_FILENO, m, j);
++  free(m);
++#if defined (SunOS5)
++  fflush (stdout);	/* Fix for bug in SunOS 5.5 printf(3) */
++#endif
+ 
+   terminate_immediately--;
+   return (sh_chkwrite (EXECUTION_SUCCESS));
+diff -ur bash-4.3.30.dist/configure bash-4.3.30/configure
+--- bash-4.3.30.dist/configure	2014-02-11 10:38:00.000000000 -0500
++++ bash-4.3.30/configure	2016-05-16 23:04:59.481616025 -0400
+@@ -2853,6 +2853,7 @@
+ sparc-linux*)	opt_bash_malloc=no ;;	# sparc running linux; requires ELF
+ #*-freebsd*-gnu)	opt_bash_malloc=no ;;	# there's some undetermined problem here
+ #*-freebsd*)	opt_bash_malloc=no ;;	# they claim it's better; I disagree
++*-akaros*)	opt_bash_malloc=no ;;	# they claim it needs eight-bit alignment
+ *-openbsd*)	opt_bash_malloc=no ;;	# they claim it needs eight-bit alignment
+ *-mirbsd*)	opt_bash_malloc=no ;;	# they claim it needs eight-bit alignment
+ *-aix*)		opt_bash_malloc=no ;;	# AIX machines
+diff -ur bash-4.3.30.dist/error.c bash-4.3.30/error.c
+--- bash-4.3.30.dist/error.c	2014-01-17 08:09:33.000000000 -0500
++++ bash-4.3.30/error.c	2016-05-25 13:40:26.978379551 -0400
+@@ -487,3 +487,32 @@
+ {
+   report_error (_("%s: readonly variable"), s);
+ }
++
++#if defined (USE_AKAROS_STRERROR)
++#ifndef MAX_ERRSTR_LEN
++#define MAX_ERRSTR_LEN 128
++#endif
++char *
++akaros_strerror(e)
++      int e;
++{
++  static char emsg[2*MAX_ERRSTR_LEN];
++  char ebuf[MAX_ERRSTR_LEN];
++  size_t len;
++  int serrno;
++  char *estr, *strerror_str;
++
++  serrno = errno;
++  estr = errstr ();
++  strerror_str = strerror_r (e, ebuf, sizeof (ebuf));
++  len = strlen (strerror_str);
++  if (len > (sizeof (emsg) - 1))
++    len = sizeof (emsg) - 1;
++  memmove (emsg, strerror_str, len);
++  if (e == serrno && estr && *estr)
++    snprintf (emsg + len, sizeof (emsg) - len, ", %s", estr);
++  ebuf[sizeof (ebuf) - 1] = '\0';
++
++  return emsg;
++}
++#endif
+diff -ur bash-4.3.30.dist/mksyntax.c bash-4.3.30/mksyntax.c
+--- bash-4.3.30.dist/mksyntax.c	2012-07-29 19:48:38.000000000 -0400
++++ bash-4.3.30/mksyntax.c	2016-05-25 11:59:57.560352289 -0400
+@@ -40,6 +40,10 @@
+ extern int errno;
+ #endif
+ 
++#ifdef strerror
++#undef strerror
++#endif
++
+ #ifndef HAVE_STRERROR
+ extern char *strerror();
+ #endif
+diff -ur bash-4.3.30.dist/support/config.guess bash-4.3.30/support/config.guess
+--- bash-4.3.30.dist/support/config.guess	2013-12-16 16:02:33.000000000 -0500
++++ bash-4.3.30/support/config.guess	2016-05-16 23:04:12.844336864 -0400
+@@ -219,6 +219,10 @@
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+ 	exit ;;
++    *:Akaros:*:*)
++	UNAME_MACHINE_ARCH=x86_64
++	echo x86_64-ucb-akaros1.0
++	exit ;;
+     *:OpenBSD:*:*)
+ 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+diff -ur bash-4.3.30.dist/support/config.sub bash-4.3.30/support/config.sub
+--- bash-4.3.30.dist/support/config.sub	2013-12-17 10:49:47.000000000 -0500
++++ bash-4.3.30/support/config.sub	2016-05-16 23:05:28.906423063 -0400
+@@ -1356,7 +1356,7 @@
+ 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ 	      | -sym* | -kopensolaris* | -plan9* \
+ 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+-	      | -aos* | -aros* \
++	      | -akaros* | -aos* | -aros* \
+ 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \