diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 5a145526..249b443d 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -14531,3 +14531,21 @@ config-top.h Makefile.in - pathexp.o: add dependencies on libintl.h. Reported by Ross Burton + + 12/1 + ---- +lib/sh/ufuncs.c + - fsleep: add blocking and releasing SIGCHLD using sigprocmask + around call to select(2) even if pselect(2) is not available + + 12/3 + ---- +execute_cmd.c + - coproc_setstatus: new utility function, take a pointer to a coproc + and a status and mark the coproc as dead and having been reaped + with that status. Used by child processes who want to invalidate + the coproc's pid + - coproc_closeall,cpl_closeall: call coproc_setstatus (to invalidate + pid) after closing a coproc (invalidating FDs). Fixes issue with + spurious warning reported by Tobias Hoffmann + diff --git a/execute_cmd.c b/execute_cmd.c index 8a11401b..b22d6d6c 100644 --- a/execute_cmd.c +++ b/execute_cmd.c @@ -183,6 +183,7 @@ static char *getinterp __P((char *, int, int *)); static void initialize_subshell __P((void)); static int execute_in_subshell __P((COMMAND *, int, int, int, struct fd_bitmap *)); #if defined (COPROCESS_SUPPORT) +static void coproc_setstatus __P((struct coproc *, int)); static int execute_coproc __P((COMMAND *, int, int, struct fd_bitmap *)); #endif @@ -1847,7 +1848,10 @@ cpl_closeall () struct cpelement *cpe; for (cpe = coproc_list.head; cpe; cpe = cpe->next) - coproc_close (cpe->coproc); + { + coproc_close (cpe->coproc); + coproc_setstatus (cpe->coproc, 0); /* fake zero status */ + } } static void @@ -2048,6 +2052,7 @@ coproc_closeall () cpl_closeall (); #else coproc_close (&sh_coproc); /* XXX - will require changes for multiple coprocs */ + coproc_setstatus (&sh_coproc, 0); /* fake zero status */ #endif } @@ -2142,6 +2147,21 @@ coproc_fdrestore (cp) cp->c_wfd = cp->c_wsave; } +static void +coproc_setstatus (cp, status) + struct coproc *cp; + int status; +{ + cp->c_lock = 4; + cp->c_status = status; + cp->c_flags |= COPROC_DEAD; + cp->c_flags &= ~COPROC_RUNNING; + /* Don't dispose the coproc or unset the COPROC_XXX variables because + this is executed in a signal handler context. Wait until coproc_reap + takes care of it. */ + cp->c_lock = 0; +} + void coproc_pidchk (pid, status) pid_t pid; @@ -2160,16 +2180,7 @@ coproc_pidchk (pid, status) cp = getcoprocbypid (pid); #endif if (cp) - { - cp->c_lock = 4; - cp->c_status = status; - cp->c_flags |= COPROC_DEAD; - cp->c_flags &= ~COPROC_RUNNING; - /* Don't dispose the coproc or unset the COPROC_XXX variables because - this is executed in a signal handler context. Wait until coproc_reap - takes care of it. */ - cp->c_lock = 0; - } + coproc_setstatus (cp, status); } pid_t diff --git a/lib/sh/ufuncs.c b/lib/sh/ufuncs.c index 9a146bb7..ad9284cc 100644 --- a/lib/sh/ufuncs.c +++ b/lib/sh/ufuncs.c @@ -98,21 +98,23 @@ fsleep(sec, usec) unsigned int sec, usec; { int e, r; + sigset_t blocked_sigs, prevmask; #if defined (HAVE_PSELECT) - sigset_t blocked_sigs; struct timespec ts; #else struct timeval tv; #endif -#if defined (HAVE_PSELECT) sigemptyset (&blocked_sigs); # if defined (SIGCHLD) sigaddset (&blocked_sigs, SIGCHLD); # endif + +#if defined (HAVE_PSELECT) ts.tv_sec = sec; ts.tv_nsec = usec * 1000; #else + sigemptyset (&prevmask); tv.tv_sec = sec; tv.tv_usec = usec; #endif /* !HAVE_PSELECT */ @@ -122,7 +124,9 @@ fsleep(sec, usec) #if defined (HAVE_PSELECT) r = pselect(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &ts, &blocked_sigs); #else + sigprocmask (SIG_SETMASK, &blocked_sigs, &prevmask); r = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv); + sigprocmask (SIG_SETMASK, &prevmask, NULL); #endif e = errno; if (r < 0 && errno == EINTR)