1 /****************************************************************************
2 **
3 ** Copyright (C) 2019 Intel Corporation.
4 **
5 ** Permission is hereby granted, free of charge, to any person obtaining a copy
6 ** of this software and associated documentation files (the "Software"), to deal
7 ** in the Software without restriction, including without limitation the rights
8 ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 ** copies of the Software, and to permit persons to whom the Software is
10 ** furnished to do so, subject to the following conditions:
11 **
12 ** The above copyright notice and this permission notice shall be included in
13 ** all copies or substantial portions of the Software.
14 **
15 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 ** THE SOFTWARE.
22 **
23 ****************************************************************************/
24 
25 #ifndef FORKFD_H
26 #define FORKFD_H
27 
28 #include <fcntl.h>
29 #include <stdint.h>
30 #include <sys/wait.h>
31 #include <unistd.h> // to get the POSIX flags
32 
33 #if _POSIX_SPAWN > 0
34 #  include <spawn.h>
35 #endif
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 #define FFD_CLOEXEC             1
42 #define FFD_NONBLOCK            2
43 #define FFD_USE_FORK            4
44 
45 #define FFD_CHILD_PROCESS (-2)
46 
47 #define FFDW_NOHANG             1       /* WNOHANG */
48 #define FFDW_NOWAIT             2       /* WNOWAIT */
49 
50 struct forkfd_info {
51     int32_t code;
52     int32_t status;
53 };
54 
55 int forkfd(int flags, pid_t *ppid);
56 int forkfd_wait4(int ffd, struct forkfd_info *info, int options, struct rusage *rusage);
forkfd_wait(int ffd,struct forkfd_info * info,struct rusage * rusage)57 static inline int forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage)
58 {
59     return forkfd_wait4(ffd, info, 0, rusage);
60 }
61 int forkfd_close(int ffd);
62 
63 #if _POSIX_SPAWN > 0
64 /* only for spawnfd: */
65 #  define FFD_SPAWN_SEARCH_PATH   O_RDWR
66 
67 int spawnfd(int flags, pid_t *ppid, const char *path, const posix_spawn_file_actions_t *file_actions,
68             posix_spawnattr_t *attrp, char *const argv[], char *const envp[]);
69 #endif
70 
71 #ifdef __cplusplus
72 }
73 #endif
74 
75 #endif // FORKFD_H
76