commit bash-20081002 snapshot

This commit is contained in:
Chet Ramey
2011-12-07 09:29:49 -05:00
parent 10a4e4150a
commit e77a3058b6
54 changed files with 1325 additions and 355 deletions
+73
View 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>
+93 -2
View 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
+1 -1
View 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;
+17 -11
View 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
+6 -6
View 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
+14 -2
View 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
+1 -1
View 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
+11 -12
View 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;
+36 -15
View 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
+8 -4
View 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.
+21 -7
View 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
+2 -2
View 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.
+4
View 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}.
+6 -2
View 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 ();
+15 -4
View 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;
+7
View 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
+81 -40
View 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;
+4 -3
View 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
+3 -3
View 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
+5 -5
View 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
+2
View 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);
+15 -14
View 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 ()
{
+3 -1
View 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. */
+19 -16
View 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.
+7
View 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;
+13
View 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;
+10 -6
View 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);
+33 -97
View 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 */
+47
View 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);
}
+129 -14
View 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)
@@ -40,13 +40,14 @@
# 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);
}
+1 -1
View File
@@ -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
+29 -30
View File
@@ -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");
}
+1 -1
View File
@@ -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
+15 -13
View File
@@ -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)
+1
View File
@@ -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)
+14 -12
View File
@@ -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)
+3 -1
View File
@@ -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>
+2
View File
@@ -53,6 +53,8 @@
#include "builtins/getopt.h"
#include "builtins/common.h"
#include "builtins/builtext.h"
#include <tilde/tilde.h>
#include <glob/strmatch.h>
+1 -1
View File
@@ -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);
}
+15 -15
View File
@@ -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])
+1 -1
View File
@@ -10,5 +10,5 @@ cd $DIR
pwd
echo $PWD
cd $MYDIR
cd "$MYDIR"
rmdir $FULLDIR
+14
View File
@@ -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
+1 -1
View File
@@ -84,4 +84,4 @@ dirs -c
dirs
# this is for the benefit of pure coverage
cd $MYDIR
cd "$MYDIR"
+87
View File
@@ -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
+1 -1
View 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
+365
View File
@@ -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
+1 -1
View File
@@ -33,5 +33,5 @@ case . in
*) echo bad 3;;
esac
cd $MYDIR
cd "$MYDIR"
rm -rf $GDIR
+37
View File
@@ -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
+1 -1
View 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
+36
View File
@@ -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
+1 -1
View 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
+4
View File
@@ -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
+5 -2
View 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)
+3 -5
View 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);