diff --git a/bash-4.1-pipe.dif b/bash-4.1-pipe.dif index 3adc211..eeea232 100644 --- a/bash-4.1-pipe.dif +++ b/bash-4.1-pipe.dif @@ -1,6 +1,25 @@ +--- command.h ++++ command.h 2010-08-13 16:48:35.739125676 +0200 +@@ -168,6 +168,7 @@ typedef struct element { + #define CMD_STDIN_REDIR 0x400 /* async command needs implicit flags |= CMD_IGNORE_RETURN; + + begin_unwind_frame ("pipe-file-descriptors"); + lstdin = -1; -+ if (!asynchronous && pipe_out == NO_PIPE && prev > 0) ++#if 1 ++ if (!asynchronous && pipe_out == NO_PIPE && prev > 0 ++ && cmd->type != cm_subshell && ((cmd->flags & CMD_WANT_SUBSHELL) == 0)) + { + lstdin = move_to_high_fd(0, 0, 255); + if (lstdin > 0) @@ -45,10 +66,13 @@ + dup2(prev, 0); + close(prev); + prev = NO_PIPE; -+ stop_pipeline (0, (COMMAND *)NULL); ++ cmd->flags |= CMD_SYNC_PIPE; ++ add_process((char*)0, getpid()); ++ stop_pipeline (0, cmd); + add_unwind_protect (restore_stdin, lstdin); + } + } ++#endif + if (prev >= 0) + add_unwind_protect (close, prev); + @@ -68,3 +92,87 @@ #if defined (JOB_CONTROL) UNBLOCK_CHILD (oset); #endif + ++ if (cmd->flags & CMD_SYNC_PIPE) ++ { ++ addjstatus(cmd, exec_result); ++ cmd->flags &= ~CMD_SYNC_PIPE; ++ } ++ + QUIT; + return (exec_result); + } +--- jobs.c ++++ jobs.c 2010-08-16 15:48:19.479125702 +0200 +@@ -260,7 +260,6 @@ static int processes_in_job __P((int)); + static void realloc_jobs_list __P((void)); + static int compact_jobs_list __P((int)); + static int discard_pipeline __P((PROCESS *)); +-static void add_process __P((char *, pid_t)); + static void print_pipeline __P((PROCESS *, int, int, FILE *)); + static void pretty_print_job __P((int, int, FILE *)); + static void set_current_job __P((int)); +@@ -1065,7 +1064,7 @@ nohup_job (job_index) + if (js.j_jobslots == 0) + return; + +- if (temp = jobs[job_index]) ++ if ((temp = jobs[job_index])) + temp->flags |= J_NOHUP; + } + +@@ -1095,7 +1094,7 @@ discard_pipeline (chain) + /* Add this process to the chain being built in the_pipeline. + NAME is the command string that will be exec'ed later. + PID is the process id of the child. */ +-static void ++void + add_process (name, pid) + char *name; + pid_t pid; +@@ -3396,6 +3395,34 @@ setjstatus (j) + #endif + } + ++ ++void ++addjstatus(COMMAND *deferred, int status) ++{ ++#if defined (ARRAY_VARS) ++ int i; ++ JOB *j; ++ for (j = jobs[(i = 0)]; j && j->deferred != deferred; j = jobs[(++i)]) ++ ; ++ if (!j || !j->deferred) ++ return; ++ j->deferred = (COMMAND*)0; ++ if (status) ++ { ++ PROCESS *p, *l; ++ p = j->pipe; ++ do ++ { ++ l = p; ++ p = p->next; ++ } ++ while (p != j->pipe); ++ l->status = status << 8; ++ } ++ setjstatus(i); ++#endif ++} ++ + void + run_sigchld_trap (nchild) + int nchild; +--- jobs.h ++++ jobs.h 2010-08-16 15:47:22.463125472 +0200 +@@ -177,6 +177,8 @@ extern void save_pipeline __P((int)); + extern void restore_pipeline __P((int)); + extern void start_pipeline __P((void)); + extern int stop_pipeline __P((int, COMMAND *)); ++extern void add_process __P((char *, pid_t)); ++extern void addjstatus __P((COMMAND *, int)); + + extern void delete_job __P((int, int)); + extern void nohup_job __P((int)); diff --git a/bash.changes b/bash.changes index cbf2740..d46970e 100644 --- a/bash.changes +++ b/bash.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Aug 16 15:50:43 CEST 2010 - werner@suse.de + +- A modified version of the pipe patch which should handle + the PIPESTATUS array + ------------------------------------------------------------------- Fri Aug 13 14:19:02 CEST 2010 - werner@suse.de diff --git a/bash.spec b/bash.spec index 4e3cd73..4d64603 100644 --- a/bash.spec +++ b/bash.spec @@ -36,7 +36,7 @@ Suggests: bash-doc = %bash_vers %endif AutoReqProv: on Version: 4.1 -Release: 13 +Release: 14 Summary: The GNU Bourne-Again Shell Url: http://www.gnu.org/software/bash/bash.html Source0: ftp://ftp.gnu.org/gnu/bash/bash-%{bash_vers}.tar.bz2 @@ -104,7 +104,7 @@ Group: Documentation/Man Provides: bash:%{_infodir}/bash.info.gz PreReq: %install_info_prereq Version: 4.1 -Release: 13 +Release: 14 AutoReqProv: on %if %suse_version > 1120 BuildArch: noarch @@ -140,7 +140,7 @@ License: GPLv2+ Summary: Include Files mandatory for Development of bash loadable builtins Group: Development/Languages/C and C++ Version: 4.1 -Release: 13 +Release: 14 AutoReqProv: on %description -n bash-devel @@ -160,7 +160,7 @@ License: GPLv2+ Summary: Loadable bash builtins Group: System/Shells Version: 4.1 -Release: 13 +Release: 14 AutoReqProv: on %description -n bash-loadables @@ -229,7 +229,7 @@ Summary: The Readline Library Group: System/Libraries Provides: bash:/%{_lib}/libreadline.so.%{rl_major} Version: 6.1 -Release: 13 +Release: 14 %if %suse_version > 1020 Recommends: readline-doc = %{version} %endif @@ -260,7 +260,7 @@ Summary: Include Files and Libraries mandatory for Development Group: Development/Libraries/C and C++ Provides: bash:%{_libdir}/libreadline.a Version: 6.1 -Release: 13 +Release: 14 Requires: libreadline6 = %{version} Requires: ncurses-devel %if %suse_version > 1020 @@ -291,7 +291,7 @@ Group: System/Libraries Provides: readline:%{_infodir}/readline.info.gz PreReq: %install_info_prereq Version: 6.1 -Release: 13 +Release: 14 AutoReqProv: on %if %suse_version > 1120 BuildArch: noarch