From 5ae9331a3202ba2c9f1087b4d5d40b35b89753ee Mon Sep 17 00:00:00 2001 From: Thomas Pfaff Date: Tue, 4 Feb 2003 19:49:39 +0000 Subject: [PATCH] * syscalls.cc (struct system_cleanup_args): New struct. (system_cleanup): New function. (system): Use pthread_cleanup_push and _pop to save and restore signal handlers and sigprocmask. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/syscalls.cc | 32 ++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 429000e51..299eec166 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2003-02-04 Thomas Pfaff + + * syscalls.cc (struct system_cleanup_args): New struct. + (system_cleanup): New function. + (system): Use pthread_cleanup_push and _pop to save and restore + signal handlers and sigprocmask. + 2003-02-04 Corinna Vinschen * path.cc (symlink): Create security attributes so that only the diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index dd7d26054..cf16433e1 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1371,6 +1371,21 @@ done: return res; } +struct system_cleanup_args +{ + _sig_func_ptr oldint, oldquit; + sigset_t old_mask; +}; + +static void system_cleanup (void *args) +{ + struct system_cleanup_args *cleanup_args = (struct system_cleanup_args *) args; + + signal (SIGINT, cleanup_args->oldint); + signal (SIGQUIT, cleanup_args->oldquit); + (void) sigprocmask (SIG_SETMASK, &cleanup_args->old_mask, 0); +} + extern "C" int system (const char *cmdstring) { @@ -1382,23 +1397,25 @@ system (const char *cmdstring) sigframe thisframe (mainthread); int res; const char* command[4]; - _sig_func_ptr oldint, oldquit; - sigset_t child_block, old_mask; + struct system_cleanup_args cleanup_args; + sigset_t child_block; if (cmdstring == (const char *) NULL) return 1; - oldint = signal (SIGINT, SIG_IGN); - oldquit = signal (SIGQUIT, SIG_IGN); + cleanup_args.oldint = signal (SIGINT, SIG_IGN); + cleanup_args.oldquit = signal (SIGQUIT, SIG_IGN); sigemptyset (&child_block); sigaddset (&child_block, SIGCHLD); - (void) sigprocmask (SIG_BLOCK, &child_block, &old_mask); + (void) sigprocmask (SIG_BLOCK, &child_block, &cleanup_args.old_mask); command[0] = "sh"; command[1] = "-c"; command[2] = cmdstring; command[3] = (const char *) NULL; + pthread_cleanup_push (system_cleanup, (void *) &cleanup_args); + if ((res = spawnvp (_P_WAIT, "sh", command)) == -1) { // when exec fails, return value should be as if shell @@ -1406,9 +1423,8 @@ system (const char *cmdstring) res = 127; } - signal (SIGINT, oldint); - signal (SIGQUIT, oldquit); - (void) sigprocmask (SIG_SETMASK, &old_mask, 0); + pthread_cleanup_pop (1); + return res; }