]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20081002 snapshot
authorChet Ramey <chet.ramey@case.edu>
Wed, 7 Dec 2011 14:29:49 +0000 (09:29 -0500)
committerChet Ramey <chet.ramey@case.edu>
Wed, 7 Dec 2011 14:29:49 +0000 (09:29 -0500)
54 files changed:
CWRU/CWRU.chlog
CWRU/CWRU.chlog~
builtins/cd.def
builtins/cd.def~
builtins/read.def
builtins/read.def~
builtins/ulimit.def
builtins/ulimit.def~
command.h~
doc/bash.1
doc/bash.1~
doc/bashref.texi
doc/bashref.texi~
execute_cmd.c
execute_cmd.c~
lib/readline/doc/rltech.texi
lib/readline/doc/rltech.texi~
lib/readline/doc/rluser.texi
lib/readline/doc/version.texi
lib/readline/doc/version.texi~
lib/readline/history.c
lib/readline/history.c~
lib/readline/readline.h
lib/readline/readline.h~
lib/readline/rlprivate.h
lib/readline/rlprivate.h~
lib/readline/rltty.c
lib/readline/rltty.c~
lib/readline/signals.c
lib/readline/signals.c~
nojobs.c
nojobs.c~
redir.c
redir.c~
shell.c
shell.c~
subst.c
subst.c~
test.c
test.c~
tests/builtins1.sub
tests/builtins1.sub~ [new file with mode: 0644]
tests/dstack.tests
tests/dstack.tests~ [new file with mode: 0644]
tests/extglob.tests
tests/extglob.tests~ [new file with mode: 0644]
tests/extglob1.sub
tests/extglob1.sub~ [new file with mode: 0644]
tests/run-minimal
tests/run-minimal~ [new file with mode: 0644]
tests/run-nquote4
tests/run-nquote4~ [new file with mode: 0644]
variables.c
variables.c~

index 5d1095e5c8b59a2429e929adf9d84892c3d1101e..9a02993e7bf421a369b9c795e0fadd4febe08eca 100644 (file)
@@ -6953,3 +6953,76 @@ builtins/bind.def
        - experimental: print a warning, but go on, if line editing not active
          when bind is invoked.  Suggested by Rocky Bernstein
          <rocky.bernstein@gmail.com>
+
+                                  10/3
+                                  ----
+test.c
+       - use same_file instead of directly comparing st_dev and st_ino when
+         comparing files in filecomp().  From mingw32 patches submitted
+         by Hector Chu <hkcc2@cantab.net>
+
+                                  10/4
+                                  ----
+
+redir.c
+       - in redirection_error(), use `error' instead of errno when comparing
+         against EBADF.  From mingw32 patches submitted by Hector Chu
+         <hkcc2@cantab.net>
+
+shell.c
+       - in unset_bash_input(), reset bash_input.type to st_none after
+         closing the default buffered fd.  From mingw32 patches submitted
+         by Hector Chu <hkcc2@cantab.net>
+
+builtins/cd.def
+       - ignore CDPATH when in privileged mode.  Suggested by Paul Jarc
+         <prj@po.cwru.edu>
+
+variables.c
+       - change sv_globignore to only act if privileged mode is not enabled.
+         Suggested by Paul Jarc <prj@po.cwru.edu>
+
+doc/bash.1,bashref.texi
+       - document new treatment of CDPATH and GLOBIGNORE when privileged
+         mode is enabled
+
+builtins/read.def
+       - change prompt printing to occur after terminal is set to no-echo
+         mode.  Based on suggestion from Stephane Chazelas
+         <stephane_chazelas@yahoo.fr>
+
+lib/readline/signals.c
+       - new variables to keep track of special characters corresponding to
+         SIGINT, SIGQUIT, and SIGTSTP
+       - new variable to keep track of whether tty is echoing control
+         characters corresponding to SIGINT, SIGQUIT, and SIGTSTP
+       - new function, _rl_echo_signal_char(int sig) to display the tty
+         special char generating SIGINT, SIGQUIT, or SIGTSTP.  Based on
+         idea and code from Joe Peterson <joe@skyrush.com>
+       - call rl_echo_signal_char in rl_signal_handler: if the terminal
+         settings indicate it, readline will echo characters that generate
+         keyboard signals
+
+lib/readline/rltty.c
+       - set _rl_intr_char, _rl_quit_char, and _rl_susp_char to special
+         characters that generate signals from keyboard
+       - set _rl_echoctl if ECHOCTL tty flag is set
+
+lib/readline/rlprivate.h
+       - extern declarations for _rl_intr_char, _rl_quit_char, and
+         _rl_susp_char
+       - extern declaration for _rl_echoctl
+
+lib/readline/readline.h
+       - extern declaration for rl_echo_signal_char()
+
+lib/readline/doc/rltech.texi
+       - document rl_echo_signal_handler(): available for applications
+         that install their own signal handlers
+
+                                  10/5
+                                  ----
+execute_cmd.c
+       - fix errexit logic to not cause the shell to exit when a command in
+         a pipeline fails.  Fixes bug reported by Marcin Owsiany
+         <marcin@owsiany.pl>
index 170e30ce468c2d381db24ab54f11d5d7a55352b2..4b25664c133c1d25c2cf5d2e657703f0ff205aa2 100644 (file)
@@ -6928,9 +6928,100 @@ jobs.c
          interrupt occurred.  The behavior is dependent on the shell
          compatibility level being > 32 (bash-4.0 and above)
 
-                                  9/24
+                                  9/23
                                   ----
+redir.c
+       - don't bother reporting an error with a file descriptor, even if
+         the errno is EBADF, if the redirection error (e.g., NOCLOBBER)
+         can't have anything to do with the fd.  Fixes bug reported by
+         "David A. Harding" <dave@dtrt.org>, debian bug #499633.
+
+                                  9/24
+                                  ----
 builtins/declare.def
        - make `declare [option] var' (and the `typeset' equivalent) create
          invisible variables, instead of assigning the null string to a
-         visible variable
+         visible variable.  Fixes bug reported by Bernd Eggink <monoped@sudrala.de>
+
+                                  9/25
+                                  ----
+builtins/common.[ch]
+       - new function, builtin_warning(), like builtin_error but for warning
+         messages
+
+builtins/bind.def
+       - experimental: print a warning, but go on, if line editing not active
+         when bind is invoked.  Suggested by Rocky Bernstein
+         <rocky.bernstein@gmail.com>
+
+                                  10/3
+                                  ----
+test.c
+       - use same_file instead of directly comparing st_dev and st_ino when
+         comparing files in filecomp().  From mingw32 patches submitted
+         by Hector Chu <hkcc2@cantab.net>
+
+                                  10/4
+                                  ----
+
+redir.c
+       - in redirection_error(), use `error' instead of errno when comparing
+         against EBADF.  From mingw32 patches submitted by Hector Chu
+         <hkcc2@cantab.net>
+
+shell.c
+       - in unset_bash_input(), reset bash_input.type to st_none after
+         closing the default buffered fd.  From mingw32 patches submitted
+         by Hector Chu <hkcc2@cantab.net>
+
+builtins/cd.def
+       - ignore CDPATH when in privileged mode.  Suggested by Paul Jarc
+         <prj@po.cwru.edu>
+
+variables.c
+       - change sv_globignore to only act if privileged mode is not enabled.
+         Suggested by Paul Jarc <prj@po.cwru.edu>
+
+doc/bash.1,bashref.texi
+       - document new treatment of CDPATH and GLOBIGNORE when privileged
+         mode is enabled
+
+builtins/read.def
+       - change prompt printing to occur after terminal is set to no-echo
+         mode.  Based on suggestion from Stephane Chazelas
+         <stephane_chazelas@yahoo.fr>
+
+lib/readline/signals.c
+       - new variables to keep track of special characters corresponding to
+         SIGINT, SIGQUIT, and SIGTSTP
+       - new variable to keep track of whether tty is echoing control
+         characters corresponding to SIGINT, SIGQUIT, and SIGTSTP
+       - new function, _rl_echo_signal_char(int sig) to display the tty
+         special char generating SIGINT, SIGQUIT, or SIGTSTP.  Based on
+         idea and code from Joe Peterson <joe@skyrush.com>
+       - call rl_echo_signal_char in rl_signal_handler: if the terminal
+         settings indicate it, readline will echo characters that generate
+         keyboard signals
+
+lib/readline/rltty.c
+       - set _rl_intr_char, _rl_quit_char, and _rl_susp_char to special
+         characters that generate signals from keyboard
+       - set _rl_echoctl if ECHOCTL tty flag is set
+
+lib/readline/rlprivate.h
+       - extern declarations for _rl_intr_char, _rl_quit_char, and
+         _rl_susp_char
+       - extern declaration for _rl_echoctl
+
+lib/readline/readline.h
+       - extern declaration for rl_echo_signal_char()
+
+lib/readline/doc/rltech.texi
+       - document rl_echo_signal_handler(): available for applications
+         that install their own signal handlers
+
+                                  10/5
+                                  ----
+execute_cmd.c
+       - fix errexit logic to not cause the shell to exit when a command in
+         a pipeline fails
index 4a0508019fc0ed3b8668054379ff19cc4585a808..6f5a348fedbb6782a96826e8da9b6485162b1e5e 100644 (file)
@@ -235,7 +235,7 @@ cd_builtin (list)
     }
   else if (absolute_pathname (list->word->word))
     dirname = list->word->word;
-  else if (cdpath = get_string_value ("CDPATH"))
+  else if (privileged_mode == 0 && (cdpath = get_string_value ("CDPATH")))
     {
       dirname = list->word->word;
 
index 629bdc8a81f95472b935c23d35a5c0db07d71814..4a0508019fc0ed3b8668054379ff19cc4585a808 100644 (file)
@@ -5,19 +5,18 @@ Copyright (C) 1987-2008 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 2, or (at your option) any later
-version.
+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.
+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; see the file COPYING.  If not, write to the Free Software
-Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+You should have received a copy of the GNU General Public License
+along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 
 $PRODUCES cd.c
 #include <config.h>
@@ -91,6 +90,9 @@ Options:
        links
 
 The default is to follow symbolic links, as if `-L' were specified.
+
+Exit Status:
+Returns 0 if the directory is changed; non-zero otherwise.
 $END
 
 /* Just set $PWD, don't change OLDPWD.  Used by `pwd -P' in posix mode. */
@@ -334,6 +336,10 @@ Options:
   -P   print the physical directory, without any symbolic links
 
 By default, `pwd' behaves as if `-L' were specified.
+
+Exit Status:
+Returns 0 unless an invalid option is given or the current directory
+cannot be read.
 $END
 
 /* Non-zero means that pwd always prints the physical directory, without
index c377015c47e63ee1461ba63217baa9d0ac710faf..7b461c2cd65d55ae0ac02cb59017b3331c9f8800 100644 (file)
@@ -354,12 +354,6 @@ read_builtin (list)
     add_unwind_protect (xfree, rlbuf);
 #endif
 
-  if (prompt && edit == 0)
-    {
-      fprintf (stderr, "%s", prompt);
-      fflush (stderr);
-    }
-
   pass_next = 0;       /* Non-zero signifies last char was backslash. */
   saw_escape = 0;      /* Non-zero signifies that we saw an escape char */
 
@@ -451,6 +445,12 @@ read_builtin (list)
 
   unbuffered_read = (nchars > 0) || (delim != '\n') || input_is_pipe;
 
+  if (prompt && edit == 0)
+    {
+      fprintf (stderr, "%s", prompt);
+      fflush (stderr);
+    }
+
 #if defined (__CYGWIN__) && defined (O_TEXT)
   setmode (0, O_TEXT);
 #endif
index 295b981960d6901fa575b457fa438da264e2e64c..b279f37d4f5c58c352a3faf50203b8048e0bf9c0 100644 (file)
@@ -50,8 +50,9 @@ Options:
   -t timeout   time out and return failure if a complete line of input is
                not read withint TIMEOUT seconds.  The value of the TMOUT
                variable is the default timeout.  TIMEOUT may be a
-               fractional number.  The exit status is greater than 128 if
-               the timeout is exceeded
+               fractional number.  If TIMEOUT is 0, read returns success only
+               if input is available on the specified file descriptor.  The
+               exit status is greater than 128 if the timeout is exceeded
   -u fd                read from file descriptor FD instead of the standard input
 
 Exit Status:
@@ -341,6 +342,7 @@ read_builtin (list)
      terminal, turn them off. */
   if ((prompt || edit || silent) && input_is_tty == 0)
     {
+itrace("read_builtin: input_is_tty == 0: disabling silent");
       prompt = (char *)NULL;
 #if defined (READLINE)
       itext = (char *)NULL;
@@ -353,11 +355,13 @@ read_builtin (list)
     add_unwind_protect (xfree, rlbuf);
 #endif
 
+#if 0
   if (prompt && edit == 0)
     {
       fprintf (stderr, "%s", prompt);
       fflush (stderr);
     }
+#endif
 
   pass_next = 0;       /* Non-zero signifies last char was backslash. */
   saw_escape = 0;      /* Non-zero signifies that we saw an escape char */
@@ -450,6 +454,14 @@ read_builtin (list)
 
   unbuffered_read = (nchars > 0) || (delim != '\n') || input_is_pipe;
 
+#if 1
+  if (prompt && edit == 0)
+    {
+      fprintf (stderr, "%s", prompt);
+      fflush (stderr);
+    }
+#endif
+
 #if defined (__CYGWIN__) && defined (O_TEXT)
   setmode (0, O_TEXT);
 #endif
index 202d2e6d304d4b1d9a7992ee5d9160ef953db111..9180da0462940534fcd9166a7e64114c8f2538df 100644 (file)
@@ -104,7 +104,7 @@ extern int errno;
 #  if defined (HPUX) && defined (RLIMIT_NEEDS_KERNEL)
 #    undef _KERNEL
 #  endif
-#else
+#elif defined (HAVE_SYS_TIMES_H)
 #  include <sys/times.h>
 #endif
 
index f3d11ac08f174be7f5402afb62007f82ed8fb185..202d2e6d304d4b1d9a7992ee5d9160ef953db111 100644 (file)
@@ -5,19 +5,18 @@ Copyright (C) 1987-2008 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 2, or (at your option) any later
-version.
+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.
+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; see the file COPYING.  If not, write to the Free Software
-Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+You should have received a copy of the GNU General Public License
+along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 
 $PRODUCES ulimit.c
 
@@ -183,7 +182,7 @@ extern int errno;
    otherwise. */
 #define POSIXBLK       -2
 
-#define BLOCKSIZE(x)   (((x) == POSIXBLK && posixly_correct) ? 512 : (x))
+#define BLOCKSIZE(x)   (((x) == POSIXBLK && posixly_correct) ? 512 : 1024)
 
 extern int posixly_correct;
 
index 46e5bda92c0747afe2c4bf68b6bae526b1529b58..5d77c7a11248510be2da1e703523da1809e7f136 100644 (file)
@@ -1,23 +1,23 @@
 /* command.h -- The structures used internally to represent commands, and
    the extern declarations of the functions used to create them. */
 
-/* Copyright (C) 1993-2005 Free Software Foundation, Inc.
+/* Copyright (C) 1993-2008 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 2, or (at your option) any later
-   version.
+   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.
+   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; see the file COPYING.  If not, write to the Free Software
-   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 #if !defined (_COMMAND_H_)
 #define _COMMAND_H_
@@ -66,7 +66,7 @@ enum r_instruction {
 /* Command Types: */
 enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
                    cm_connection, cm_function_def, cm_until, cm_group,
-                   cm_arith, cm_cond, cm_arith_for, cm_subshell };
+                   cm_arith, cm_cond, cm_arith_for, cm_subshell, cm_coproc };
 
 /* Possible values for the `flags' field of a WORD_DESC. */
 #define W_HASDOLLAR    0x000001        /* Dollar sign present. */
@@ -162,6 +162,8 @@ typedef struct element {
 #define CMD_AMPERSAND     0x200 /* command & */
 #define CMD_STDIN_REDIR           0x400 /* async command needs implicit </dev/null */
 #define CMD_COMMAND_BUILTIN 0x0800 /* command executed by `command' builtin */
+#define CMD_COPROC_SUBSHELL 0x1000
+#define CMD_NOERREXIT     0x2000 /* Don't exit even if errexit set */
 
 /* What a command looks like. */
 typedef struct command {
@@ -191,6 +193,7 @@ typedef struct command {
     struct arith_for_com *ArithFor;
 #endif
     struct subshell_com *Subshell;
+    struct coproc_com *Coproc;
   } value;
 } COMMAND;
 
@@ -205,8 +208,8 @@ typedef struct connection {
 /* Structures used to represent the CASE command. */
 
 /* Values for FLAGS word in a PATTERN_LIST */
-#define CASEPAT_FALLTHROUGH   0x01
-#define CASEPAT_TESTNEXT      0x02
+#define CASEPAT_FALLTHROUGH    0x01
+#define CASEPAT_TESTNEXT       0x02
 
 /* Pattern/action structure for CASE_COM. */
 typedef struct pattern_list {
@@ -332,7 +335,25 @@ typedef struct subshell_com {
   COMMAND *command;
 } SUBSHELL_COM;
 
+typedef struct coproc {
+  char *c_name;
+  pid_t c_pid;
+  int c_rfd;
+  int c_wfd;
+  int c_rsave;
+  int c_wsave;
+  int c_flags;
+  int c_status;
+} Coproc;
+
+typedef struct coproc_com {
+  int flags;
+  char *name;
+  COMMAND *command;
+} COPROC_COM;
+
 extern COMMAND *global_command;
+extern Coproc sh_coproc;
 
 /* Possible command errors */
 #define CMDERR_DEFAULT 0
index ee4733b61fcf742e2b96d59a5261164732088c5e..1037172562a34a770f512a07078ad851d6f41038 100644 (file)
@@ -6562,8 +6562,9 @@ Perform directory name completion if the compspec generates no matches.
 .TP 8
 .B filenames
 Tell readline that the compspec generates filenames, so it can perform any
-filename\-specific processing (like adding a slash to directory names or
-suppressing trailing spaces).  Intended to be used with shell functions.
+filename\-specific processing (like adding a slash to directory names,
+quoting special characters, or suppressing trailing spaces).
+Intended to be used with shell functions.
 .TP 8
 .B nospace
 Tell readline not to append a space (the default) to words completed at
@@ -8191,8 +8192,11 @@ and
 files are not processed, shell functions are not inherited from the
 environment, and the
 .SM
-.B SHELLOPTS
-variable, if it appears in the environment, is ignored.
+.BR SHELLOPTS ,
+.BR CDPATH ,
+and
+.B GLOBIGNORE
+variables, if they appear in the environment, are ignored.
 If the shell is started with the effective user (group) id not equal to the
 real user (group) id, and the \fB\-p\fP option is not supplied, these actions
 are taken and the effective user id is set to the real user id.
index a63922f3eddd2835a8e5f33e2bac24b8de6365f1..f52f1473859bf51e1c07b6f15316b04b2ba5bb6a 100644 (file)
@@ -5,12 +5,12 @@
 .\"    Case Western Reserve University
 .\"    chet@po.cwru.edu
 .\"
-.\"    Last Change: Sat Sep  6 13:05:54 EDT 2008
+.\"    Last Change: Sat Sep 13 18:27:41 EDT 2008
 .\"
 .\" bash_builtins, strip all but Built-Ins section
 .if \n(zZ=1 .ig zZ
 .if \n(zY=1 .ig zY
-.TH BASH 1 "2008 September 6" "GNU Bash-4.0"
+.TH BASH 1 "2008 September 13" "GNU Bash-4.0"
 .\"
 .\" There's some problem with having a `@'
 .\" in a tagged paragraph with the BSD man macros.
@@ -4535,18 +4535,27 @@ This is the library that handles reading input when using an interactive
 shell, unless the
 .B \-\-noediting
 option is given at shell invocation.
+Line editing is also used when using the \fB\-e\fP option to the
+\fBread\fP builtin.
 By default, the line editing commands are similar to those of emacs.
 A vi-style line editing interface is also available.
-To turn off line editing after the shell is running, use the
-.B +o emacs
+Line editing can be enabled at any time using the
+.B \-o emacs
 or
-.B +o vi
+.B \-o vi
 options to the
 .B set
 builtin (see
 .SM
 .B SHELL BUILTIN COMMANDS
 below).
+To turn off line editing after the shell is running, use the
+.B +o emacs
+or
+.B +o vi
+options to the
+.B set
+builtin.
 .SS "Readline Notation"
 .PP
 In this section, the emacs-style notation is used to denote
@@ -6553,8 +6562,9 @@ Perform directory name completion if the compspec generates no matches.
 .TP 8
 .B filenames
 Tell readline that the compspec generates filenames, so it can perform any
-filename\-specific processing (like adding a slash to directory names or
-suppressing trailing spaces).  Intended to be used with shell functions.
+filename\-specific processing (like adding a slash to directory names,
+quoting special characters, or suppressing trailing spaces).
+Intended to be used with shell functions.
 .TP 8
 .B nospace
 Tell readline not to append a space (the default) to words completed at
@@ -7842,6 +7852,8 @@ is coming from a terminal,
 .SM
 .B READLINE
 above) is used to obtain the line.
+Readline uses the current (or default, if line editing was not previously
+active) editing settings.
 .TP
 .B \-i \fItext\fP
 If
@@ -8052,6 +8064,7 @@ by default when the shell is interactive, unless the shell is started
 with the
 .B \-\-noediting
 option.
+This also affects the editing interface used for \fBread \-e\fP.
 .TP 8
 .B errtrace
 Same as
@@ -8148,6 +8161,7 @@ Same as
 .TP 8
 .B vi
 Use a vi-style command line editing interface.
+This also affects the editing interface used for \fBread \-e\fP.
 .TP 8
 .B xtrace
 Same as
index 28d5ac33f2e9e0860724afe0ec3fd692067ff5dd..2e37ff11e4166e232d974b758dd28ef83c91bda7 100644 (file)
@@ -4090,8 +4090,8 @@ Same as @code{-x}.
 Turn on privileged mode.
 In this mode, the @env{$BASH_ENV} and @env{$ENV} files are not
 processed, shell functions are not inherited from the environment,
-and the @env{SHELLOPTS} variable, if it appears in the environment,
-is ignored.
+and the @env{SHELLOPTS}, @env{CDPATH} and @env{GLOBIGNORE}  variables,
+if they appear in the environment, are ignored.
 If the shell is started with the effective user (group) id not equal to the
 real user (group) id, and the @code{-p} option is not supplied, these actions
 are taken and the effective user id is set to the real user id.
index 4817e6f45dc4c9ea1d41704bf88920ee4a9fc12d..28d5ac33f2e9e0860724afe0ec3fd692067ff5dd 100644 (file)
@@ -3716,6 +3716,8 @@ rather than newline.
 
 @item -e
 Readline (@pxref{Command Line Editing}) is used to obtain the line.
+Readline uses the current (or default, if line editing was not previously
+active) editing settings.
 
 @item -i @var{text}
 If Readline is being used to read the line, @var{text} is placed into
@@ -4003,6 +4005,7 @@ Same as @code{-B}.
 
 @item emacs
 Use an @code{emacs}-style line editing interface (@pxref{Command Line Editing}).
+This also affects the editing interface used for @code{read -e}.
 
 @item errexit
 Same as @code{-e}.
@@ -4077,6 +4080,7 @@ Same as @code{-v}.
 
 @item vi
 Use a @code{vi}-style line editing interface.
+This also affects the editing interface used for @code{read -e}.
 
 @item xtrace
 Same as @code{-x}.
index 41bee8d083af146158e3ec2abcfb9b86197d0270..71dbfccf6fafcbcea8454551206bb7d713a04409 100644 (file)
@@ -736,7 +736,11 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
          }
       }
 
-      if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+      /* 10/6/2008 -- added test for pipe_in and pipe_out because they indicate
+        the presence of a pipeline, and (until Posix changes things), a
+        pipeline failure should not cause the parent shell to exit on an
+        unsuccessful return status, even in the presence of errexit.. */
+      if (was_error_trap && ignore_return == 0 && invert == 0 && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)
        {
          last_command_exit_value = exec_result;
          run_error_trap ();
@@ -744,7 +748,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
 
       if (ignore_return == 0 && invert == 0 &&
          ((posixly_correct && interactive == 0 && special_builtin_failed) ||
-          (exit_immediately_on_error && (exec_result != EXECUTION_SUCCESS))))
+          (exit_immediately_on_error && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)))
        {
          last_command_exit_value = exec_result;
          run_pending_traps ();
index 634c86e8eb1350ae9d6bf583dd4aff02a1fe7bef..a4d857c1e34e1b89276fb56b42b5d9b9de9192b8 100644 (file)
@@ -669,7 +669,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
     add_unwind_protect ((Function *)dispose_redirects, exec_undo_list);
 
   ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
-
+itrace("execute_command_internal: ignore_return = %d", ignore_return);
   QUIT;
 
   switch (command->type)
@@ -736,16 +736,22 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
          }
       }
 
-      if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+      /* 10/6/2008 -- added test for pipe_in and pipe_out because they indicate
+        the presence of a pipeline, and (until Posix changes things), a
+        pipeline failure should not cause the parent shell to exit on an
+        unsuccessful return status, even in the presence of errexit.. */
+      if (was_error_trap && ignore_return == 0 && invert == 0 && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)
        {
          last_command_exit_value = exec_result;
+itrace("execute_command: simple_command: exit_immediately_on_error = %d pipe_in = %d pipe_out = %d running error trap", exit_immediately_on_error, pipe_in, pipe_out);
          run_error_trap ();
        }
 
       if (ignore_return == 0 && invert == 0 &&
          ((posixly_correct && interactive == 0 && special_builtin_failed) ||
-          (exit_immediately_on_error && (exec_result != EXECUTION_SUCCESS))))
+          (exit_immediately_on_error && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)))
        {
+itrace("execute_command: simple_command: exec_result = %d, exiting immediately", exec_result);
          last_command_exit_value = exec_result;
          run_pending_traps ();
          jump_to_top_level (ERREXIT);
@@ -1924,6 +1930,7 @@ execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close)
   prev = pipe_in;
   cmd = command;
 
+itrace("execute_pipeline: ignore_return = %d", ignore_return);
   while (cmd && cmd->type == cm_connection &&
         cmd->value.Connection && cmd->value.Connection->connector == '|')
     {
@@ -2113,6 +2120,7 @@ execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
         and the connector is OR_OR, then execute the second command,
         otherwise return. */
 
+      executing_list++;
       if (command->value.Connection->first)
        command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
 
@@ -2128,6 +2136,7 @@ execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
 
          exec_result = execute_command (command->value.Connection->second);
        }
+      executing_list--;
       break;
 
     default:
@@ -3401,7 +3410,7 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
       /* Do this now, because execute_disk_command will do it anyway in the
         vast majority of cases. */
       maybe_make_export_env ();
-
+itrace("execute_simple_command: %s: dofork = 1", the_printed_command_except_trap);
       /* Don't let a DEBUG trap overwrite the command string to be saved with
         the process/job associated with this child. */
       if (make_child (savestring (the_printed_command_except_trap), async) == 0)
@@ -3437,6 +3446,7 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
 #endif
          command_line = (char *)NULL;      /* don't free this. */
          bind_lastarg ((char *)NULL);
+itrace("execute_simple_command: parent: returning %d", result);
          return (result);
        }
     }
@@ -4020,6 +4030,7 @@ execute_subshell_builtin_or_function (words, redirects, builtin, var,
                ((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
 #endif
 
+itrace("execute_subshell_builtin_or_function:");
   /* A subshell is neither a login shell nor interactive. */
   login_shell = interactive = 0;
 
index a9def85f3549fc094ab6c473d9db7a391b7ae4cd..da1bfcf87c5a32943d0486d2a056ca65fafeea57 100644 (file)
@@ -1434,6 +1434,13 @@ call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force
 Readline to update its idea of the terminal size when a @code{SIGWINCH}
 is received.
 
+@deftypefun rl_echo_signal_char (int sig)
+If an application wishes to install its own signal handlers, but still
+have readline display characters that generate signals, calling this
+function with @var{sig} set to @code{SIGINT}, @code{SIGQUIT}, or
+@code{SIGTSTP} will display the character generating that signal.
+@end deftypefun
+
 @deftypefun void rl_resize_terminal (void)
 Update Readline's internal screen size by reading values from the kernel.
 @end deftypefun
index 79f638b764f48b39d5f406af501433f46afe8763..a9def85f3549fc094ab6c473d9db7a391b7ae4cd 100644 (file)
@@ -523,6 +523,20 @@ Readline is performing word completion.
 Readline is currently executing the readline signal handler.
 @item RL_STATE_UNDOING
 Readline is performing an undo.
+@item RL_STATE_INPUTPENDING
+Readline has input pending due to a call to @code{rl_execute_next()}.
+@item RL_STATE_TTYCSAVED
+Readline has saved the values of the terminal's special characters.
+@item RL_STATE_CALLBACK
+Readline is currently using the alternate (callback) interface
+(@pxref{Alternate Interface}).
+@item RL_STATE_VIMOTION
+Readline is reading the argument to a vi-mode "motion" command.
+@item RL_STATE_MULTIKEY
+Readline is reading a multiple-keystroke command.
+@item RL_STATE_VICMDONCE
+Readline has entered vi command (movement) mode at least one time during
+the current call to @code{readline()}.
 @item RL_STATE_DONE
 Readline has read a key sequence bound to @code{accept-line}
 and is about to return the line to the caller.
@@ -1898,27 +1912,51 @@ history list.
    GNU Readline library.  This application interactively allows users
    to manipulate files and their modes. */
 
-#include <stdio.h>
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include <sys/types.h>
-#include <sys/file.h>
+#ifdef HAVE_SYS_FILE_H
+#  include <sys/file.h>
+#endif
 #include <sys/stat.h>
-#include <sys/errno.h>
+
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else /* !HAVE_STRING_H */
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#endif
+
+#include <time.h>
 
 #include <readline/readline.h>
 #include <readline/history.h>
 
-extern char *xmalloc ();
+extern char *xmalloc PARAMS((size_t));
 
 /* The names of functions that actually do the manipulation. */
-int com_list __P((char *));
-int com_view __P((char *));
-int com_rename __P((char *));
-int com_stat __P((char *));
-int com_pwd __P((char *));
-int com_delete __P((char *));
-int com_help __P((char *));
-int com_cd __P((char *));
-int com_quit __P((char *));
+int com_list PARAMS((char *));
+int com_view PARAMS((char *));
+int com_rename PARAMS((char *));
+int com_stat PARAMS((char *));
+int com_pwd PARAMS((char *));
+int com_delete PARAMS((char *));
+int com_help PARAMS((char *));
+int com_cd PARAMS((char *));
+int com_quit PARAMS((char *));
 
 /* A structure which contains information on the commands this program
    can understand. */
@@ -1951,12 +1989,12 @@ COMMAND *find_command ();
 /* The name of this program, as taken from argv[0]. */
 char *progname;
 
-/* When non-zero, this means the user is done using this program. */
+/* When non-zero, this global means the user is done using this program. */
 int done;
 
 char *
 dupstr (s)
-     int s;
+     char *s;
 @{
   char *r;
 
@@ -2081,12 +2119,12 @@ stripwhite (string)
 /*                                                                  */
 /* **************************************************************** */
 
-char *command_generator __P((const char *, int));
-char **fileman_completion __P((const char *, int, int));
+char *command_generator PARAMS((const char *, int));
+char **fileman_completion PARAMS((const char *, int, int));
 
-/* Tell the GNU Readline library how to complete.  We want to try to
-   complete on command names if this is the first word in the line, or
-   on filenames if not. */
+/* Tell the GNU Readline library how to complete.  We want to try to complete
+   on command names if this is the first word in the line, or on filenames
+   if not. */
 initialize_readline ()
 @{
   /* Allow conditional parsing of the ~/.inputrc file. */
@@ -2096,11 +2134,11 @@ initialize_readline ()
   rl_attempted_completion_function = fileman_completion;
 @}
 
-/* Attempt to complete on the contents of TEXT.  START and END
-   bound the region of rl_line_buffer that contains the word to
-   complete.  TEXT is the word to complete.  We can use the entire
-   contents of rl_line_buffer in case we want to do some simple
-   parsing.  Returnthe array of matches, or NULL if there aren't any. */
+/* Attempt to complete on the contents of TEXT.  START and END bound the
+   region of rl_line_buffer that contains the word to complete.  TEXT is
+   the word to complete.  We can use the entire contents of rl_line_buffer
+   in case we want to do some simple parsing.  Return the array of matches,
+   or NULL if there aren't any. */
 char **
 fileman_completion (text, start, end)
      const char *text;
@@ -2119,9 +2157,9 @@ fileman_completion (text, start, end)
   return (matches);
 @}
 
-/* Generator function for command completion.  STATE lets us
-   know whether to start from scratch; without any state
-   (i.e. STATE == 0), then we start at the top of the list. */
+/* Generator function for command completion.  STATE lets us know whether
+   to start from scratch; without any state (i.e. STATE == 0), then we
+   start at the top of the list. */
 char *
 command_generator (text, state)
      const char *text;
@@ -2130,17 +2168,16 @@ command_generator (text, state)
   static int list_index, len;
   char *name;
 
-  /* If this is a new word to complete, initialize now.  This
-     includes saving the length of TEXT for efficiency, and
-     initializing the index variable to 0. */
+  /* If this is a new word to complete, initialize now.  This includes
+     saving the length of TEXT for efficiency, and initializing the index
+     variable to 0. */
   if (!state)
     @{
       list_index = 0;
       len = strlen (text);
     @}
 
-  /* Return the next name which partially matches from the
-     command list. */
+  /* Return the next name which partially matches from the command list. */
   while (name = commands[list_index].name)
     @{
       list_index++;
@@ -2180,7 +2217,12 @@ com_view (arg)
   if (!valid_argument ("view", arg))
     return 1;
 
+#if defined (__MSDOS__)
+  /* more.com doesn't grok slashes in pathnames */
+  sprintf (syscom, "less %s", arg);
+#else
   sprintf (syscom, "more %s", arg);
+#endif
   return (system (syscom));
 @}
 
@@ -2207,7 +2249,8 @@ com_stat (arg)
 
   printf ("Statistics for `%s':\n", arg);
 
-  printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+  printf ("%s has %d link%s, and is %d byte%s in length.\n",
+         arg,
           finfo.st_nlink,
           (finfo.st_nlink == 1) ? "" : "s",
           finfo.st_size,
@@ -2296,8 +2339,7 @@ com_pwd (ignore)
   return 0;
 @}
 
-/* The user wishes to quit using this program.  Just set DONE
-   non-zero. */
+/* The user wishes to quit using this program.  Just set DONE non-zero. */
 com_quit (arg)
      char *arg;
 @{
@@ -2310,13 +2352,12 @@ too_dangerous (caller)
      char *caller;
 @{
   fprintf (stderr,
-           "%s: Too dangerous for me to distribute.\n",
+           "%s: Too dangerous for me to distribute.  Write it yourself.\n",
            caller);
-  fprintf (stderr, "Write it yourself.\n");
 @}
 
-/* Return non-zero if ARG is a valid argument for CALLER,
-   else print an error message and return zero. */
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+   an error message and return zero. */
 int
 valid_argument (caller, arg)
      char *caller, *arg;
index afaaab455bfb35e4b57119f0eb6a67a9e23ddbe7..9ecfeec6947707412f531463305e35615bebe65c 100644 (file)
@@ -1743,9 +1743,10 @@ Perform directory name completion if the compspec generates no matches.
 
 @item filenames
 Tell Readline that the compspec generates filenames, so it can perform any
-filename-specific processing (like adding a slash to directory names or
-suppressing trailing spaces).  This option is intended to be used with
-shell functions specified with @option{-F}.
+filename-specific processing (like adding a slash to directory names
+quoting special characters, or suppressing trailing spaces).
+This option is intended to be used with shell functions specified
+with @option{-F}.
 
 @item nospace
 Tell Readline not to append a space (the default) to words completed at
index 0d5c5693bbdea21cc306176db360517cbb5ff1b9..5c98f17d3ed5ccf9f45bbb6a3ce0ea666ac07896 100644 (file)
@@ -4,7 +4,7 @@ Copyright (C) 1988-2008 Free Software Foundation, Inc.
 
 @set EDITION 6.0
 @set VERSION 6.0
-@set UPDATED 12 August 2008
-@set UPDATED-MONTH August 2008
+@set UPDATED 4 October 2008
+@set UPDATED-MONTH October 2008
 
-@set LASTCHANGE Tue Aug 12 16:41:31 EDT 2008
+@set LASTCHANGE Sun Oct  5 00:18:13 EDT 2008
index 75322efc5b9c5da3221a10963f3ee0b226ce7d15..0d5c5693bbdea21cc306176db360517cbb5ff1b9 100644 (file)
@@ -2,9 +2,9 @@
 Copyright (C) 1988-2008 Free Software Foundation, Inc. 
 @end ignore
 
-@set EDITION 5.2
-@set VERSION 5.2
-@set UPDATED 8 May 2008
-@set UPDATED-MONTH May 2008
+@set EDITION 6.0
+@set VERSION 6.0
+@set UPDATED 12 August 2008
+@set UPDATED-MONTH August 2008
 
-@set LASTCHANGE Thu May  8 09:29:33 EDT 2008
+@set LASTCHANGE Tue Aug 12 16:41:31 EDT 2008
index b5ca13e73382545102138c349aea74a7e3193108..f5d1201feaea7edce381616c904d760cf352bb44 100644 (file)
@@ -318,6 +318,8 @@ add_history_time (string)
 {
   HIST_ENTRY *hs;
 
+  if (string == 0)
+    return;
   hs = the_history[history_length - 1];
   FREE (hs->timestamp);
   hs->timestamp = savestring (string);
index 3fbcaeaa0320b3b636cbda5468cf1cfa0dc73613..f5d1201feaea7edce381616c904d760cf352bb44 100644 (file)
@@ -1,24 +1,23 @@
 /* history.c -- standalone history library */
 
-/* Copyright (C) 1989-2005 Free Software Foundation, Inc.
+/* Copyright (C) 1989-2008 Free Software Foundation, Inc.
 
-   This file contains the GNU History Library (the Library), a set of
+   This file contains the GNU History Library (History), a set of
    routines for managing the text of previously typed lines.
 
-   The Library is free software; you can redistribute it and/or modify
+   History 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 2, or (at your option)
-   any later version.
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-   The Library 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.
+   History 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.
 
-   The GNU General Public License is often shipped with GNU software, and
-   is generally kept in a file called COPYING or LICENSE.  If you do not
-   have a copy of the license, write to the Free Software Foundation,
-   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with History.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 /* The goal is to make the implementation transparent, so that you
    don't have to know what data types are used, just what functions
@@ -319,6 +318,8 @@ add_history_time (string)
 {
   HIST_ENTRY *hs;
 
+  if (string == 0)
+    return;
   hs = the_history[history_length - 1];
   FREE (hs->timestamp);
   hs->timestamp = savestring (string);
@@ -483,7 +484,7 @@ stifle_history (max)
 
 /* Stop stifling the history.  This returns the previous maximum
    number of history entries.  The value is positive if the history
-   was stifled,  negative if it wasn't. */
+   was stifled, negative if it wasn't. */
 int
 unstifle_history ()
 {
index 4dff05d0fd5e5369ee6a7a2c878684f870e56739..1fcf91b492fd42bce45ff2754580659fca391f83 100644 (file)
@@ -428,7 +428,9 @@ extern int rl_clear_signals PARAMS((void));
 extern void rl_cleanup_after_signal PARAMS((void));
 extern void rl_reset_after_signal PARAMS((void));
 extern void rl_free_line_state PARAMS((void));
+
+extern void rl_echo_signal_char PARAMS((int)); 
+
 extern int rl_set_paren_blink_timeout PARAMS((int));
 
 /* Undocumented. */
index ddeff0be2f61f0683599fdbad0725c498f59cc82..ea57b968bb7429d883f8e5fbedfcacf7e291496b 100644 (file)
@@ -2,23 +2,22 @@
 
 /* Copyright (C) 1987-2008 Free Software Foundation, Inc.
 
-   This file is part of the GNU Readline Library, a library for
-   reading lines of text with interactive input and history editing.
+   This file is part of the GNU Readline Library (Readline), a library
+   for reading lines of text with interactive input and history editing.      
 
-   The GNU Readline Library 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 2, or
+   Readline 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.
 
-   The GNU Readline Library 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
+   Readline 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.
 
-   The GNU General Public License is often shipped with GNU software, and
-   is generally kept in a file called COPYING or LICENSE.  If you do not
-   have a copy of the license, write to the Free Software Foundation,
-   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 #if !defined (_READLINE_H_)
 #define _READLINE_H_
@@ -40,9 +39,9 @@ extern "C" {
 #endif
 
 /* Hex-encoded Readline version number. */
-#define RL_READLINE_VERSION    0x0502          /* Readline 5.2 */
-#define RL_VERSION_MAJOR       5
-#define RL_VERSION_MINOR       2
+#define RL_READLINE_VERSION    0x0600          /* Readline 6.0 */
+#define RL_VERSION_MAJOR       6
+#define RL_VERSION_MINOR       0
 
 /* Readline data structures. */
 
@@ -429,7 +428,7 @@ extern int rl_clear_signals PARAMS((void));
 extern void rl_cleanup_after_signal PARAMS((void));
 extern void rl_reset_after_signal PARAMS((void));
 extern void rl_free_line_state PARAMS((void));
+
 extern int rl_set_paren_blink_timeout PARAMS((int));
 
 /* Undocumented. */
@@ -605,6 +604,10 @@ extern int rl_catch_sigwinch;
    filename completer. */
 extern rl_compentry_func_t *rl_completion_entry_function;
 
+/* Optional generator for menu completion.  Default is
+   rl_completion_entry_function (rl_filename_completion_function). */
+ extern rl_compentry_func_t *rl_menu_completion_entry_function;
+
 /* If rl_ignore_some_completions_function is non-NULL it is the address
    of a function to call after all of the possible matches have been
    generated, but before the actual completion is done to the input line.
index f8758d8904a4f830c09550020279ff62b35d0728..d0463fb2bd9c51efb6032ff2c43beac1643230ca 100644 (file)
@@ -423,6 +423,13 @@ extern _rl_keyseq_cxt *_rl_kscxt;
 /* search.c */
 extern _rl_search_cxt *_rl_nscxt;
 
+/* signals.c */
+extern int _rl_echoctl;
+
+extern _rl_intr_char;
+extern _rl_quit_char;
+extern _rl_susp_char;
+
 /* terminal.c */
 extern int _rl_enable_keypad;
 extern int _rl_enable_meta;
index 028acd191987d756cefc00e2bbfac0438336ddb8..6c5b2718d6d18e7d2d21ca0d43e09d2b3efa57ae 100644 (file)
@@ -294,6 +294,8 @@ extern int _rl_nsearch_callback PARAMS((_rl_search_cxt *));
 extern void _rl_block_sigint PARAMS((void));
 extern void _rl_release_sigint PARAMS((void));
 
+extern void _rl_echo_signal_char PARAMS((int)); 
+
 /* terminal.c */
 extern void _rl_get_screen_size PARAMS((int, int));
 extern int _rl_init_terminal_io PARAMS((const char *));
@@ -330,11 +332,15 @@ extern UNDO_LIST *_rl_copy_undo_list PARAMS((UNDO_LIST *));
 #if defined (USE_VARARGS) && defined (PREFER_STDARG)
 extern void _rl_ttymsg (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
 extern void _rl_errmsg (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
+extern void _rl_trace (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
 #else
 extern void _rl_ttymsg ();
 extern void _rl_errmsg ();
+extern void _rl_trace ();
 #endif
 
+extern int _rl_tropen PARAMS((void));
+
 extern int _rl_abort_internal PARAMS((void));
 extern char *_rl_strindex PARAMS((const char *, const char *));
 extern int _rl_qsort_string_compare PARAMS((char **, char **));
@@ -419,6 +425,13 @@ extern _rl_keyseq_cxt *_rl_kscxt;
 /* search.c */
 extern _rl_search_cxt *_rl_nscxt;
 
+/* signals.c */
+extern int _rl_echoctl;
+
+extern _rl_intr_char;
+extern _rl_quit_char;
+extern _rl_susp_char;
+
 /* terminal.c */
 extern int _rl_enable_keypad;
 extern int _rl_enable_meta;
index 567ef5b8d0c155ee06371caaa286728611e90f31..61f9103586c985aa3b23fdf02b2fed3679d019c0 100644 (file)
@@ -137,8 +137,9 @@ save_tty_chars (tiop)
 
   if (tiop->flags & TCHARS_SET)
     {
-      _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
-      _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
+      _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
+      _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
+
       _rl_tty_chars.t_start = tiop->tchars.t_startc;
       _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
       _rl_tty_chars.t_eof = tiop->tchars.t_eofc;
@@ -148,7 +149,8 @@ save_tty_chars (tiop)
 
   if (tiop->flags & LTCHARS_SET)
     {
-      _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
+      _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
+
       _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc;
       _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc;
       _rl_tty_chars.t_flush = tiop->ltchars.t_flushc;
@@ -236,6 +238,7 @@ prepare_terminal_settings (meta_flag, oldtio, tiop)
      TIOTYPE oldtio, *tiop;
 {
   _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
+  _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL);
 
   /* Copy the original settings to the structure we're going to use for
      our settings. */
@@ -366,10 +369,10 @@ save_tty_chars (tiop)
 #ifdef VREPRINT
   _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
 #endif
-  _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
-  _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
+  _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
+  _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
 #ifdef VSUSP
-  _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
+  _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
 #endif
 #ifdef VDSUSP
   _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
@@ -514,6 +517,7 @@ prepare_terminal_settings (meta_flag, oldtio, tiop)
      TIOTYPE oldtio, *tiop;
 {
   _rl_echoing_p = (oldtio.c_lflag & ECHO);
+  _rl_echoctl = (oldtio.c_lflag & ECHOCTL);
 
   tiop->c_lflag &= ~(ICANON | ECHO);
 
index 47c462897cf4fd7f19e6d353622d5dbaed222c76..c7552e50b991d0163485cd8f913d94967d50a912 100644 (file)
@@ -3,23 +3,23 @@
 
 /* Copyright (C) 1992-2005 Free Software Foundation, Inc.
 
-   This file is part of the GNU Readline Library, a library for
-   reading lines of text with interactive input and history editing.
+   This file is part of the GNU Readline Library (Readline), a library
+   for reading lines of text with interactive input and history editing.      
 
-   The GNU Readline Library 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 2, or
+   Readline 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.
 
-   The GNU Readline Library 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
+   Readline 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.
 
-   The GNU General Public License is often shipped with GNU software, and
-   is generally kept in a file called COPYING or LICENSE.  If you do not
-   have a copy of the license, write to the Free Software Foundation,
-   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
 #define READLINE_LIBRARY
 
 #if defined (HAVE_CONFIG_H)
@@ -52,75 +52,8 @@ extern int errno;
 rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal;
 rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal;
 
-static void block_sigint PARAMS((void));
-static void release_sigint PARAMS((void));
-
 static void set_winsize PARAMS((int));
 
-/* **************************************************************** */
-/*                                                                 */
-/*                        Signal Management                        */
-/*                                                                 */
-/* **************************************************************** */
-
-#if defined (HAVE_POSIX_SIGNALS)
-static sigset_t sigint_set, sigint_oset;
-#else /* !HAVE_POSIX_SIGNALS */
-#  if defined (HAVE_BSD_SIGNALS)
-static int sigint_oldmask;
-#  endif /* HAVE_BSD_SIGNALS */
-#endif /* !HAVE_POSIX_SIGNALS */
-
-static int sigint_blocked;
-
-/* Cause SIGINT to not be delivered until the corresponding call to
-   release_sigint(). */
-static void
-block_sigint ()
-{
-  if (sigint_blocked)
-    return;
-
-#if defined (HAVE_POSIX_SIGNALS)
-  sigemptyset (&sigint_set);
-  sigemptyset (&sigint_oset);
-  sigaddset (&sigint_set, SIGINT);
-  sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset);
-#else /* !HAVE_POSIX_SIGNALS */
-#  if defined (HAVE_BSD_SIGNALS)
-  sigint_oldmask = sigblock (sigmask (SIGINT));
-#  else /* !HAVE_BSD_SIGNALS */
-#    if defined (HAVE_USG_SIGHOLD)
-  sighold (SIGINT);
-#    endif /* HAVE_USG_SIGHOLD */
-#  endif /* !HAVE_BSD_SIGNALS */
-#endif /* !HAVE_POSIX_SIGNALS */
-
-  sigint_blocked = 1;
-}
-
-/* Allow SIGINT to be delivered. */
-static void
-release_sigint ()
-{
-  if (sigint_blocked == 0)
-    return;
-
-#if defined (HAVE_POSIX_SIGNALS)
-  sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL);
-#else
-#  if defined (HAVE_BSD_SIGNALS)
-  sigsetmask (sigint_oldmask);
-#  else /* !HAVE_BSD_SIGNALS */
-#    if defined (HAVE_USG_SIGHOLD)
-  sigrelse (SIGINT);
-#    endif /* HAVE_USG_SIGHOLD */
-#  endif /* !HAVE_BSD_SIGNALS */
-#endif /* !HAVE_POSIX_SIGNALS */
-
-  sigint_blocked = 0;
-}
-
 /* **************************************************************** */
 /*                                                                 */
 /*                   Saving and Restoring the TTY                  */
@@ -204,8 +137,9 @@ save_tty_chars (tiop)
 
   if (tiop->flags & TCHARS_SET)
     {
-      _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
-      _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
+      _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
+      _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
+
       _rl_tty_chars.t_start = tiop->tchars.t_startc;
       _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
       _rl_tty_chars.t_eof = tiop->tchars.t_eofc;
@@ -215,7 +149,8 @@ save_tty_chars (tiop)
 
   if (tiop->flags & LTCHARS_SET)
     {
-      _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
+      _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
+
       _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc;
       _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc;
       _rl_tty_chars.t_flush = tiop->ltchars.t_flushc;
@@ -268,7 +203,7 @@ set_tty_settings (tty, tiop)
       ioctl (tty, TIOCSETN, &(tiop->sgttyb));
       tiop->flags &= ~SGTTY_SET;
     }
-  readline_echoing_p = 1;
+  _rl_echoing_p = 1;
 
 #if defined (TIOCLSET)
   if (tiop->flags & LFLAG_SET)
@@ -302,7 +237,7 @@ prepare_terminal_settings (meta_flag, oldtio, tiop)
      int meta_flag;
      TIOTYPE oldtio, *tiop;
 {
-  readline_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
+  _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
 
   /* Copy the original settings to the structure we're going to use for
      our settings. */
@@ -433,10 +368,10 @@ save_tty_chars (tiop)
 #ifdef VREPRINT
   _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
 #endif
-  _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
-  _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
+  _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
+  _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
 #ifdef VSUSP
-  _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
+  _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
 #endif
 #ifdef VDSUSP
   _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
@@ -580,7 +515,7 @@ prepare_terminal_settings (meta_flag, oldtio, tiop)
      int meta_flag;
      TIOTYPE oldtio, *tiop;
 {
-  readline_echoing_p = (oldtio.c_lflag & ECHO);
+  _rl_echoing_p = (oldtio.c_lflag & ECHO);
 
   tiop->c_lflag &= ~(ICANON | ECHO);
 
@@ -643,7 +578,7 @@ void
 rl_prep_terminal (meta_flag)
      int meta_flag;
 {
-  readline_echoing_p = 1;
+  _rl_echoing_p = 1;
 }
 
 void
@@ -663,7 +598,7 @@ rl_prep_terminal (meta_flag)
     return;
 
   /* Try to keep this function from being INTerrupted. */
-  block_sigint ();
+  _rl_block_sigint ();
 
   tty = fileno (rl_instream);
 
@@ -676,8 +611,9 @@ rl_prep_terminal (meta_flag)
 #else
       if (errno == ENOTTY || errno == EINVAL)
 #endif
-       readline_echoing_p = 1;         /* XXX */
-      release_sigint ();
+       _rl_echoing_p = 1;              /* XXX */
+
+      _rl_release_sigint ();
       return;
     }
 
@@ -712,7 +648,7 @@ rl_prep_terminal (meta_flag)
 
   if (set_tty_settings (tty, &tio) < 0)
     {
-      release_sigint ();
+      _rl_release_sigint ();
       return;
     }
 
@@ -723,7 +659,7 @@ rl_prep_terminal (meta_flag)
   terminal_prepped = 1;
   RL_SETSTATE(RL_STATE_TERMPREPPED);
 
-  release_sigint ();
+  _rl_release_sigint ();
 }
 
 /* Restore the terminal's normal settings and modes. */
@@ -736,7 +672,7 @@ rl_deprep_terminal ()
     return;
 
   /* Try to keep this function from being interrupted. */
-  block_sigint ();
+  _rl_block_sigint ();
 
   tty = fileno (rl_instream);
 
@@ -747,14 +683,14 @@ rl_deprep_terminal ()
 
   if (set_tty_settings (tty, &otio) < 0)
     {
-      release_sigint ();
+      _rl_release_sigint ();
       return;
     }
 
   terminal_prepped = 0;
   RL_UNSETSTATE(RL_STATE_TERMPREPPED);
 
-  release_sigint ();
+  _rl_release_sigint ();
 }
 #endif /* !NO_TTY_DRIVER */
 \f
index c8f44933d65e20f6672d16592757e426cf46b396..af9b70b7a93a0e6f31e04211ddcb99dde6c40815 100644 (file)
@@ -94,6 +94,14 @@ int rl_catch_sigwinch = 1;
 int rl_catch_sigwinch = 0;     /* for the readline state struct in readline.c */
 #endif
 
+/* Private variables. */
+/* If non-zero, print characters corresponding to received signals. */
+int _rl_echoctl = 0;
+
+int _rl_intr_char = 0;
+int _rl_quit_char = 0;
+int _rl_susp_char = 0;
+
 static int signals_set_flag;
 static int sigwinch_set_flag;
 
@@ -159,6 +167,7 @@ rl_signal_handler (sig)
 #if defined (SIGQUIT)
     case SIGQUIT:
 #endif
+      rl_echo_signal_char (sig);
       rl_cleanup_after_signal ();
 
 #if defined (HAVE_POSIX_SIGNALS)
@@ -534,3 +543,41 @@ _rl_release_sigint ()
 
   sigint_blocked = 0;
 }
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Echoing special control characters                  */
+/*                                                                 */
+/* **************************************************************** */
+void
+rl_echo_signal_char (sig)
+     int sig;
+{
+  char cstr[3];
+  int cslen, c;
+
+  if (_rl_echoctl == 0)
+    return;
+
+  switch (sig)
+    {
+    case SIGINT:  c = _rl_intr_char; break;
+    case SIGQUIT: c = _rl_quit_char; break;
+    case SIGTSTP: c = _rl_susp_char; break;
+    default: return;
+    }
+
+  if (CTRL_CHAR (c) || c == RUBOUT)
+    {
+      cstr[0] = '^';
+      cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+      cstr[cslen = 2] = '\0';
+    }
+  else
+    {
+      cstr[0] = c;
+      cstr[cslen = 1] = '\0';
+    }
+
+  _rl_output_some_chars (cstr, cslen);
+}
index f79d65b154e2f85adced30d730bcb256ef909270..bf3e27b32dd88674da6e29486969a431b9835fd8 100644 (file)
@@ -1,24 +1,24 @@
 /* signals.c -- signal handling support for readline. */
 
-/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2008 Free Software Foundation, Inc.
 
-   This file is part of the GNU Readline Library, a library for
-   reading lines of text with interactive input and history editing.
+   This file is part of the GNU Readline Library (Readline), a library
+   for reading lines of text with interactive input and history editing.      
 
-   The GNU Readline Library 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 2, or
+   Readline 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.
 
-   The GNU Readline Library 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
+   Readline 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.
 
-   The GNU General Public License is often shipped with GNU software, and
-   is generally kept in a file called COPYING or LICENSE.  If you do not
-   have a copy of the license, write to the Free Software Foundation,
-   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
 #define READLINE_LIBRARY
 
 #if defined (HAVE_CONFIG_H)
 #  include <sys/ioctl.h>
 #endif /* GWINSZ_IN_SYS_IOCTL */
 
-#if defined (HANDLE_SIGNALS)
 /* Some standard library routines. */
 #include "readline.h"
 #include "history.h"
 
 #include "rlprivate.h"
 
+#if defined (HANDLE_SIGNALS)
+
 #if !defined (RETSIGTYPE)
 #  if defined (VOID_SIGHANDLER)
 #    define RETSIGTYPE void
@@ -93,6 +94,14 @@ int rl_catch_sigwinch = 1;
 int rl_catch_sigwinch = 0;     /* for the readline state struct in readline.c */
 #endif
 
+/* Private variables. */
+/* If non-zero, print characters corresponding to received signals. */
+int _rl_echoctl = 0;
+
+int _rl_intr_char = 0;
+int _rl_quit_char = 0;
+int _rl_susp_char = 0;
+
 static int signals_set_flag;
 static int sigwinch_set_flag;
 
@@ -253,7 +262,11 @@ rl_set_sighandler (sig, handler, ohandler)
   struct sigaction act;
 
   act.sa_handler = handler;
+#  if defined (SIGWINCH)
   act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0;
+#  else
+  act.sa_flags = 0;
+#  endif /* SIGWINCH */
   sigemptyset (&act.sa_mask);
   sigemptyset (&ohandler->sa_mask);
   sigaction (sig, &act, &old_handler);
@@ -465,3 +478,105 @@ rl_free_line_state ()
 }
 
 #endif  /* HANDLE_SIGNALS */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                        SIGINT Management                        */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined (HAVE_POSIX_SIGNALS)
+static sigset_t sigint_set, sigint_oset;
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+static int sigint_oldmask;
+#  endif /* HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+static int sigint_blocked;
+
+/* Cause SIGINT to not be delivered until the corresponding call to
+   release_sigint(). */
+void
+_rl_block_sigint ()
+{
+  if (sigint_blocked)
+    return;
+
+#if defined (HAVE_POSIX_SIGNALS)
+  sigemptyset (&sigint_set);
+  sigemptyset (&sigint_oset);
+  sigaddset (&sigint_set, SIGINT);
+  sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset);
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+  sigint_oldmask = sigblock (sigmask (SIGINT));
+#  else /* !HAVE_BSD_SIGNALS */
+#    if defined (HAVE_USG_SIGHOLD)
+  sighold (SIGINT);
+#    endif /* HAVE_USG_SIGHOLD */
+#  endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+  sigint_blocked = 1;
+}
+
+/* Allow SIGINT to be delivered. */
+void
+_rl_release_sigint ()
+{
+  if (sigint_blocked == 0)
+    return;
+
+#if defined (HAVE_POSIX_SIGNALS)
+  sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL);
+#else
+#  if defined (HAVE_BSD_SIGNALS)
+  sigsetmask (sigint_oldmask);
+#  else /* !HAVE_BSD_SIGNALS */
+#    if defined (HAVE_USG_SIGHOLD)
+  sigrelse (SIGINT);
+#    endif /* HAVE_USG_SIGHOLD */
+#  endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+  sigint_blocked = 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Echoing special control characters                  */
+/*                                                                 */
+/* **************************************************************** */
+void
+rl_echo_signal_char (sig)
+     int sig;
+{
+  char cstr[3];
+  int cslen, c;
+
+  if (_rl_echoctl == 0)
+    return;
+
+  switch (sig)
+    {
+    case SIGINT:  c = _rl_intr_char; break;
+    case SIGQUIT: c = _rl_quit_char; break;
+    case SIGTSTP: c = _rl_susp_char; break;
+    default: return;
+    }
+
+  if (CTRL_CHAR (c) || c == RUBOUT)
+    {
+      cstr[0] = '^';
+      cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+      cstr[cslen = 2] = '\0';
+    }
+  else
+    {
+      cstr[0] = c;
+      cstr[cslen = 1] = '\0';
+    }
+
+  _rl_output_some_chars (cstr, cslen);
+}
index 97487154edf4cdbe3b37aaabe80f47cb1ad5e409..1765555407706c45f4285a58bdd20d04785e1568 100644 (file)
--- a/nojobs.c
+++ b/nojobs.c
@@ -232,7 +232,7 @@ find_termsig_by_pid (pid)
     return (0);
   if (pid_list[i].flags & PROC_RUNNING)
     return (0);
-  return (get_termsig (pid_list[i].status));
+  return (get_termsig ((WAIT)pid_list[i].status));
 }
 
 /* Set LAST_COMMAND_EXIT_SIGNAL depending on STATUS.  If STATUS is -1, look
index c8a56275f0879df231f10c7dff06628c730429cb..97487154edf4cdbe3b37aaabe80f47cb1ad5e409 100644 (file)
--- a/nojobs.c~
+++ b/nojobs.c~
@@ -1,25 +1,25 @@
-/* The thing that makes children, remembers them, and contains wait loops. */
+/* nojobs.c - functions that make children, remember them, and handle their termination. */
 
 /* This file works under BSD, System V, minix, and Posix systems.  It does
    not implement job control. */
 
-/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2008 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 2, or (at your option) any later
-   version.
+   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.
+   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; see the file COPYING.  If not, write to the Free Software
-   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   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"
 
@@ -465,9 +465,7 @@ make_child (command, async_p)
      int async_p;
 {
   pid_t pid;
-#if defined (HAVE_WAITPID)
-  int retry = 1;
-#endif /* HAVE_WAITPID */
+  int forksleep;
 
   /* Discard saved memory. */
   if (command)
@@ -484,26 +482,27 @@ make_child (command, async_p)
     sync_buffered_stream (default_buffered_input);
 #endif /* BUFFERED_INPUT */
 
-  /* Create the child, handle severe errors. */
-#if defined (HAVE_WAITPID)
-  retry_fork:
-#endif /* HAVE_WAITPID */
-
-  if ((pid = fork ()) < 0)
+  /* Create the child, handle severe errors.  Retry on EAGAIN. */
+  forksleep = 1;
+  while ((pid = fork ()) < 0 && errno == EAGAIN && forksleep < FORKSLEEP_MAX)
     {
+      sys_error ("fork: retry");
 #if defined (HAVE_WAITPID)
       /* Posix systems with a non-blocking waitpid () system call available
         get another chance after zombies are reaped. */
-      if (errno == EAGAIN && retry)
-       {
-         reap_zombie_children ();
-         retry = 0;
-         goto retry_fork;
-       }
+      reap_zombie_children ();
+      if (forksleep > 1 && sleep (forksleep) != 0)
+        break;
+#else
+      if (sleep (forksleep) != 0)
+       break;
 #endif /* HAVE_WAITPID */
+      forksleep <<= 1;
+    }
 
+  if (pid < 0)
+    {
       sys_error ("fork");
-
       throw_to_top_level ();
     }
 
@@ -803,7 +802,7 @@ wait_for (pid)
     {
       fprintf (stderr, "%s", j_strsignal (WTERMSIG (status)));
       if (WIFCORED (status))
-       fprintf (stderr, " (core dumped)");
+       fprintf (stderr, _(" (core dumped)"));
       fprintf (stderr, "\n");
     }
 
diff --git a/redir.c b/redir.c
index 6db8d70ee497c1f45f9b2625ba960597748dd000..d4eeeedbf3e0831b3229be67d517b79b821a0c36 100644 (file)
--- a/redir.c
+++ b/redir.c
@@ -104,7 +104,7 @@ redirection_error (temp, error)
     filename = _("file descriptor out of range");
 #ifdef EBADF
   /* This error can never involve NOCLOBBER */
-  else if (error != NOCLOBBER_REDIRECT && temp->redirector >= 0 && errno == EBADF)
+  else if (error != NOCLOBBER_REDIRECT && temp->redirector >= 0 && error == EBADF)
     {
       /* If we're dealing with two file descriptors, we have to guess about
          which one is invalid; in the cases of r_{duplicating,move}_input and
index 0343233e1be97c46e1d18805347d2eb2a4b86b3d..6db8d70ee497c1f45f9b2625ba960597748dd000 100644 (file)
--- a/redir.c~
+++ b/redir.c~
@@ -4,19 +4,20 @@
 
    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 2, or (at your option)
-   any later version.
+   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.
+   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; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
 #include "config.h"
 
 #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
@@ -102,7 +103,8 @@ redirection_error (temp, error)
        exec 4294967297>x */
     filename = _("file descriptor out of range");
 #ifdef EBADF
-  else if (temp->redirector >= 0 && errno == EBADF)
+  /* This error can never involve NOCLOBBER */
+  else if (error != NOCLOBBER_REDIRECT && temp->redirector >= 0 && errno == EBADF)
     {
       /* If we're dealing with two file descriptors, we have to guess about
          which one is invalid; in the cases of r_{duplicating,move}_input and
@@ -939,7 +941,7 @@ do_redirection_internal (redirect, flags)
            {
              close (redir_fd);
 #if defined (COPROCESS_SUPPORT)
-             coproc_fdchk (&sh_coproc, redir_fd);
+             coproc_fdchk (redir_fd);  /* XXX - loses coproc fds */
 #endif
            }
        }
@@ -952,7 +954,7 @@ do_redirection_internal (redirect, flags)
            add_undo_redirect (redirector, ri);
 
 #if defined (COPROCESS_SUPPORT)
-         coproc_fdchk (&sh_coproc, redirector);
+         coproc_fdchk (redirector);
 #endif
 
 #if defined (BUFFERED_INPUT)
diff --git a/shell.c b/shell.c
index 5a07d3e713976412f5923407a9a89e8888a755a6..3b7e655f9e96a63b3180a5740948966fed90fa38 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -1541,6 +1541,7 @@ unset_bash_input (check_zero)
     {
       close_buffered_fd (default_buffered_input);
       default_buffered_input = bash_input.location.buffered_fd = -1;
+      bash_input.type = st_none;               /* XXX */
     }
 #else /* !BUFFERED_INPUT */
   if (default_input)
index 27bbcb574c6651494be763019117ee0bd0953fcf..e6bfe362da5d957fc3aa3c21f91c795debd5a99f 100644 (file)
--- a/shell.c~
+++ b/shell.c~
@@ -4,20 +4,21 @@
 
    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 2, or (at your option)
-   any later version.
+   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.
+   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; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
+/*
   Birthdate:
   Sunday, January 10th, 1988.
   Initial author: Brian Fox
@@ -571,7 +572,7 @@ main (argc, argv, env)
 
       /* running_under_emacs == 2 for `eterm' */
       running_under_emacs = (emacs != 0) || (term && STREQN (term, "emacs", 5));
-      running_under_emacs += term && STREQN (term, "eterm", 5) && strstr (emacs, "term"));
+      running_under_emacs += term && STREQN (term, "eterm", 5) && strstr (emacs, "term");
 
       if (running_under_emacs)
        gnu_error_format = 1;
@@ -906,7 +907,7 @@ exit_shell (s)
 #endif /* HISTORY */
 
 #if defined (COPROCESS_SUPPORT)
-  coproc_dispose (&sh_coproc);
+  coproc_flush ();
 #endif
 
 #if defined (JOB_CONTROL)
@@ -1540,6 +1541,7 @@ unset_bash_input (check_zero)
     {
       close_buffered_fd (default_buffered_input);
       default_buffered_input = bash_input.location.buffered_fd = -1;
+      bash_input.type = st_none;
     }
 #else /* !BUFFERED_INPUT */
   if (default_input)
diff --git a/subst.c b/subst.c
index 846b721118ea8f8d19f2bd8ad44f3e44aee89c4f..b327f431bec071c3b7d6c7a8c91cf7ba0102c20a 100644 (file)
--- a/subst.c
+++ b/subst.c
@@ -27,7 +27,9 @@
 #include "bashtypes.h"
 #include <stdio.h>
 #include "chartypes.h"
-#include <pwd.h>
+#if defined (HAVE_PWD_H)
+#  include <pwd.h>
+#endif
 #include <signal.h>
 #include <errno.h>
 
index 9d8785f0678f61717e48d49e0fec06ad77fd0879..846b721118ea8f8d19f2bd8ad44f3e44aee89c4f 100644 (file)
--- a/subst.c~
+++ b/subst.c~
@@ -53,6 +53,8 @@
 #include "builtins/getopt.h"
 #include "builtins/common.h"
 
+#include "builtins/builtext.h"
+
 #include <tilde/tilde.h>
 #include <glob/strmatch.h>
 
diff --git a/test.c b/test.c
index 5427860143ce0a394cdadb7e603042a4237b1f76..14330f2eec72aa601abbb5958a76470c97ce4487 100644 (file)
--- a/test.c
+++ b/test.c
@@ -310,7 +310,7 @@ filecomp (s, t, op)
     {
     case OT: return (r1 < r2 || (r2 == 0 && st1.st_mtime < st2.st_mtime));
     case NT: return (r1 > r2 || (r1 == 0 && st1.st_mtime > st2.st_mtime));
-    case EF: return ((st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino));
+    case EF: return (same_file (s, t, &st1, &st2));
     }
   return (FALSE);
 }
diff --git a/test.c~ b/test.c~
index f01929f708cf4cd2c85c9db5171c9d901b4cd473..b4639a8911f4c3cca3370f22b0698486b68c3fef 100644 (file)
--- a/test.c~
+++ b/test.c~
@@ -1,24 +1,24 @@
-/* GNU test program (ksb and mjb) */
+/* test.c - GNU test program (ksb and mjb) */
 
 /* Modified to run with the GNU shell Apr 25, 1988 by bfox. */
 
-/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2008 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 2, or (at your option) any later
-   version.
+   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.
+   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; see the file COPYING.  If not, write to the Free Software
-   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 /* Define PATTERN_MATCHING to get the csh-like =~ and !~ pattern-matching
    binary operators. */
@@ -310,7 +310,7 @@ filecomp (s, t, op)
     {
     case OT: return (r1 < r2 || (r2 == 0 && st1.st_mtime < st2.st_mtime));
     case NT: return (r1 > r2 || (r1 == 0 && st1.st_mtime > st2.st_mtime));
-    case EF: return ((st1.st_dev == st2.st_dev) && (st1.st_ino == st2.st_ino));
+    case EF: return (same_file (s, t, &st1, &st2);
     }
   return (FALSE);
 }
@@ -659,7 +659,7 @@ int
 test_unop (op)
      char *op;
 {
-  if (op[0] != '-')
+  if (op[0] != '-' || op[2] != 0)
     return (0);
 
   switch (op[1])
index 5b7971136a71353cbb78c56275b2d6b99aa4b70d..52185b54f99e9879fe74a5e80874817b1eebc096 100644 (file)
@@ -10,5 +10,5 @@ cd $DIR
 pwd
 echo $PWD
 
-cd $MYDIR
+cd "$MYDIR"
 rmdir $FULLDIR
diff --git a/tests/builtins1.sub~ b/tests/builtins1.sub~
new file mode 100644 (file)
index 0000000..5b79711
--- /dev/null
@@ -0,0 +1,14 @@
+unset CDPATH
+
+MYDIR=$(pwd -P)
+FULLDIR=/tmp/bash-dir-a
+DIR=${FULLDIR##*/}
+
+mkdir $FULLDIR
+CDPATH=.:/tmp
+cd $DIR
+pwd
+echo $PWD
+
+cd $MYDIR
+rmdir $FULLDIR
index 6c4cef14262a934b2cb7ae12e30ea86df257f196..49b97d3ffbf2d6442ac2ca9bd4191b9649c17f48 100644 (file)
@@ -84,4 +84,4 @@ dirs -c
 dirs
 
 # this is for the benefit of pure coverage
-cd $MYDIR
+cd "$MYDIR"
diff --git a/tests/dstack.tests~ b/tests/dstack.tests~
new file mode 100644 (file)
index 0000000..6c4cef1
--- /dev/null
@@ -0,0 +1,87 @@
+export LC_ALL=C
+export LANG=C
+
+dirs -c
+# error -- nonexistant directory
+pushd /tmp/xxx-notthere
+
+# errors -- empty stack
+pushd
+popd
+
+# errors -- bad numeric arguments -- should not cause the script to exit
+pushd -m
+popd -m
+dirs -m
+dirs 7
+
+MYDIR=$PWD
+unalias cd 2>/dev/null
+
+unalias -a
+
+command cd -P /
+command pwd -P # better be `/'
+
+case "$OLDPWD" in
+$MYDIR)        echo ok ;;
+*)     echo oops -- bad \$OLDPWD ;;
+esac
+
+pushd /usr
+echo $PWD $OLDPWD
+dirs
+echo ${DIRSTACK[@]}
+
+# this should not change the directory stack at all
+pushd -n +0
+dirs
+
+popd
+pushd /usr
+
+pushd /etc
+dirs
+dirs -l
+dirs -v
+
+# two consecutive `pushd's should swap the top two stack elements, then
+# swap them back, leaving the stack intact
+pushd
+pushd
+
+pushd /tmp
+echo ${DIRSTACK[0]} ; dirs +0
+echo ${DIRSTACK[2]} ; dirs +2
+
+# these should be errors, but not affect the directory stack
+dirs +9; dirs -9
+pushd +9 ; pushd -9
+popd +9 ; popd -9
+
+popd -n +2
+dirs
+echo ${DIRSTACK[@]}
+
+pushd -n /usr
+echo $PWD
+dirs
+echo ${DIRSTACK[@]}
+
+builtin pwd
+
+DIRSTACK[1]=/bin
+dirs
+
+builtin pwd
+popd +2
+builtin pwd -L
+pushd -1
+dirs
+echo ${DIRSTACK[0]}
+
+dirs -c
+dirs
+
+# this is for the benefit of pure coverage
+cd $MYDIR
index 51e33ee73d3c6e2c062d519e31ebfc18ff9dd88e..c12fcaa2208198e424ae68cdcb2783d4d0870ce2 100644 (file)
@@ -358,7 +358,7 @@ recho "${x#*(a|b)cd}"
 
 # this is for the benefit of pure coverage, so it writes the pcv file
 # in the right place
-builtin cd $MYDIR
+builtin cd "$MYDIR"
 
 ${THIS_SH} ./extglob1.sub
 
diff --git a/tests/extglob.tests~ b/tests/extglob.tests~
new file mode 100644 (file)
index 0000000..51e33ee
--- /dev/null
@@ -0,0 +1,365 @@
+# test the ksh-like extended globbing features: [!@*?+](patlist)
+
+shopt -s extglob
+
+expect()
+{
+       echo expect "$@"
+}
+
+case "/dev/udp/129.22.8.102/45" in
+/dev/@(tcp|udp)/*/*)   echo ok 1;;
+*)             echo bad 1;;
+esac
+
+# valid numbers
+case 12 in
+0|[1-9]*([0-9]))       echo ok 2;;
+*)                     echo bad 2;;
+esac
+
+case 12abc in
+0|[1-9]*([0-9]))       echo bad 3;;
+*)                     echo ok 3;;
+esac
+
+case 1 in
+0|[1-9]*([0-9]))       echo ok 4;;
+*)                     echo bad 4;;
+esac
+
+# octal numbers
+case 07 in
++([0-7]))              echo ok 5;;
+*)                     echo bad 5;;
+esac
+
+case 0377 in
++([0-7]))              echo ok 6;;
+*)                     echo bad 6;;
+esac
+
+case 09 in
++([0-7]))              echo bad 7;;
+*)                     echo ok 7;;
+esac
+
+# stuff from korn's book
+case paragraph in
+para@(chute|graph))    echo ok 8;;
+*)                     echo bad 8;;
+esac
+
+case paramour in
+para@(chute|graph))    echo bad 9;;
+*)                     echo ok 9;;
+esac
+
+case para991 in
+para?([345]|99)1)      echo ok 10;;
+*)                     echo bad 10;;
+esac
+
+case para381 in
+para?([345]|99)1)      echo bad 11;;
+*)                     echo ok 11;;
+esac
+
+case paragraph in
+para*([0-9]))          echo bad 12;;
+*)                     echo ok 12;;
+esac
+
+case para in
+para*([0-9]))          echo ok 13;;
+*)                     echo bad 13;;
+esac
+
+case para13829383746592 in
+para*([0-9]))          echo ok 14;;
+*)                     echo bad 14;;
+esac
+
+case paragraph in
+para*([0-9]))          echo bad 15;;
+*)                     echo ok 15;;
+esac
+
+case para in
+para+([0-9]))          echo bad 16;;
+*)                     echo ok 16;;
+esac
+
+case para987346523 in
+para+([0-9]))          echo ok 17;;
+*)                     echo bad 17;;
+esac
+
+case paragraph in
+para!(*.[0-9]))                echo ok 18;;
+*)                     echo bad 18;;
+esac
+
+case para.38 in
+para!(*.[0-9]))                echo ok 19;;
+*)                     echo bad 19;;
+esac
+
+case para.graph in
+para!(*.[0-9]))                echo ok 20;;
+*)                     echo bad 20;;
+esac
+
+case para39 in
+para!(*.[0-9]))                echo ok 21;;
+*)                     echo bad 21;;
+esac
+
+# tests derived from those in rosenblatt's korn shell book
+
+case "" in
+*(0|1|3|5|7|9))                echo ok 22;;
+*)                     echo bad 22;
+esac
+
+case 137577991 in
+*(0|1|3|5|7|9))                echo ok 23;;
+*)                     echo bad 23;
+esac
+
+case 2468 in
+*(0|1|3|5|7|9))                echo bad 24;;
+*)                     echo ok 24;
+esac
+
+case file.c in
+*.c?(c))               echo ok 25;;
+*)                     echo bad 25;;
+esac
+
+case file.C in
+*.c?(c))               echo bad 26;;
+*)                     echo ok 26;;
+esac
+
+case file.cc in
+*.c?(c))               echo ok 27;;
+*)                     echo bad 27;;
+esac
+
+case file.ccc in
+*.c?(c))               echo bad 28;;
+*)                     echo ok 28;;
+esac
+
+case parse.y in
+!(*.c|*.h|Makefile.in|config*|README)) echo ok 29;;
+*)                     echo bad 29;;
+esac
+
+case shell.c in
+!(*.c|*.h|Makefile.in|config*|README)) echo bad 30;;
+*)                     echo ok 30;;
+esac
+
+case Makefile in
+!(*.c|*.h|Makefile.in|config*|README)) echo ok 31;;
+*)                     echo bad 31;;
+esac
+
+case "VMS.FILE;1" in
+*\;[1-9]*([0-9]))      echo ok 32;;
+*)                     echo bad 32;;
+esac
+
+case "VMS.FILE;0" in
+*\;[1-9]*([0-9]))      echo bad 33;;
+*)                     echo ok 33;;
+esac
+case "VMS.FILE;" in
+*\;[1-9]*([0-9]))      echo bad 34;;
+*)                     echo ok 34;;
+esac
+case "VMS.FILE;139" in
+*\;[1-9]*([0-9]))      echo ok 35;;
+*)                     echo bad 35;;
+esac
+case "VMS.FILE;1N" in
+*\;[1-9]*([0-9]))      echo bad 36;;
+*)                     echo ok 36;;
+esac
+
+# tests derived from the pd-ksh test suite
+
+MYDIR=$PWD      # save where we are
+
+TESTDIR=/tmp/eglob-test-$$
+mkdir $TESTDIR
+builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; }
+rm -rf *
+
+touch abcx abcz bbc
+expect '!([*)*'
+echo !([*)*
+
+expect '+(a|b[)*'
+echo +(a|b[)*
+
+expect '[a*(]*z'
+echo [a*(]*)z
+
+rm -f abcx abcz bbc
+
+touch abc
+
+expect '+()c'
+echo +()c
+expect '+()x'
+echo +()x
+expect abc
+echo +(*)c
+expect '+(*)x'
+echo +(*)x
+
+# extended globbing should not be performed on the output of substitutions
+x='@(*)'
+expect '@(*)'
+echo $x
+
+expect 'no-file+(a|b)stuff'
+echo no-file+(a|b)stuff
+expect 'no-file+(a*(c)|b)stuff'
+echo no-file+(a*(c)|b)stuff
+
+touch abd acd
+
+expect 'abd acd'
+echo a+(b|c)d
+
+expect 'acd'
+echo a!(@(b|B))d
+
+expect 'abd'
+echo a[b*(foo|bar)]d
+
+# simple kleene star tests
+expect no
+case foo in *(a|b[)) echo yes;; *) echo no;; esac
+
+expect yes
+case foo in *(a|b[)|f*) echo yes;; *) echo no;; esac
+
+# this doesn't work right yet; it is an incorrectly formed pattern
+expect yes
+case '*(a|b[)' in *(a|b[)) echo yes;; *) echo no;; esac
+
+# check extended globbing in pattern removal -- these don't work right yet
+x=abcdef
+
+expect '1: bcdef'
+echo 1: ${x#+(a|abc)}
+expect '2: def'
+echo 2: ${x##+(a|abc)}
+expect '3: abcde'
+echo 3: ${x%+(def|f)}
+expect '4: abc'
+echo 4: ${x%%+(f|def)}
+
+# these work ok
+
+expect '5: ef'
+echo 5: ${x#*(a|b)cd}
+expect '6: ef'
+echo 6: "${x#*(a|b)cd}"
+expect '7: abcdef'
+echo 7: ${x#"*(a|b)cd"}
+
+# More tests derived from a bug report concerning extended glob patterns
+# following a *
+builtin cd $TESTDIR || { echo $0: cannot cd to $TESTDIR >&2 ; exit 1; }
+rm -rf *
+
+touch ab abcdef abef abcfef
+
+expect 'ab abef'
+echo ab*(e|f)
+
+expect 'abcfef abef'
+echo ab?*(e|f)
+
+expect abcdef
+echo ab*d+(e|f)
+
+expect 'ab abcdef abcfef abef'
+echo ab**(e|f)
+
+expect 'abcdef abcfef abef'
+echo ab*+(e|f)
+
+case 'abcfefg' in
+ab**(e|f))     echo ok 37;;
+*)             echo bad 37;;
+esac
+
+case 'abcfefg' in
+ab**(e|f)g)    echo ok 38;;
+*a)            echo bad 38;;
+esac
+
+case ab in
+ab*+(e|f))     echo bad 39;;
+*)             echo ok 39;;
+esac
+
+case abef in
+ab***ef)       echo ok 40;;
+*)             echo bad 40;;
+esac
+
+case abef in
+ab**)          echo ok 41;;
+*)             echo bad 41;;
+esac
+
+# bug in all versions up to and including bash-2.05b
+case "123abc" in
+*?(a)bc)       echo ok 42;;
+*)             echo bad 42;;
+esac
+
+# clean up and do the next one
+
+builtin cd /
+rm -rf $TESTDIR
+
+mkdir $TESTDIR
+builtin cd $TESTDIR
+
+LC_COLLATE=C # have to set this; it affects the sorting 
+touch a.b a,b a:b a-b a\;b a\ b a_b
+
+echo a[^[:alnum:]]b
+echo a[-.,:\;\ _]b
+
+echo a@([^[:alnum:]])b
+echo a@([-.,:; _])b
+echo a@([.])b
+echo a@([^.])b
+echo a@([^x])b
+echo a+([^[:alnum:]])b
+
+echo a@(.|[^[:alnum:]])b
+
+builtin cd /
+rm -rf $TESTDIR
+
+x=abcdef
+recho "${x#*(a|b)cd}"
+
+# this is for the benefit of pure coverage, so it writes the pcv file
+# in the right place
+builtin cd $MYDIR
+
+${THIS_SH} ./extglob1.sub
+
+exit 0
index 3beec9e861ecb0c997b3141a4da21a1d846bc8c3..bf65a9eacbdcdd4680de6b4a2bb460944eb68825 100644 (file)
@@ -33,5 +33,5 @@ case . in
 *)                     echo bad 3;;
 esac
 
-cd $MYDIR
+cd "$MYDIR"
 rm -rf $GDIR
diff --git a/tests/extglob1.sub~ b/tests/extglob1.sub~
new file mode 100644 (file)
index 0000000..3beec9e
--- /dev/null
@@ -0,0 +1,37 @@
+MYDIR=$PWD
+
+: ${TMPDIR:=/tmp}
+GDIR=$TMPDIR/gtest-$$
+
+shopt -s extglob
+
+mkdir $GDIR || exit 1
+cd $GDIR || exit 1
+
+touch a.c
+
+echo +([[:alpha:].])
+echo +([[:alpha:].])+([[:alpha:].])
+echo *([[:alpha:].])
+echo *([[:alpha:].])*([[:alpha:].])
+
+echo ?([[:alpha:].])?([[:alpha:].])?([[:alpha:].])
+echo @([[:alpha:].])@([[:alpha:].])@([[:alpha:].])
+
+case . in
+!([[:alpha:].]) )      echo bad 1;;
+*)                     echo ok 1;;
+esac
+
+case . in
+?([[:alpha:].]) )      echo ok 2;;
+*)                     echo bad 2;;
+esac
+
+case . in
+@([[:alpha:].]) )      echo ok 3;;
+*)                     echo bad 3;;
+esac
+
+cd $MYDIR
+rm -rf $GDIR
index 5c5dcc4987582017c99d1b46ca4166ee305a3c05..0054cda858ea09dd44a5b830a26d22f25e3aece9 100644 (file)
@@ -27,7 +27,7 @@ do
        *.orig|*~) ;;
        run-dollars|run-execscript|run-func|run-getopts|run-heredoc) echo $x ; sh $x ;;
        run-ifs-tests|run-input-test|run-invert|run-more-exp|run-nquote) echo $x ; sh $x ;;
-       run-ifs-0posix|run-posix2|run-posixpat) echo $x ; sh $x ;;
+       run-ifs-posix|run-posix2|run-posixpat) echo $x ; sh $x ;;
        run-precedence|run-quote|run-read|run-rhs-exp|run-strip|run-tilde) echo $x ; sh $x ;;
        *)      ;;
        esac
diff --git a/tests/run-minimal~ b/tests/run-minimal~
new file mode 100644 (file)
index 0000000..5c5dcc4
--- /dev/null
@@ -0,0 +1,36 @@
+#! /bin/sh
+#
+# run-minimal - a version of run-all for shells configured with
+#              --enable-minimal-config
+#
+PATH=.:$PATH   # just to get the right version of printenv
+export PATH
+
+# unset BASH_ENV only if it is set
+[ "${BASH_ENV+set}" = "set" ] && unset BASH_ENV
+# ditto for SHELLOPTS
+#[ "${SHELLOPTS+set}" = "set" ] && unset SHELLOPTS
+
+: ${THIS_SH:=../bash}
+export THIS_SH
+
+${THIS_SH} ./version.mini
+
+rm -f /tmp/xx
+
+echo Testing ${THIS_SH}
+echo Any output from any test, unless otherwise noted, indicates a possible anomaly
+for x in run-*
+do
+       case $x in
+       $0)     ;;
+       *.orig|*~) ;;
+       run-dollars|run-execscript|run-func|run-getopts|run-heredoc) echo $x ; sh $x ;;
+       run-ifs-tests|run-input-test|run-invert|run-more-exp|run-nquote) echo $x ; sh $x ;;
+       run-ifs-0posix|run-posix2|run-posixpat) echo $x ; sh $x ;;
+       run-precedence|run-quote|run-read|run-rhs-exp|run-strip|run-tilde) echo $x ; sh $x ;;
+       *)      ;;
+       esac
+done
+
+exit 0
index f7d05bb2993104cb6bfe091d388e89301b7d4a9f..493f4aa1e30b9ee7f8bc353388c53fed3246dc5b 100644 (file)
@@ -1,4 +1,4 @@
 echo warning: some of these tests will fail if you do not have UTF-8 >&2
-echo warning: locales installed on your system
+echo warning: locales installed on your system >&2
 ${THIS_SH} ./nquote4.tests 2>&1 | grep -v '^expect' > /tmp/xx
 diff /tmp/xx nquote4.right && rm -f /tmp/xx
diff --git a/tests/run-nquote4~ b/tests/run-nquote4~
new file mode 100644 (file)
index 0000000..f7d05bb
--- /dev/null
@@ -0,0 +1,4 @@
+echo warning: some of these tests will fail if you do not have UTF-8 >&2
+echo warning: locales installed on your system
+${THIS_SH} ./nquote4.tests 2>&1 | grep -v '^expect' > /tmp/xx
+diff /tmp/xx nquote4.right && rm -f /tmp/xx
index 9f5478082954e0fcc1972bd27b2097de2bb31873..3b3276cf34f875ee839486b4f5ac832d6dbe077c 100644 (file)
@@ -38,7 +38,9 @@
 
 #include <stdio.h>
 #include "chartypes.h"
-#include <pwd.h>
+#if defined (HAVE_PWD_H)
+#  include <pwd.h>
+#endif
 #include "bashansi.h"
 #include "bashintl.h"
 
@@ -4232,7 +4234,8 @@ void
 sv_globignore (name)
      char *name;
 {
-  setup_glob_ignore (name);
+  if (privileged_mode == 0)
+    setup_glob_ignore (name);
 }
 
 #if defined (READLINE)
index e47e5bee87966ed111c458b8a2449031c382dd6f..21fffc7148ef4fc34bb7b92dae6f588d76edacf7 100644 (file)
@@ -38,7 +38,9 @@
 
 #include <stdio.h>
 #include "chartypes.h"
-#include <pwd.h>
+#if defined (HAVE_PWD_H)
+#  include <pwd.h>
+#endif
 #include "bashansi.h"
 #include "bashintl.h"
 
@@ -1912,11 +1914,7 @@ make_local_variable (name)
     }
 
   if (old_var == 0)
-#if 0
-    new_var = bind_variable_internal (name, "", vc->table, HASH_NOSRCH, 0);
-#else
     new_var = make_new_variable (name, vc->table);
-#endif
   else
     {
       new_var = make_new_variable (name, vc->table);