1 /* ISC license. */
2 
3 #ifndef SKALIBS_EXEC_H
4 #define SKALIBS_EXEC_H
5 
6 #include <stddef.h>
7 
8 #include <skalibs/posixplz.h>
9 #include <skalibs/env.h>
10 #include <skalibs/gccattributes.h>
11 
12 
13 extern void xexecvep (char const *, char const *const *, char const *const *, char const *) gccattr_noreturn ;
14 extern void xexecvep_loose (char const *, char const *const *, char const *const *, char const *) gccattr_noreturn ;
15 
16 
17  /*
18     Direct execution with PATH (calls execvep).
19     (was called pathexec_run in earlier skalibs versions)
20     a for provided file name (default: argv[0])
21     e for provided envp (default: environ)
22     foo0 exits 0 if argv[0] is NULL
23     xfoo dies if the exec fails
24  */
25 
26 extern void exec_ae (char const *, char const *const *, char const *const *) ;
27 #define exec_a(file, argv) exec_ae(file, (argv), (char const *const *)environ)
28 #define exec_e(argv, envp) exec_ae((argv)[0], (argv), envp)
29 #define exec(argv) exec_a((argv)[0], (argv))
30 
31 extern void xexec_ae (char const *, char const *const *, char const *const *) gccattr_noreturn ;
32 #define xexec_a(file, argv) xexec_ae(file, (argv), (char const *const *)environ)
33 #define xexec_e(argv, envp) xexec_ae((argv)[0], (argv), envp)
34 #define xexec(argv) xexec_a((argv)[0], (argv))
35 
36 extern void exec0_ae (char const *, char const *const *, char const *const *) ;
37 #define exec0_a(file, argv) exec0_ae(file, (argv), (char const *const *)environ)
38 #define exec0_e(argv, envp) exec0_ae((argv)[0], (argv), envp)
39 #define exec0(argv) exec0_a((argv)[0], (argv))
40 
41 extern void xexec0_ae (char const *, char const *const *, char const *const *) gccattr_noreturn ;
42 #define xexec0_a(file, argv) xexec0_ae(file, (argv), (char const *const *)environ)
43 #define xexec0_e(argv, envp) xexec0_ae((argv)[0], (argv), envp)
44 #define xexec0(argv) xexec0_a((argv)[0], (argv))
45 
46 
47  /*
48     Execution with environment modifications : env_merge and exec.
49     (was called pathexec in earlier skalibs versions)
50     a for provided file name (default: argv[0])
51     e for provided envp (default: environ)
52     f for provided envp *and* length of the envp
53     m for provided modif string plus its length (the length is always needed because the modifs are null-terminated)
54     n for provided modif string, length *and* number of modifs
55  */
56 
57 extern int env_mexec (char const *, char const *) ;
58 
59 extern void mexec_afn (char const *, char const *const *, char const *const *, size_t, char const *, size_t, size_t) ;
60 extern void mexec_afm (char const *, char const *const *, char const *const *, size_t, char const *, size_t) ;
61 extern void mexec_af (char const *, char const *const *, char const *const *, size_t) ;
62 
63 #define mexec_aen(file, argv, envp, modif, modiflen, modifn) mexec_afn(file, argv, envp, env_len(envp), modif, modiflen, modifn)
64 #define mexec_aem(file, argv, envp, modif, modiflen) mexec_afm(file, argv, envp, env_len(envp), modif, modiflen)
65 #define mexec_ae(file, argv, envp) mexec_af(file, argv, (envp), env_len(envp))
66 
67 #define mexec_an(file, argv, modif, modiflen, modifn) mexec_aen(file, argv, (char const *const *)environ, modif, modiflen, modifn)
68 #define mexec_am(file, argv, modif, modiflen) mexec_aem(file, argv, (char const *const *)environ, modif, modiflen)
69 #define mexec_a(file, argv) mexec_ae(file, (argv), (char const *const *)environ)
70 
71 #define mexec_fn(argv, envp, envlen, modif, modiflen, modifn) mexec_afn((argv)[0], (argv), envp, envlen, modif, modiflen, modifn)
72 #define mexec_fm(argv, envp, envlen, modif, modiflen) mexec_afm((argv)[0], (argv), envp, envlen, modif, modiflen)
73 #define mexec_f(argv, envp, envlen) mexec_af((argv)[0], (argv), envp, envlen)
74 
75 #define mexec_en(argv, envp, modif, modiflen, modifn) mexec_aen((argv)[0], (argv), envp, modif, modiflen, modifn)
76 #define mexec_em(argv, envp, modif, modiflen) mexec_aem((argv)[0], (argv), envp, modif, modiflen)
77 #define mexec_e(argv, envp) mexec_ae((argv)[0], (argv), envp)
78 
79 #define mexec_n(argv, modif, modiflen, modifn) mexec_an((argv)[0], (argv), modif, modiflen, modifn)
80 #define mexec_m(argv, modif, modiflen) mexec_am((argv)[0], (argv), modif, modiflen)
81 #define mexec(argv) mexec_a((argv)[0], (argv))
82 
83 extern void mexec0_afn (char const *, char const *const *, char const *const *, size_t, char const *, size_t, size_t) ;
84 extern void mexec0_afm (char const *, char const *const *, char const *const *, size_t, char const *, size_t) ;
85 extern void mexec0_af (char const *, char const *const *, char const *const *, size_t) ;
86 
87 #define mexec0_aen(file, argv, envp, modif, modiflen, modifn) mexec0_afn(file, argv, envp, env_len(envp), modif, modiflen, modifn)
88 #define mexec0_aem(file, argv, envp, modif, modiflen) mexec0_afm(file, argv, envp, env_len(envp), modif, modiflen)
89 #define mexec0_ae(file, argv, envp) mexec0_af(file, argv, (envp), env_len(envp))
90 
91 #define mexec0_an(file, argv, modif, modiflen, modifn) mexec0_aen(file, argv, (char const *const *)environ, modif, modiflen, modifn)
92 #define mexec0_am(file, argv, modif, modiflen) mexec0_aem(file, argv, (char const *const *)environ, modif, modiflen)
93 #define mexec0_a(file, argv) mexec0_ae(file, (argv), (char const *const *)environ)
94 
95 #define mexec0_fn(argv, envp, envlen, modif, modiflen, modifn) mexec0_afn((argv)[0], (argv), envp, envlen, modif, modiflen, modifn)
96 #define mexec0_fm(argv, envp, envlen, modif, modiflen) mexec0_afm((argv)[0], (argv), envp, envlen, modif, modiflen)
97 #define mexec0_f(argv, envp, envlen) mexec0_af((argv)[0], (argv), envp, envlen)
98 
99 #define mexec0_en(argv, envp, modif, modiflen, modifn) mexec0_aen((argv)[0], (argv), envp, modif, modiflen, modifn)
100 #define mexec0_em(argv, envp, modif, modiflen) mexec0_aem((argv)[0], (argv), envp, modif, modiflen)
101 #define mexec0_e(argv, envp) mexec0_ae((argv)[0], (argv), envp)
102 
103 #define mexec0_n(argv, modif, modiflen, modifn) mexec0_an((argv)[0], (argv), modif, modiflen, modifn)
104 #define mexec0_m(argv, modif, modiflen) mexec0_am((argv)[0], (argv), modif, modiflen)
105 #define mexec0(argv) mexec0_a((argv)[0], (argv))
106 
107 extern void xmexec_afn (char const *, char const *const *, char const *const *, size_t, char const *, size_t, size_t) gccattr_noreturn ;
108 extern void xmexec_afm (char const *, char const *const *, char const *const *, size_t, char const *, size_t) gccattr_noreturn ;
109 extern void xmexec_af (char const *, char const *const *, char const *const *, size_t) gccattr_noreturn ;
110 
111 #define xmexec_aen(file, argv, envp, modif, modiflen, modifn) xmexec_afn(file, argv, envp, env_len(envp), modif, modiflen, modifn)
112 #define xmexec_aem(file, argv, envp, modif, modiflen) xmexec_afm(file, argv, envp, env_len(envp), modif, modiflen)
113 #define xmexec_ae(file, argv, envp) xmexec_af(file, argv, (envp), env_len(envp))
114 
115 #define xmexec_an(file, argv, modif, modiflen, modifn) xmexec_aen(file, argv, (char const *const *)environ, modif, modiflen, modifn)
116 #define xmexec_am(file, argv, modif, modiflen) xmexec_aem(file, argv, (char const *const *)environ, modif, modiflen)
117 #define xmexec_a(file, argv) xmexec_ae(file, (argv), (char const *const *)environ)
118 
119 #define xmexec_fn(argv, envp, envlen, modif, modiflen, modifn) xmexec_afn((argv)[0], (argv), envp, envlen, modif, modiflen, modifn)
120 #define xmexec_fm(argv, envp, envlen, modif, modiflen) xmexec_afm((argv)[0], (argv), envp, envlen, modif, modiflen)
121 #define xmexec_f(argv, envp, envlen) xmexec_af((argv)[0], (argv), envp, envlen)
122 
123 #define xmexec_en(argv, envp, modif, modiflen, modifn) xmexec_aen((argv)[0], (argv), envp, modif, modiflen, modifn)
124 #define xmexec_em(argv, envp, modif, modiflen) xmexec_aem((argv)[0], (argv), envp, modif, modiflen)
125 #define xmexec_e(argv, envp) xmexec_ae((argv)[0], (argv), envp)
126 
127 #define xmexec_n(argv, modif, modiflen, modifn) xmexec_an((argv)[0], (argv), modif, modiflen, modifn)
128 #define xmexec_m(argv, modif, modiflen) xmexec_am((argv)[0], (argv), modif, modiflen)
129 #define xmexec(argv) xmexec_a((argv)[0], (argv))
130 
131 extern void xmexec0_afn (char const *, char const *const *, char const *const *, size_t, char const *, size_t, size_t) gccattr_noreturn ;
132 extern void xmexec0_afm (char const *, char const *const *, char const *const *, size_t, char const *, size_t) gccattr_noreturn ;
133 extern void xmexec0_af (char const *, char const *const *, char const *const *, size_t) gccattr_noreturn ;
134 
135 #define xmexec0_aen(file, argv, envp, modif, modiflen, modifn) xmexec0_afn(file, argv, envp, env_len(envp), modif, modiflen, modifn)
136 #define xmexec0_aem(file, argv, envp, modif, modiflen) xmexec0_afm(file, argv, envp, env_len(envp), modif, modiflen)
137 #define xmexec0_ae(file, argv, envp) xmexec0_af(file, argv, (envp), env_len(envp))
138 
139 #define xmexec0_an(file, argv, modif, modiflen, modifn) xmexec0_aen(file, argv, (char const *const *)environ, modif, modiflen, modifn)
140 #define xmexec0_am(file, argv, modif, modiflen) xmexec0_aem(file, argv, (char const *const *)environ, modif, modiflen)
141 #define xmexec0_a(file, argv) xmexec0_ae(file, (argv), (char const *const *)environ)
142 
143 #define xmexec0_fn(argv, envp, envlen, modif, modiflen, modifn) xmexec0_afn((argv)[0], (argv), envp, envlen, modif, modiflen, modifn)
144 #define xmexec0_fm(argv, envp, envlen, modif, modiflen) xmexec0_afm((argv)[0], (argv), envp, envlen, modif, modiflen)
145 #define xmexec0_f(argv, envp, envlen) xmexec0_af((argv)[0], (argv), envp, envlen)
146 
147 #define xmexec0_en(argv, envp, modif, modiflen, modifn) xmexec0_aen((argv)[0], (argv), envp, modif, modiflen, modifn)
148 #define xmexec0_em(argv, envp, modif, modiflen) xmexec0_aem((argv)[0], (argv), envp, modif, modiflen)
149 #define xmexec0_e(argv, envp) xmexec0_ae((argv)[0], (argv), envp)
150 
151 #define xmexec0_n(argv, modif, modiflen, modifn) xmexec0_an((argv)[0], (argv), modif, modiflen, modifn)
152 #define xmexec0_m(argv, modif, modiflen) xmexec0_am((argv)[0], (argv), modif, modiflen)
153 #define xmexec0(argv) xmexec0_a((argv)[0], (argv))
154 
155 #endif
156