From 9a60468f0f744c1ae4c6d473c12b71f81dd470cb Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Tue, 14 Jul 2020 20:53:02 -0600
Subject: [PATCH] Update bash patch

---
 recipes/bash/redox.patch | 1355 +-------------------------------------
 1 file changed, 19 insertions(+), 1336 deletions(-)

diff --git a/recipes/bash/redox.patch b/recipes/bash/redox.patch
index 7dba459f3..21631f5cd 100644
--- a/recipes/bash/redox.patch
+++ b/recipes/bash/redox.patch
@@ -1,6 +1,18 @@
+diff -ruwN source/builtins/ulimit.def source-new/builtins/ulimit.def
+--- source/builtins/ulimit.def	2016-03-11 07:18:54.000000000 -0700
++++ source-new/builtins/ulimit.def	2020-07-14 20:52:15.875646752 -0600
+@@ -598,7 +598,7 @@
+       }
+   else
+     {
+-#if defined (HAVE_RESOURCE)
++#if defined (HAVE_RESOURCE) && !defined(__redox__)
+       if (getrlimit (limits[ind].parameter, &limit) < 0)
+ 	return -1;
+ #  if defined (HPUX9)
 diff -ruwN source/config-top.h source-new/config-top.h
 --- source/config-top.h	2016-05-19 12:34:02.000000000 -0600
-+++ source-new/config-top.h	2019-01-28 12:42:45.660815213 -0700
++++ source-new/config-top.h	2020-07-14 20:50:54.546545430 -0600
 @@ -63,14 +63,14 @@
  /* The default value of the PATH variable. */
  #ifndef DEFAULT_PATH_VALUE
@@ -20,7 +32,7 @@ diff -ruwN source/config-top.h source-new/config-top.h
  /* Default primary and secondary prompt strings. */
 diff -ruwN source/configure.ac source-new/configure.ac
 --- source/configure.ac	2016-09-07 14:56:28.000000000 -0600
-+++ source-new/configure.ac	2019-01-28 13:53:45.000616985 -0700
++++ source-new/configure.ac	2020-07-14 20:50:54.550545485 -0600
 @@ -90,6 +90,7 @@
  *-opennt*|*-interix*)	opt_bash_malloc=no ;;	# Interix, now owned by Microsoft
  *-nsk*)		opt_bash_malloc=no ;;	# HP NonStop
@@ -31,7 +43,7 @@ diff -ruwN source/configure.ac source-new/configure.ac
  # memory scrambling on free()
 diff -ruwN source/execute_cmd.c source-new/execute_cmd.c
 --- source/execute_cmd.c	2016-08-26 05:10:08.000000000 -0600
-+++ source-new/execute_cmd.c	2019-01-28 12:42:52.680865726 -0700
++++ source-new/execute_cmd.c	2020-07-14 20:50:54.550545485 -0600
 @@ -1335,15 +1335,17 @@
    nullcmd = (command == 0) || (command->type == cm_simple && command->value.Simple->words == 0 && command->value.Simple->redirects == 0);
    if (posixly_correct && nullcmd)
@@ -53,7 +65,7 @@ diff -ruwN source/execute_cmd.c source-new/execute_cmd.c
    old_flags = command->flags;
 diff -ruwN source/general.c source-new/general.c
 --- source/general.c	2016-08-11 09:16:56.000000000 -0600
-+++ source-new/general.c	2019-01-28 12:45:41.801895779 -0700
++++ source-new/general.c	2020-07-14 20:50:54.550545485 -0600
 @@ -476,6 +476,7 @@
  void
  check_dev_tty ()
@@ -83,1338 +95,9 @@ diff -ruwN source/general.c source-new/general.c
      ;
  
    *p_index = i;
-diff -ruwN source/general.c.orig source-new/general.c.orig
---- source/general.c.orig	1969-12-31 17:00:00.000000000 -0700
-+++ source-new/general.c.orig	2019-01-28 12:42:40.972781097 -0700
-@@ -0,0 +1,1325 @@
-+/* general.c -- Stuff that is used by all files. */
-+
-+/* Copyright (C) 1987-2016 Free Software Foundation, Inc.
-+
-+   This file is part of GNU Bash, the Bourne Again SHell.
-+
-+   Bash is free software: you can redistribute it and/or modify
-+   it under the terms of the GNU General Public License as published by
-+   the Free Software Foundation, either version 3 of the License, or
-+   (at your option) any later version.
-+
-+   Bash is distributed in the hope that it will be useful,
-+   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+   GNU General Public License for more details.
-+
-+   You should have received a copy of the GNU General Public License
-+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
-+*/
-+
-+#include "config.h"
-+
-+#include "bashtypes.h"
-+#if defined (HAVE_SYS_PARAM_H)
-+#  include <sys/param.h>
-+#endif
-+#include "posixstat.h"
-+
-+#if defined (HAVE_UNISTD_H)
-+#  include <unistd.h>
-+#endif
-+
-+#include "filecntl.h"
-+#include "bashansi.h"
-+#include <stdio.h>
-+#include "chartypes.h"
-+#include <errno.h>
-+
-+#include "bashintl.h"
-+
-+#include "shell.h"
-+#include "test.h"
-+#include "trap.h"
-+
-+#if defined (HAVE_MBSTR_H) && defined (HAVE_MBSCHR)
-+#  include <mbstr.h>		/* mbschr */
-+#endif
-+
-+#include <tilde/tilde.h>
-+
-+#if !defined (errno)
-+extern int errno;
-+#endif /* !errno */
-+
-+extern int expand_aliases;
-+extern int interactive_comments;
-+extern int check_hashed_filenames;
-+extern int source_uses_path;
-+extern int source_searches_cwd;
-+extern int posixly_correct;
-+extern int inherit_errexit;
-+
-+static char *bash_special_tilde_expansions __P((char *));
-+static int unquoted_tilde_word __P((const char *));
-+static void initialize_group_array __P((void));
-+
-+/* A standard error message to use when getcwd() returns NULL. */
-+const char * const bash_getcwd_errstr = N_("getcwd: cannot access parent directories");
-+
-+/* Do whatever is necessary to initialize `Posix mode'. */
-+void
-+posix_initialize (on)
-+     int on;
-+{
-+  /* Things that should be turned on when posix mode is enabled. */
-+  if (on != 0)
-+    {
-+      interactive_comments = source_uses_path = expand_aliases = 1;
-+      inherit_errexit = 1;
-+      source_searches_cwd = 0;
-+    }
-+
-+  /* Things that should be turned on when posix mode is disabled. */
-+  if (on == 0)
-+    {
-+      source_searches_cwd = 1;
-+      expand_aliases = interactive_shell;
-+    }
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*  Functions to convert to and from and display non-standard types */
-+/*								    */
-+/* **************************************************************** */
-+
-+#if defined (RLIMTYPE)
-+RLIMTYPE
-+string_to_rlimtype (s)
-+     char *s;
-+{
-+  RLIMTYPE ret;
-+  int neg;
-+
-+  ret = 0;
-+  neg = 0;
-+  while (s && *s && whitespace (*s))
-+    s++;
-+  if (s && (*s == '-' || *s == '+'))
-+    {
-+      neg = *s == '-';
-+      s++;
-+    }
-+  for ( ; s && *s && DIGIT (*s); s++)
-+    ret = (ret * 10) + TODIGIT (*s);
-+  return (neg ? -ret : ret);
-+}
-+
-+void
-+print_rlimtype (n, addnl)
-+     RLIMTYPE n;
-+     int addnl;
-+{
-+  char s[INT_STRLEN_BOUND (RLIMTYPE) + 1], *p;
-+
-+  p = s + sizeof(s);
-+  *--p = '\0';
-+
-+  if (n < 0)
-+    {
-+      do
-+	*--p = '0' - n % 10;
-+      while ((n /= 10) != 0);
-+
-+      *--p = '-';
-+    }
-+  else
-+    {
-+      do
-+	*--p = '0' + n % 10;
-+      while ((n /= 10) != 0);
-+    }
-+
-+  printf ("%s%s", p, addnl ? "\n" : "");
-+}
-+#endif /* RLIMTYPE */
-+
-+/* **************************************************************** */
-+/*								    */
-+/*		       Input Validation Functions		    */
-+/*								    */
-+/* **************************************************************** */
-+
-+/* Return non-zero if all of the characters in STRING are digits. */
-+int
-+all_digits (string)
-+     const char *string;
-+{
-+  register const char *s;
-+
-+  for (s = string; *s; s++)
-+    if (DIGIT (*s) == 0)
-+      return (0);
-+
-+  return (1);
-+}
-+
-+/* Return non-zero if the characters pointed to by STRING constitute a
-+   valid number.  Stuff the converted number into RESULT if RESULT is
-+   not null. */
-+int
-+legal_number (string, result)
-+     const char *string;
-+     intmax_t *result;
-+{
-+  intmax_t value;
-+  char *ep;
-+
-+  if (result)
-+    *result = 0;
-+
-+  if (string == 0)
-+    return 0;
-+
-+  errno = 0;
-+  value = strtoimax (string, &ep, 10);
-+  if (errno || ep == string)
-+    return 0;	/* errno is set on overflow or underflow */
-+
-+  /* Skip any trailing whitespace, since strtoimax does not. */
-+  while (whitespace (*ep))
-+    ep++;
-+
-+  /* If *string is not '\0' but *ep is '\0' on return, the entire string
-+     is valid. */
-+  if (*string && *ep == '\0')
-+    {
-+      if (result)
-+	*result = value;
-+      /* The SunOS4 implementation of strtol() will happily ignore
-+	 overflow conditions, so this cannot do overflow correctly
-+	 on those systems. */
-+      return 1;
-+    }
-+    
-+  return (0);
-+}
-+
-+/* Return 1 if this token is a legal shell `identifier'; that is, it consists
-+   solely of letters, digits, and underscores, and does not begin with a
-+   digit. */
-+int
-+legal_identifier (name)
-+     const char *name;
-+{
-+  register const char *s;
-+  unsigned char c;
-+
-+  if (!name || !(c = *name) || (legal_variable_starter (c) == 0))
-+    return (0);
-+
-+  for (s = name + 1; (c = *s) != 0; s++)
-+    {
-+      if (legal_variable_char (c) == 0)
-+	return (0);
-+    }
-+  return (1);
-+}
-+
-+/* Return 1 if NAME is a valid value that can be assigned to a nameref
-+   variable.  FLAGS can be 2, in which case the name is going to be used
-+   to create a variable.  Other values are currently unused, but could
-+   be used to allow values to be stored and indirectly referenced, but
-+   not used in assignments. */
-+int
-+valid_nameref_value (name, flags)
-+     const char *name;
-+     int flags;
-+{
-+  if (name == 0 || *name == 0)
-+    return 0;
-+
-+  /* valid identifier */
-+#if defined (ARRAY_VARS)  
-+  if (legal_identifier (name) || (flags != 2 && valid_array_reference (name, 0)))
-+#else
-+  if (legal_identifier (name))
-+#endif
-+    return 1;
-+
-+  return 0;
-+}
-+
-+int
-+check_selfref (name, value, flags)
-+     const char *name;
-+     char *value;
-+     int flags;
-+{
-+  char *t;
-+
-+  if (STREQ (name, value))
-+    return 1;
-+
-+#if defined (ARRAY_VARS)
-+  if (valid_array_reference (value, 0))
-+    {
-+      t = array_variable_name (value, (char **)NULL, (int *)NULL);
-+      if (t && STREQ (name, t))
-+	{
-+	  free (t);
-+	  return 1;
-+	}
-+      free (t);
-+    }
-+#endif
-+
-+  return 0;	/* not a self reference */
-+}
-+
-+/* Make sure that WORD is a valid shell identifier, i.e.
-+   does not contain a dollar sign, nor is quoted in any way.  Nor
-+   does it consist of all digits.  If CHECK_WORD is non-zero,
-+   the word is checked to ensure that it consists of only letters,
-+   digits, and underscores. */
-+int
-+check_identifier (word, check_word)
-+     WORD_DESC *word;
-+     int check_word;
-+{
-+  if ((word->flags & (W_HASDOLLAR|W_QUOTED)) || all_digits (word->word))
-+    {
-+      internal_error (_("`%s': not a valid identifier"), word->word);
-+      return (0);
-+    }
-+  else if (check_word && legal_identifier (word->word) == 0)
-+    {
-+      internal_error (_("`%s': not a valid identifier"), word->word);
-+      return (0);
-+    }
-+  else
-+    return (1);
-+}
-+
-+/* Return 1 if STRING is a function name that the shell will import from
-+   the environment.  Currently we reject attempts to import shell functions
-+   containing slashes, beginning with newlines or containing blanks.  In
-+   Posix mode, we require that STRING be a valid shell identifier.  Not
-+   used yet. */
-+int
-+importable_function_name (string, len)
-+     const char *string;
-+     size_t len;
-+{
-+  if (absolute_program (string))	/* don't allow slash */
-+    return 0;
-+  if (*string == '\n')			/* can't start with a newline */
-+    return 0;
-+  if (shellblank (*string) || shellblank(string[len-1]))
-+    return 0;
-+  return (posixly_correct ? legal_identifier (string) : 1);
-+}
-+
-+int
-+exportable_function_name (string)
-+     const char *string;
-+{
-+  if (absolute_program (string))
-+    return 0;
-+  if (mbschr (string, '=') != 0)
-+    return 0;
-+  return 1;
-+}
-+
-+/* Return 1 if STRING comprises a valid alias name.  The shell accepts
-+   essentially all characters except those which must be quoted to the
-+   parser (which disqualifies them from alias expansion anyway) and `/'. */
-+int
-+legal_alias_name (string, flags)
-+     const char *string;
-+     int flags;
-+{
-+  register const char *s;
-+
-+  for (s = string; *s; s++)
-+    if (shellbreak (*s) || shellxquote (*s) || shellexp (*s) || (*s == '/'))
-+      return 0;
-+  return 1;
-+}
-+
-+/* Returns non-zero if STRING is an assignment statement.  The returned value
-+   is the index of the `=' sign. */
-+int
-+assignment (string, flags)
-+     const char *string;
-+     int flags;
-+{
-+  register unsigned char c;
-+  register int newi, indx;
-+
-+  c = string[indx = 0];
-+
-+#if defined (ARRAY_VARS)
-+  if ((legal_variable_starter (c) == 0) && (flags == 0 || c != '[')) /* ] */
-+#else
-+  if (legal_variable_starter (c) == 0)
-+#endif
-+    return (0);
-+
-+  while (c = string[indx])
-+    {
-+      /* The following is safe.  Note that '=' at the start of a word
-+	 is not an assignment statement. */
-+      if (c == '=')
-+	return (indx);
-+
-+#if defined (ARRAY_VARS)
-+      if (c == '[')
-+	{
-+	  newi = skipsubscript (string, indx, 0);
-+	  if (string[newi++] != ']')
-+	    return (0);
-+	  if (string[newi] == '+' && string[newi+1] == '=')
-+	    return (newi + 1);
-+	  return ((string[newi] == '=') ? newi : 0);
-+	}
-+#endif /* ARRAY_VARS */
-+
-+      /* Check for `+=' */
-+      if (c == '+' && string[indx+1] == '=')
-+	return (indx + 1);
-+
-+      /* Variable names in assignment statements may contain only letters,
-+	 digits, and `_'. */
-+      if (legal_variable_char (c) == 0)
-+	return (0);
-+
-+      indx++;
-+    }
-+  return (0);
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*	     Functions to manage files and file descriptors	    */
-+/*								    */
-+/* **************************************************************** */
-+
-+/* A function to unset no-delay mode on a file descriptor.  Used in shell.c
-+   to unset it on the fd passed as stdin.  Should be called on stdin if
-+   readline gets an EAGAIN or EWOULDBLOCK when trying to read input. */
-+
-+#if !defined (O_NDELAY)
-+#  if defined (FNDELAY)
-+#    define O_NDELAY FNDELAY
-+#  endif
-+#endif /* O_NDELAY */
-+
-+/* Make sure no-delay mode is not set on file descriptor FD. */
-+int
-+sh_unset_nodelay_mode (fd)
-+     int fd;
-+{
-+  int flags, bflags;
-+
-+  if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
-+    return -1;
-+
-+  bflags = 0;
-+
-+  /* This is defined to O_NDELAY in filecntl.h if O_NONBLOCK is not present
-+     and O_NDELAY is defined. */
-+#ifdef O_NONBLOCK
-+  bflags |= O_NONBLOCK;
-+#endif
-+
-+#ifdef O_NDELAY
-+  bflags |= O_NDELAY;
-+#endif
-+
-+  if (flags & bflags)
-+    {
-+      flags &= ~bflags;
-+      return (fcntl (fd, F_SETFL, flags));
-+    }
-+
-+  return 0;
-+}
-+
-+/* Return 1 if file descriptor FD is valid; 0 otherwise. */
-+int
-+sh_validfd (fd)
-+     int fd;
-+{
-+  return (fcntl (fd, F_GETFD, 0) >= 0);
-+}
-+
-+int
-+fd_ispipe (fd)
-+     int fd;
-+{
-+  errno = 0;
-+  return ((lseek (fd, 0L, SEEK_CUR) < 0) && (errno == ESPIPE));
-+}
-+
-+/* There is a bug in the NeXT 2.1 rlogind that causes opens
-+   of /dev/tty to fail. */
-+
-+#if defined (__BEOS__)
-+/* On BeOS, opening in non-blocking mode exposes a bug in BeOS, so turn it
-+   into a no-op.  This should probably go away in the future. */
-+#  undef O_NONBLOCK
-+#  define O_NONBLOCK 0
-+#endif /* __BEOS__ */
-+
-+void
-+check_dev_tty ()
-+{
-+#if 0
-+  int tty_fd;
-+  char *tty;
-+
-+  tty_fd = open ("/dev/tty", O_RDWR|O_NONBLOCK);
-+
-+  if (tty_fd < 0)
-+    {
-+      tty = (char *)ttyname (fileno (stdin));
-+      if (tty == 0)
-+	return;
-+      tty_fd = open (tty, O_RDWR|O_NONBLOCK);
-+    }
-+  if (tty_fd >= 0)
-+    close (tty_fd);
-+#endif
-+}
-+
-+/* Return 1 if PATH1 and PATH2 are the same file.  This is kind of
-+   expensive.  If non-NULL STP1 and STP2 point to stat structures
-+   corresponding to PATH1 and PATH2, respectively. */
-+int
-+same_file (path1, path2, stp1, stp2)
-+     const char *path1, *path2;
-+     struct stat *stp1, *stp2;
-+{
-+  struct stat st1, st2;
-+
-+  if (stp1 == NULL)
-+    {
-+      if (stat (path1, &st1) != 0)
-+	return (0);
-+      stp1 = &st1;
-+    }
-+
-+  if (stp2 == NULL)
-+    {
-+      if (stat (path2, &st2) != 0)
-+	return (0);
-+      stp2 = &st2;
-+    }
-+
-+  return ((stp1->st_dev == stp2->st_dev) && (stp1->st_ino == stp2->st_ino));
-+}
-+
-+/* Move FD to a number close to the maximum number of file descriptors
-+   allowed in the shell process, to avoid the user stepping on it with
-+   redirection and causing us extra work.  If CHECK_NEW is non-zero,
-+   we check whether or not the file descriptors are in use before
-+   duplicating FD onto them.  MAXFD says where to start checking the
-+   file descriptors.  If it's less than 20, we get the maximum value
-+   available from getdtablesize(2). */
-+int
-+move_to_high_fd (fd, check_new, maxfd)
-+     int fd, check_new, maxfd;
-+{
-+  int script_fd, nfds, ignore;
-+
-+  if (maxfd < 20)
-+    {
-+      nfds = getdtablesize ();
-+      if (nfds <= 0)
-+	nfds = 20;
-+      if (nfds > HIGH_FD_MAX)
-+	nfds = HIGH_FD_MAX;		/* reasonable maximum */
-+    }
-+  else
-+    nfds = maxfd;
-+
-+  for (nfds--; check_new && nfds > 3; nfds--)
-+    if (fcntl (nfds, F_GETFD, &ignore) == -1)
-+      break;
-+
-+  if (nfds > 3 && fd != nfds && (script_fd = dup2 (fd, nfds)) != -1)
-+    {
-+      if (check_new == 0 || fd != fileno (stderr))	/* don't close stderr */
-+	close (fd);
-+      return (script_fd);
-+    }
-+
-+  /* OK, we didn't find one less than our artificial maximum; return the
-+     original file descriptor. */
-+  return (fd);
-+}
-+ 
-+/* Return non-zero if the characters from SAMPLE are not all valid
-+   characters to be found in the first line of a shell script.  We
-+   check up to the first newline, or SAMPLE_LEN, whichever comes first.
-+   All of the characters must be printable or whitespace. */
-+
-+int
-+check_binary_file (sample, sample_len)
-+     const char *sample;
-+     int sample_len;
-+{
-+  register int i;
-+  unsigned char c;
-+
-+  for (i = 0; i < sample_len; i++)
-+    {
-+      c = sample[i];
-+      if (c == '\n')
-+	return (0);
-+      if (c == '\0')
-+	return (1);
-+    }
-+
-+  return (0);
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*		    Functions to manipulate pipes		    */
-+/*								    */
-+/* **************************************************************** */
-+
-+int
-+sh_openpipe (pv)
-+     int *pv;
-+{
-+  int r;
-+
-+  if ((r = pipe (pv)) < 0)
-+    return r;
-+
-+  pv[0] = move_to_high_fd (pv[0], 1, 64);
-+  pv[1] = move_to_high_fd (pv[1], 1, 64);
-+
-+  return 0;  
-+}
-+
-+int
-+sh_closepipe (pv)
-+     int *pv;
-+{
-+  if (pv[0] >= 0)
-+    close (pv[0]);
-+
-+  if (pv[1] >= 0)
-+    close (pv[1]);
-+
-+  pv[0] = pv[1] = -1;
-+  return 0;
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*		    Functions to inspect pathnames		    */
-+/*								    */
-+/* **************************************************************** */
-+
-+int
-+file_exists (fn)
-+     const char *fn;
-+{
-+  struct stat sb;
-+
-+  return (stat (fn, &sb) == 0);
-+}
-+
-+int
-+file_isdir (fn)
-+     const char *fn;
-+{
-+  struct stat sb;
-+
-+  return ((stat (fn, &sb) == 0) && S_ISDIR (sb.st_mode));
-+}
-+
-+int
-+file_iswdir (fn)
-+     const char *fn;
-+{
-+  return (file_isdir (fn) && sh_eaccess (fn, W_OK) == 0);
-+}
-+
-+/* Return 1 if STRING is "." or "..", optionally followed by a directory
-+   separator */
-+int
-+path_dot_or_dotdot (string)
-+     const char *string;
-+{
-+  if (string == 0 || *string == '\0' || *string != '.')
-+    return (0);
-+
-+  /* string[0] == '.' */
-+  if (PATHSEP(string[1]) || (string[1] == '.' && PATHSEP(string[2])))
-+    return (1);
-+
-+  return (0);
-+}
-+
-+/* Return 1 if STRING contains an absolute pathname, else 0.  Used by `cd'
-+   to decide whether or not to look up a directory name in $CDPATH. */
-+int
-+absolute_pathname (string)
-+     const char *string;
-+{
-+  if (string == 0 || *string == '\0')
-+    return (0);
-+
-+  if (ABSPATH(string))
-+    return (1);
-+
-+  if (string[0] == '.' && PATHSEP(string[1]))	/* . and ./ */
-+    return (1);
-+
-+  if (string[0] == '.' && string[1] == '.' && PATHSEP(string[2]))	/* .. and ../ */
-+    return (1);
-+
-+  return (0);
-+}
-+
-+/* Return 1 if STRING is an absolute program name; it is absolute if it
-+   contains any slashes.  This is used to decide whether or not to look
-+   up through $PATH. */
-+int
-+absolute_program (string)
-+     const char *string;
-+{
-+  return ((char *)mbschr (string, '/') != (char *)NULL);
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*		    Functions to manipulate pathnames		    */
-+/*								    */
-+/* **************************************************************** */
-+
-+/* Turn STRING (a pathname) into an absolute pathname, assuming that
-+   DOT_PATH contains the symbolic location of `.'.  This always
-+   returns a new string, even if STRING was an absolute pathname to
-+   begin with. */
-+char *
-+make_absolute (string, dot_path)
-+     const char *string, *dot_path;
-+{
-+  char *result;
-+
-+  if (dot_path == 0 || ABSPATH(string))
-+#ifdef __CYGWIN__
-+    {
-+      char pathbuf[PATH_MAX + 1];
-+
-+      cygwin_conv_to_full_posix_path (string, pathbuf);
-+      result = savestring (pathbuf);
-+    }
-+#else
-+    result = savestring (string);
-+#endif
-+  else
-+    result = sh_makepath (dot_path, string, 0);
-+
-+  return (result);
-+}
-+
-+/* Return the `basename' of the pathname in STRING (the stuff after the
-+   last '/').  If STRING is `/', just return it. */
-+char *
-+base_pathname (string)
-+     char *string;
-+{
-+  char *p;
-+
-+#if 0
-+  if (absolute_pathname (string) == 0)
-+    return (string);
-+#endif
-+
-+  if (string[0] == '/' && string[1] == 0)
-+    return (string);
-+
-+  p = (char *)strrchr (string, '/');
-+  return (p ? ++p : string);
-+}
-+
-+/* Return the full pathname of FILE.  Easy.  Filenames that begin
-+   with a '/' are returned as themselves.  Other filenames have
-+   the current working directory prepended.  A new string is
-+   returned in either case. */
-+char *
-+full_pathname (file)
-+     char *file;
-+{
-+  char *ret;
-+
-+  file = (*file == '~') ? bash_tilde_expand (file, 0) : savestring (file);
-+
-+  if (ABSPATH(file))
-+    return (file);
-+
-+  ret = sh_makepath ((char *)NULL, file, (MP_DOCWD|MP_RMDOT));
-+  free (file);
-+
-+  return (ret);
-+}
-+
-+/* A slightly related function.  Get the prettiest name of this
-+   directory possible. */
-+static char tdir[PATH_MAX];
-+
-+/* Return a pretty pathname.  If the first part of the pathname is
-+   the same as $HOME, then replace that with `~'.  */
-+char *
-+polite_directory_format (name)
-+     char *name;
-+{
-+  char *home;
-+  int l;
-+
-+  home = get_string_value ("HOME");
-+  l = home ? strlen (home) : 0;
-+  if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/'))
-+    {
-+      strncpy (tdir + 1, name + l, sizeof(tdir) - 2);
-+      tdir[0] = '~';
-+      tdir[sizeof(tdir) - 1] = '\0';
-+      return (tdir);
-+    }
-+  else
-+    return (name);
-+}
-+
-+/* Trim NAME.  If NAME begins with `~/', skip over tilde prefix.  Trim to
-+   keep any tilde prefix and PROMPT_DIRTRIM trailing directory components
-+   and replace the intervening characters with `...' */
-+char *
-+trim_pathname (name, maxlen)
-+     char *name;
-+     int maxlen;
-+{
-+  int nlen, ndirs;
-+  intmax_t nskip;
-+  char *nbeg, *nend, *ntail, *v;
-+
-+  if (name == 0 || (nlen = strlen (name)) == 0)
-+    return name;
-+  nend = name + nlen;
-+
-+  v = get_string_value ("PROMPT_DIRTRIM");
-+  if (v == 0 || *v == 0)
-+    return name;
-+  if (legal_number (v, &nskip) == 0 || nskip <= 0)
-+    return name;
-+
-+  /* Skip over tilde prefix */
-+  nbeg = name;
-+  if (name[0] == '~')
-+    for (nbeg = name; *nbeg; nbeg++)
-+      if (*nbeg == '/')
-+	{
-+	  nbeg++;
-+	  break;
-+	}
-+  if (*nbeg == 0)
-+    return name;
-+
-+  for (ndirs = 0, ntail = nbeg; *ntail; ntail++)
-+    if (*ntail == '/')
-+      ndirs++;
-+  if (ndirs < nskip)
-+    return name;
-+
-+  for (ntail = (*nend == '/') ? nend : nend - 1; ntail > nbeg; ntail--)
-+    {
-+      if (*ntail == '/')
-+	nskip--;
-+      if (nskip == 0)
-+	break;
-+    }
-+  if (ntail == nbeg)
-+    return name;
-+
-+  /* Now we want to return name[0..nbeg]+"..."+ntail, modifying name in place */
-+  nlen = ntail - nbeg;
-+  if (nlen <= 3)
-+    return name;
-+
-+  *nbeg++ = '.';
-+  *nbeg++ = '.';
-+  *nbeg++ = '.';
-+
-+  nlen = nend - ntail;
-+  memmove (nbeg, ntail, nlen);
-+  nbeg[nlen] = '\0';
-+
-+  return name;
-+}
-+
-+/* Return a printable representation of FN without special characters.  The
-+   caller is responsible for freeing memory if this returns something other
-+   than its argument.  If FLAGS is non-zero, we are printing for portable
-+   re-input and should single-quote filenames appropriately. */
-+char *
-+printable_filename (fn, flags)
-+     char *fn;
-+     int flags;
-+{
-+  char *newf;
-+
-+  if (ansic_shouldquote (fn))
-+    newf = ansic_quote (fn, 0, NULL);
-+  else if (flags && sh_contains_shell_metas (fn))
-+    newf = sh_single_quote (fn);
-+  else
-+    newf = fn;
-+
-+  return newf;
-+}
-+
-+/* Given a string containing units of information separated by colons,
-+   return the next one pointed to by (P_INDEX), or NULL if there are no more.
-+   Advance (P_INDEX) to the character after the colon. */
-+char *
-+extract_colon_unit (string, p_index)
-+     char *string;
-+     int *p_index;
-+{
-+  int i, start, len;
-+  char *value;
-+
-+  if (string == 0)
-+    return (string);
-+
-+  len = strlen (string);
-+  if (*p_index >= len)
-+    return ((char *)NULL);
-+
-+  i = *p_index;
-+
-+  /* Each call to this routine leaves the index pointing at a colon if
-+     there is more to the path.  If I is > 0, then increment past the
-+     `:'.  If I is 0, then the path has a leading colon.  Trailing colons
-+     are handled OK by the `else' part of the if statement; an empty
-+     string is returned in that case. */
-+  if (i && string[i] == ':')
-+    i++;
-+
-+  for (start = i; string[i] && string[i] != ':'; i++)
-+    ;
-+
-+  *p_index = i;
-+
-+  if (i == start)
-+    {
-+      if (string[i])
-+	(*p_index)++;
-+      /* Return "" in the case of a trailing `:'. */
-+      value = (char *)xmalloc (1);
-+      value[0] = '\0';
-+    }
-+  else
-+    value = substring (string, start, i);
-+
-+  return (value);
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*		    Tilde Initialization and Expansion		    */
-+/*								    */
-+/* **************************************************************** */
-+
-+#if defined (PUSHD_AND_POPD)
-+extern char *get_dirstack_from_string __P((char *));
-+#endif
-+
-+static char **bash_tilde_prefixes;
-+static char **bash_tilde_prefixes2;
-+static char **bash_tilde_suffixes;
-+static char **bash_tilde_suffixes2;
-+
-+/* If tilde_expand hasn't been able to expand the text, perhaps it
-+   is a special shell expansion.  This function is installed as the
-+   tilde_expansion_preexpansion_hook.  It knows how to expand ~- and ~+.
-+   If PUSHD_AND_POPD is defined, ~[+-]N expands to directories from the
-+   directory stack. */
-+static char *
-+bash_special_tilde_expansions (text)
-+     char *text;
-+{
-+  char *result;
-+
-+  result = (char *)NULL;
-+
-+  if (text[0] == '+' && text[1] == '\0')
-+    result = get_string_value ("PWD");
-+  else if (text[0] == '-' && text[1] == '\0')
-+    result = get_string_value ("OLDPWD");
-+#if defined (PUSHD_AND_POPD)
-+  else if (DIGIT (*text) || ((*text == '+' || *text == '-') && DIGIT (text[1])))
-+    result = get_dirstack_from_string (text);
-+#endif
-+
-+  return (result ? savestring (result) : (char *)NULL);
-+}
-+
-+/* Initialize the tilde expander.  In Bash, we handle `~-' and `~+', as
-+   well as handling special tilde prefixes; `:~" and `=~' are indications
-+   that we should do tilde expansion. */
-+void
-+tilde_initialize ()
-+{
-+  static int times_called = 0;
-+
-+  /* Tell the tilde expander that we want a crack first. */
-+  tilde_expansion_preexpansion_hook = bash_special_tilde_expansions;
-+
-+  /* Tell the tilde expander about special strings which start a tilde
-+     expansion, and the special strings that end one.  Only do this once.
-+     tilde_initialize () is called from within bashline_reinitialize (). */
-+  if (times_called++ == 0)
-+    {
-+      bash_tilde_prefixes = strvec_create (3);
-+      bash_tilde_prefixes[0] = "=~";
-+      bash_tilde_prefixes[1] = ":~";
-+      bash_tilde_prefixes[2] = (char *)NULL;
-+
-+      bash_tilde_prefixes2 = strvec_create (2);
-+      bash_tilde_prefixes2[0] = ":~";
-+      bash_tilde_prefixes2[1] = (char *)NULL;
-+
-+      tilde_additional_prefixes = bash_tilde_prefixes;
-+
-+      bash_tilde_suffixes = strvec_create (3);
-+      bash_tilde_suffixes[0] = ":";
-+      bash_tilde_suffixes[1] = "=~";	/* XXX - ?? */
-+      bash_tilde_suffixes[2] = (char *)NULL;
-+
-+      tilde_additional_suffixes = bash_tilde_suffixes;
-+
-+      bash_tilde_suffixes2 = strvec_create (2);
-+      bash_tilde_suffixes2[0] = ":";
-+      bash_tilde_suffixes2[1] = (char *)NULL;
-+    }
-+}
-+
-+/* POSIX.2, 3.6.1:  A tilde-prefix consists of an unquoted tilde character
-+   at the beginning of the word, followed by all of the characters preceding
-+   the first unquoted slash in the word, or all the characters in the word
-+   if there is no slash...If none of the characters in the tilde-prefix are
-+   quoted, the characters in the tilde-prefix following the tilde shell be
-+   treated as a possible login name. */
-+
-+#define TILDE_END(c)	((c) == '\0' || (c) == '/' || (c) == ':')
-+
-+static int
-+unquoted_tilde_word (s)
-+     const char *s;
-+{
-+  const char *r;
-+
-+  for (r = s; TILDE_END(*r) == 0; r++)
-+    {
-+      switch (*r)
-+	{
-+	case '\\':
-+	case '\'':
-+	case '"':
-+	  return 0;
-+	}
-+    }
-+  return 1;
-+}
-+
-+/* Find the end of the tilde-prefix starting at S, and return the tilde
-+   prefix in newly-allocated memory.  Return the length of the string in
-+   *LENP.  FLAGS tells whether or not we're in an assignment context --
-+   if so, `:' delimits the end of the tilde prefix as well. */
-+char *
-+bash_tilde_find_word (s, flags, lenp)
-+     const char *s;
-+     int flags, *lenp;
-+{
-+  const char *r;
-+  char *ret;
-+  int l;
-+
-+  for (r = s; *r && *r != '/'; r++)
-+    {
-+      /* Short-circuit immediately if we see a quote character.  Even though
-+	 POSIX says that `the first unquoted slash' (or `:') terminates the
-+	 tilde-prefix, in practice, any quoted portion of the tilde prefix
-+	 will cause it to not be expanded. */
-+      if (*r == '\\' || *r == '\'' || *r == '"')  
-+	{
-+	  ret = savestring (s);
-+	  if (lenp)
-+	    *lenp = 0;
-+	  return ret;
-+	}
-+      else if (flags && *r == ':')
-+	break;
-+    }
-+  l = r - s;
-+  ret = xmalloc (l + 1);
-+  strncpy (ret, s, l);
-+  ret[l] = '\0';
-+  if (lenp)
-+    *lenp = l;
-+  return ret;
-+}
-+    
-+/* Tilde-expand S by running it through the tilde expansion library.
-+   ASSIGN_P is 1 if this is a variable assignment, so the alternate
-+   tilde prefixes should be enabled (`=~' and `:~', see above).  If
-+   ASSIGN_P is 2, we are expanding the rhs of an assignment statement,
-+   so `=~' is not valid. */
-+char *
-+bash_tilde_expand (s, assign_p)
-+     const char *s;
-+     int assign_p;
-+{
-+  int old_immed, old_term, r;
-+  char *ret;
-+
-+#if 0
-+  old_immed = interrupt_immediately;
-+  old_term = terminate_immediately;
-+  /* We want to be able to interrupt tilde expansion. Ordinarily, we can just
-+     jump to top_level, but we don't want to run any trap commands in a signal
-+     handler context.  We might be able to get away with just checking for
-+     things like SIGINT and SIGQUIT. */
-+  if (any_signals_trapped () < 0)
-+    interrupt_immediately = 1;
-+  terminate_immediately = 1;
-+#endif
-+
-+  tilde_additional_prefixes = assign_p == 0 ? (char **)0
-+  					    : (assign_p == 2 ? bash_tilde_prefixes2 : bash_tilde_prefixes);
-+  if (assign_p == 2)
-+    tilde_additional_suffixes = bash_tilde_suffixes2;
-+
-+  r = (*s == '~') ? unquoted_tilde_word (s) : 1;
-+  ret = r ? tilde_expand (s) : savestring (s);
-+
-+#if 0
-+  interrupt_immediately = old_immed;
-+  terminate_immediately = old_term;
-+#endif
-+
-+  QUIT;
-+
-+  return (ret);
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*	  Functions to manipulate and search the group list	    */
-+/*								    */
-+/* **************************************************************** */
-+
-+static int ngroups, maxgroups;
-+
-+/* The set of groups that this user is a member of. */
-+static GETGROUPS_T *group_array = (GETGROUPS_T *)NULL;
-+
-+#if !defined (NOGROUP)
-+#  define NOGROUP (gid_t) -1
-+#endif
-+
-+static void
-+initialize_group_array ()
-+{
-+  register int i;
-+
-+  if (maxgroups == 0)
-+    maxgroups = getmaxgroups ();
-+
-+  ngroups = 0;
-+  group_array = (GETGROUPS_T *)xrealloc (group_array, maxgroups * sizeof (GETGROUPS_T));
-+
-+#if defined (HAVE_GETGROUPS)
-+  ngroups = getgroups (maxgroups, group_array);
-+#endif
-+
-+  /* If getgroups returns nothing, or the OS does not support getgroups(),
-+     make sure the groups array includes at least the current gid. */
-+  if (ngroups == 0)
-+    {
-+      group_array[0] = current_user.gid;
-+      ngroups = 1;
-+    }
-+
-+  /* If the primary group is not in the groups array, add it as group_array[0]
-+     and shuffle everything else up 1, if there's room. */
-+  for (i = 0; i < ngroups; i++)
-+    if (current_user.gid == (gid_t)group_array[i])
-+      break;
-+  if (i == ngroups && ngroups < maxgroups)
-+    {
-+      for (i = ngroups; i > 0; i--)
-+	group_array[i] = group_array[i - 1];
-+      group_array[0] = current_user.gid;
-+      ngroups++;
-+    }
-+
-+  /* If the primary group is not group_array[0], swap group_array[0] and
-+     whatever the current group is.  The vast majority of systems should
-+     not need this; a notable exception is Linux. */
-+  if (group_array[0] != current_user.gid)
-+    {
-+      for (i = 0; i < ngroups; i++)
-+	if (group_array[i] == current_user.gid)
-+	  break;
-+      if (i < ngroups)
-+	{
-+	  group_array[i] = group_array[0];
-+	  group_array[0] = current_user.gid;
-+	}
-+    }
-+}
-+
-+/* Return non-zero if GID is one that we have in our groups list. */
-+int
-+#if defined (__STDC__) || defined ( _MINIX)
-+group_member (gid_t gid)
-+#else
-+group_member (gid)
-+     gid_t gid;
-+#endif /* !__STDC__ && !_MINIX */
-+{
-+#if defined (HAVE_GETGROUPS)
-+  register int i;
-+#endif
-+
-+  /* Short-circuit if possible, maybe saving a call to getgroups(). */
-+  if (gid == current_user.gid || gid == current_user.egid)
-+    return (1);
-+
-+#if defined (HAVE_GETGROUPS)
-+  if (ngroups == 0)
-+    initialize_group_array ();
-+
-+  /* In case of error, the user loses. */
-+  if (ngroups <= 0)
-+    return (0);
-+
-+  /* Search through the list looking for GID. */
-+  for (i = 0; i < ngroups; i++)
-+    if (gid == (gid_t)group_array[i])
-+      return (1);
-+#endif
-+
-+  return (0);
-+}
-+
-+char **
-+get_group_list (ngp)
-+     int *ngp;
-+{
-+  static char **group_vector = (char **)NULL;
-+  register int i;
-+
-+  if (group_vector)
-+    {
-+      if (ngp)
-+	*ngp = ngroups;
-+      return group_vector;
-+    }
-+
-+  if (ngroups == 0)
-+    initialize_group_array ();
-+
-+  if (ngroups <= 0)
-+    {
-+      if (ngp)
-+	*ngp = 0;
-+      return (char **)NULL;
-+    }
-+
-+  group_vector = strvec_create (ngroups);
-+  for (i = 0; i < ngroups; i++)
-+    group_vector[i] = itos (group_array[i]);
-+
-+  if (ngp)
-+    *ngp = ngroups;
-+  return group_vector;
-+}
-+
-+int *
-+get_group_array (ngp)
-+     int *ngp;
-+{
-+  int i;
-+  static int *group_iarray = (int *)NULL;
-+
-+  if (group_iarray)
-+    {
-+      if (ngp)
-+	*ngp = ngroups;
-+      return (group_iarray);
-+    }
-+
-+  if (ngroups == 0)
-+    initialize_group_array ();    
-+
-+  if (ngroups <= 0)
-+    {
-+      if (ngp)
-+	*ngp = 0;
-+      return (int *)NULL;
-+    }
-+
-+  group_iarray = (int *)xmalloc (ngroups * sizeof (int));
-+  for (i = 0; i < ngroups; i++)
-+    group_iarray[i] = (int)group_array[i];
-+
-+  if (ngp)
-+    *ngp = ngroups;
-+  return group_iarray;
-+}
-+
-+/* **************************************************************** */
-+/*								    */
-+/*	  Miscellaneous functions				    */
-+/*								    */
-+/* **************************************************************** */
-+
-+/* Return a value for PATH that is guaranteed to find all of the standard
-+   utilities.  This uses Posix.2 configuration variables, if present.  It
-+   uses a value defined in config.h as a last resort. */
-+char *
-+conf_standard_path ()
-+{
-+#if defined (_CS_PATH) && defined (HAVE_CONFSTR)
-+  char *p;
-+  size_t len;
-+
-+  len = (size_t)confstr (_CS_PATH, (char *)NULL, (size_t)0);
-+  if (len > 0)
-+    {
-+      p = (char *)xmalloc (len + 2);
-+      *p = '\0';
-+      confstr (_CS_PATH, p, len);
-+      return (p);
-+    }
-+  else
-+    return (savestring (STANDARD_UTILS_PATH));
-+#else /* !_CS_PATH || !HAVE_CONFSTR  */
-+#  if defined (CS_PATH)
-+  return (savestring (CS_PATH));
-+#  else
-+  return (savestring (STANDARD_UTILS_PATH));
-+#  endif /* !CS_PATH */
-+#endif /* !_CS_PATH || !HAVE_CONFSTR */
-+}
 diff -ruwN source/include/posixwait.h source-new/include/posixwait.h
 --- source/include/posixwait.h	2008-08-12 08:03:03.000000000 -0600
-+++ source-new/include/posixwait.h	2019-01-28 12:42:40.972781097 -0700
++++ source-new/include/posixwait.h	2020-07-14 20:50:54.554545541 -0600
 @@ -34,7 +34,7 @@
  
  /* How to get the status of a job.  For Posix, this is just an
@@ -1435,7 +118,7 @@ diff -ruwN source/include/posixwait.h source-new/include/posixwait.h
  #    define WSTOPSIG(s)       ((s) >> 8)
 diff -ruwN source/lib/sh/getcwd.c source-new/lib/sh/getcwd.c
 --- source/lib/sh/getcwd.c	2012-03-10 08:48:50.000000000 -0700
-+++ source-new/lib/sh/getcwd.c	2019-01-28 14:02:28.573259186 -0700
++++ source-new/lib/sh/getcwd.c	2020-07-14 20:50:54.554545541 -0600
 @@ -20,7 +20,7 @@
  
  #include <config.h>
@@ -1447,7 +130,7 @@ diff -ruwN source/lib/sh/getcwd.c source-new/lib/sh/getcwd.c
    #pragma alloca
 diff -ruwN source/sig.c source-new/sig.c
 --- source/sig.c	2016-02-11 13:02:45.000000000 -0700
-+++ source-new/sig.c	2019-01-28 13:48:08.303876705 -0700
++++ source-new/sig.c	2020-07-14 20:50:54.554545541 -0600
 @@ -680,7 +680,9 @@
  }
  
-- 
GitLab