Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Pfaff <tpfaff@gmx.net>2003-02-04 22:49:39 +0300
committerThomas Pfaff <tpfaff@gmx.net>2003-02-04 22:49:39 +0300
commit5ae9331a3202ba2c9f1087b4d5d40b35b89753ee (patch)
tree180cb6fb7f681d6eb44afe8a2c36e2af39a638f3
parent53c384f2069e717e72725800fe7da28a5d826f78 (diff)
* 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.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/syscalls.cc32
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 <tpfaff@gmx.net>
+
+ * 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 <corinna@vinschen.de>
* 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;
}