This patch documents two implemented and classical command
line options "-v" and "-x". It is derived from Debian GNU/Linux.

Index: doc/bash.1
--- doc/bash.1.orig	2004-07-12 17:27:08 +0200
+++ doc/bash.1	2004-07-27 19:47:10 +0200
@@ -113,6 +113,12 @@
 This option allows the positional parameters to be set
 when invoking an interactive shell.
 .TP
+.B \-v
+Print shell input lines as they are read.
+.TP
+.B \-x
+Print commands and their arguments as they are executed.
+.TP
 .B \-D
 A list of all double-quoted strings preceded by \fB$\fP
 is printed on the standard ouput.

-----------------------------------------------------------------------------

This patch adds an explicit recognition for terminal sequence "kD" to be
"Delete" key. This is derived from Debian GNU/Linux and SuSE Linux.

Index: lib/readline/terminal.c
--- lib/readline/terminal.c.orig	2003-09-18 17:03:42 +0200
+++ lib/readline/terminal.c	2004-07-27 20:03:17 +0200
@@ -145,6 +145,9 @@
 static char *_rl_term_kH;
 static char *_rl_term_at7;	/* @7 */
 
+/* The key sequence sent by the Delete key, if any. */
+static char *_rl_term_kD;
+
 /* Insert key */
 static char *_rl_term_kI;
 
@@ -313,6 +316,7 @@
   { "ei", &_rl_term_ei },
   { "ic", &_rl_term_ic },
   { "im", &_rl_term_im },
+  { "kD", &_rl_term_kD },	/* delete */
   { "kH", &_rl_term_kH },	/* home down ?? */
   { "kI", &_rl_term_kI },	/* insert */
   { "kd", &_rl_term_kd },
@@ -492,6 +496,7 @@
 
   rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line);	/* Home */
   rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line);	/* End */
+  rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete);		/* Delete */
 
   _rl_keymap = xkeymap;
 }

-----------------------------------------------------------------------------

This patch makes sure a signal state variable is declared "volatile" so
it is consistent throughout signal handling. This patch is derived from
SuSE Linux.

Index: quit.h
--- quit.h.orig	2001-09-10 16:08:33 +0200
+++ quit.h	2004-07-27 19:47:10 +0200
@@ -22,7 +22,7 @@
 #define _QUIT_H_
 
 /* Non-zero means SIGINT has already ocurred. */
-extern int interrupt_state;
+extern volatile int interrupt_state;
 
 /* Macro to call a great deal.  SIGINT just sets above variable.  When
    it is safe, put QUIT in the code, and the "interrupt" will take place. */
Index: sig.c
--- sig.c.orig	2003-12-19 22:11:35 +0100
+++ sig.c	2004-07-27 19:47:10 +0200
@@ -59,7 +59,7 @@
 extern int parse_and_execute_level, shell_initialized;
 
 /* Non-zero after SIGINT. */
-int interrupt_state;
+volatile int interrupt_state = 0;
 
 /* The environment at the top-level R-E loop.  We use this in
    the case of error return. */
@@ -71,7 +71,7 @@
 #endif /* JOB_CONTROL */
 
 /* When non-zero, we throw_to_top_level (). */
-int interrupt_immediately = 0;
+volatile int interrupt_immediately = 0;
 
 static void initialize_shell_signals __P((void));
 
-----------------------------------------------------------------------------

Port to HP-UX 11i and similar less smart platforms.

Index: configure
--- configure.orig	2004-07-21 22:18:56 +0200
+++ configure	2004-07-27 19:47:10 +0200
@@ -1479,6 +1479,7 @@
 *-beos*)	opt_bash_malloc=no ;;	# they say it's suitable
 *-cygwin*)	opt_bash_malloc=no ;;	# Cygnus's CYGWIN environment
 *-opennt*|*-interix*)	opt_bash_malloc=no ;;	# Interix, now owned by Microsoft
+*-hpux*)	opt_bash_malloc=no ;;	# HP HP-UX
 esac
 
 # memory scrambling on free()
@@ -1624,7 +1625,7 @@
 
 else
 	MALLOC_LIB=
-	MALLOC_LIBRARY=
+	MALLOC_LIBRARY=dummy
 	MALLOC_LDFLAGS=
 	MALLOC_DEP=
 fi
Index: syntax.h
--- syntax.h.orig	2004-04-15 05:19:36 +0200
+++ syntax.h	2004-07-27 19:47:10 +0200
@@ -21,6 +21,8 @@
 #ifndef _SYNTAX_H_
 #define _SYNTAX_H_
 
+#include "config.h"
+
 /* Defines for use by mksyntax.c */
 
 #define slashify_in_quotes "\\`$\"\n"

-----------------------------------------------------------------------------

This adds the OpenPKG packaging brand.

Index: version.c
--- version.c.orig	2003-12-19 22:34:02 +0100
+++ version.c	2004-07-27 19:47:10 +0200
@@ -77,7 +77,7 @@
 show_shell_version (extended)
      int extended;
 {
-  printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
+  printf ("GNU bash, version %s (%s) [@l_openpkg_release@]\n", shell_version_string (), MACHTYPE);
   if (extended)
     printf (_("Copyright (C) 2004 Free Software Foundation, Inc.\n"));
 }

-----------------------------------------------------------------------------

Fix timezone handling for HPUX

Index: lib/sh/strftime.c
--- lib/sh/strftime.c.orig	2004-03-04 04:13:23 +0100
+++ lib/sh/strftime.c	2004-08-06 12:40:06 +0200
@@ -97,6 +97,8 @@
 extern int daylight;
 #if defined(SOLARIS) || defined(mips) || defined (M_UNIX)
 extern long int timezone, altzone;
+#elif defined(HPUX)
+extern long int timezone;
 #else
 extern int timezone, altzone;
 #endif
@@ -480,7 +482,11 @@
 			 * Systems with tzname[] probably have timezone as
 			 * secs west of GMT.  Convert to mins east of GMT.
 			 */
+#if defined(HPUX)
+			off = -(timezone / 60);
+#else
 			off = -(daylight ? timezone : altzone) / 60;
+#endif /* HPUX */
 #else /* !HAVE_TZNAME */
 			off = -zone.tz_minuteswest;
 #endif /* !HAVE_TZNAME */

-----------------------------------------------------------------------------

On brain-dead Linux platforms somewhere between glibc 2.3.3 (20040405)
and glibc 2.3.3 (20040917) (e.g. between SuSE 9.1 and SuSE 9.2 or
between Gentoo 1.4.x and 1.5.x) the system headers provide the
waitpid(2) option WCONTINUED although the underlying Linux kernels 2.4
and 2.6 still do not support this option and return EINVAL on waitpid(2)
using WCONTINUED.

As a side-effect the GNU Bash goes into an endless loop with waitpid(3)
calls after the first executed command terminated. The following
patch is derived from Gentoo Portage and workarounds this problems by
gracefully and efficiently degrading the options on waitpid(2) calls.

Well, it's just another great example of how good Linux provides
standardized APIs -- actually they are nothing more than Potemkin
villages. Ggrrrrr!

Index: jobs.c
--- jobs.c.orig	2004-11-04 10:29:23 +0100
+++ jobs.c	2004-11-04 10:32:47 +0100
@@ -2476,6 +2476,9 @@
   PROCESS *child;
   pid_t pid;
   int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
+#ifdef __linux__
+  static int wcontinued_not_supported = 0;
+#endif
 
   call_set_current = children_exited = 0;
   last_stopped_job = NO_JOB;
@@ -2489,7 +2492,18 @@
 			: 0;
       if (sigchld || block == 0)
 	waitpid_flags |= WNOHANG;
+#ifdef __linux__
+      retry:
+      if (wcontinued_not_supported)
+          waitpid_flags &= ~WCONTINUED;
+#endif
       pid = WAITPID (-1, &status, waitpid_flags);
+#ifdef __linux__
+      if (pid == -1 && errno == EINVAL) {
+          wcontinued_not_supported = 1;
+          goto retry;
+      }
+#endif
 
       /* The check for WNOHANG is to make sure we decrement sigchld only
 	 if it was non-zero before we called waitpid. */
