procmgmt: Introduce spawnprocve_sig
authorMarc Dionne <marc.c.dionne@gmail.com>
Sat, 22 Sep 2012 19:29:52 +0000 (15:29 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Tue, 1 Oct 2013 14:10:58 +0000 (07:10 -0700)
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 <shadow@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/procmgmt/procmgmt.h
src/procmgmt/procmgmt_unix.c

index 5f151aa..e4aa860 100644 (file)
@@ -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 */
index ab57639..e367541 100644 (file)
  *            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 {