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