From 8bbd117c6f2c60ee43591c806431d5d78489daa3f2709d382c7270811e50b126 Mon Sep 17 00:00:00 2001 From: "Dr. Werner Fink" Date: Mon, 16 Aug 2010 13:51:35 +0000 Subject: [PATCH] . OBS-URL: https://build.opensuse.org/package/show/Base:System/bash?expand=0&rev=50 --- bash-4.1-pipe.dif | 110 +++++++++++++++++++++++++++++++++++++++++++--- bash.changes | 6 +++ 2 files changed, 110 insertions(+), 6 deletions(-) diff --git a/bash-4.1-pipe.dif b/bash-4.1-pipe.dif index 3adc211..f8006f9 100644 --- a/bash-4.1-pipe.dif +++ b/bash-4.1-pipe.dif @@ -1,6 +1,15 @@ --- execute_cmd.c -+++ execute_cmd.c 2010-06-24 09:18:46.858925084 +0200 -@@ -1525,7 +1525,7 @@ static struct cpelement *cpl_search __P( ++++ execute_cmd.c 2010-08-16 15:40:41.975126155 +0200 +@@ -256,6 +256,8 @@ int match_ignore_case = 0; + + struct stat SB; /* used for debugging */ + ++extern void addjstatus(COMMAND *, int); ++ + static int special_builtin_failed; + + static COMMAND *currently_executing_command; +@@ -1525,7 +1527,7 @@ static struct cpelement *cpl_search __P( static struct cpelement *cpl_searchbyname __P((char *)); static void cpl_prune __P((void)); @@ -9,7 +18,7 @@ cplist_t coproc_list = {0, 0, 0}; -@@ -2047,13 +2047,19 @@ execute_coproc (command, pipe_in, pipe_o +@@ -2047,13 +2049,19 @@ execute_coproc (command, pipe_in, pipe_o } #endif @@ -30,14 +39,16 @@ COMMAND *cmd; struct fd_bitmap *fd_bitmap; -@@ -2148,11 +2154,37 @@ execute_pipeline (command, asynchronous, +@@ -2148,15 +2156,52 @@ execute_pipeline (command, asynchronous, /* Now execute the rightmost command in the pipeline. */ if (ignore_return && cmd) cmd->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 +56,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 +82,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