From 6016d2291a3a14777283c0ea5c9c37d761c9e1f6 Mon Sep 17 00:00:00 2001 From: Marc Dionne Date: Sat, 22 Sep 2012 15:29:52 -0400 Subject: [PATCH] procmgmt: Introduce spawnprocve_sig Introduce spawnprocve_sig, a variant of spawnprocve that allows a caller to spawn a process with a specific signal mask. This is useful when we want to set a mask that is different from the current one. It needs to be done after the fork() so that the current thread is not affected. Change-Id: I900c85cb70d22756b78562618b0e853dcedf8235 Reviewed-on: http://gerrit.openafs.org/8749 Reviewed-by: Derrick Brashear Tested-by: BuildBot Reviewed-by: Chas Williams - CONTRACTOR Reviewed-by: Benjamin Kaduk Reviewed-by: Jeffrey Altman --- src/procmgmt/procmgmt.h | 10 +++++++--- src/procmgmt/procmgmt_unix.c | 6 +++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/procmgmt/procmgmt.h b/src/procmgmt/procmgmt.h index 5f151aabf..e4aa860da 100644 --- a/src/procmgmt/procmgmt.h +++ b/src/procmgmt/procmgmt.h @@ -58,6 +58,8 @@ PMGTEXPORT extern size_t pmgt_spawnDataLen; pmgt_ProcessSpawnVEB(spath, sargv, senvp, sdatap, sdatalen) #define spawnprocve(spath, sargv, senvp, estatus) \ pmgt_ProcessSpawnVEB(spath, sargv, senvp, NULL, 0) +#define spawnprocve_sig(spath, sargv, senvp, estatus, mask) \ + pmgt_ProcessSpawnVEB(spath, sargv, senvp, NULL, 0) #define spawnprocv(spath, sargv, estatus) \ pmgt_ProcessSpawnVEB(spath, sargv, NULL, NULL, 0) @@ -177,12 +179,14 @@ extern int pmgt_SignalRaiseRemote(pid_t pid, int signo); /* ----------------- Processes ---------------- */ #define spawnprocve(spath, sargv, senvp, estatus) \ - pmgt_ProcessSpawnVE(spath, sargv, senvp, estatus) + pmgt_ProcessSpawnVE(spath, sargv, senvp, estatus, NULL) +#define spawnprocve_sig(spath, sargv, senvp, estatus, mask) \ + pmgt_ProcessSpawnVE(spath, sargv, senvp, estatus, mask) #define spawnprocv(spath, sargv, estatus) \ - pmgt_ProcessSpawnVE(spath, sargv, NULL, estatus) + pmgt_ProcessSpawnVE(spath, sargv, NULL, estatus, NULL) extern pid_t pmgt_ProcessSpawnVE(const char *spath, char **sargv, - char **senvp, int estatus); + char **senvp, int estatus, sigset_t *mask); #endif /* AFS_NT40_ENV */ diff --git a/src/procmgmt/procmgmt_unix.c b/src/procmgmt/procmgmt_unix.c index ab5763951..e367541cb 100644 --- a/src/procmgmt/procmgmt_unix.c +++ b/src/procmgmt/procmgmt_unix.c @@ -29,11 +29,13 @@ * Open files are not inherited, except stdin, stdout, and stderr. * If child fails to exec() spath, its exit code is estatus. * + * If provided, a signal mask will be set for the spawned process. + * * ASSUMPTIONS: sargv[0] is the same as spath (or its last component). */ pid_t pmgt_ProcessSpawnVE(const char *spath, char *sargv[], char *senvp[], - int estatus) + int estatus, sigset_t *mask) { pid_t pid; @@ -47,6 +49,8 @@ pmgt_ProcessSpawnVE(const char *spath, char *sargv[], char *senvp[], close(i); } + sigprocmask(SIG_SETMASK, mask, NULL); + if (senvp) { execve(spath, sargv, senvp); } else { -- 2.39.5