procmgmt: Tidy header includes
[openafs.git] / src / procmgmt / procmgmt_unix.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12 #include <afs/stds.h>
13
14 #include <roken.h>
15
16 #include "procmgmt.h"
17 #include "pmgtprivate.h"
18
19
20 /* -----------------  Processes  ---------------- */
21
22
23 /*
24  * pmgt_ProcessSpawnVE() -- Spawn a process (Unix fork()/execve() semantics)
25  *
26  *     Returns pid of the child process ((pid_t)-1 on failure with errno set).
27  *
28  *     Notes: A senvp value of NULL results in Unix fork()/execv() semantics.
29  *            Open files are not inherited, except stdin, stdout, and stderr.
30  *            If child fails to exec() spath, its exit code is estatus.
31  *
32  * ASSUMPTIONS: sargv[0] is the same as spath (or its last component).
33  */
34 pid_t
35 pmgt_ProcessSpawnVE(const char *spath, char *sargv[], char *senvp[],
36                     int estatus)
37 {
38     pid_t pid;
39
40     /* create child process to exec spath */
41     if ((pid = fork()) == 0) {
42         /* child process */
43         int i;
44
45         /* close random fd's above stderr */
46         for (i = 3; i < 64; i++) {
47             close(i);
48         }
49
50         if (senvp) {
51             execve(spath, sargv, senvp);
52         } else {
53             execv(spath, sargv);
54         }
55
56         /* this point is only reached if exec() failed */
57         exit(estatus);
58     } else {
59         /* parent process */
60         return pid;
61     }
62 }