#define ACK_BYTE '\n'
static struct sockaddr_unix socket_sun;
+static const char *const *executor_argv;
static void propagate_exit_status(int status, const char *what) {
int r;
prepare_data(len, buf, s, sl+1);
}
-static void prepare_message(size_t *len, char **buf,
- const char *const *argv) {
+static void prepare_message(size_t *len, char **buf) {
const char *s;
const char *const *p = environ;
prepare_string(len, buf, "");
- p = argv;
+ p = executor_argv;
while ((s = *p++))
prepare_string(len, buf, s);
}
putenv(asprintf("PREFORK_INTERP=%d,%d,%d,%d,%s",
sfd, call_fd, fd0_save, fd1_save, socket_path));
- execv(
+
+ execvp(executor_argv[0], executor_argv);
+ diee("execute %s", executor_argv[0]);
}
static int connect_or_spawn(void) {
static void make_executor_argv(const char *const *argv) {
#define EACH_NEW_ARGV(EACH) { \
- if ((arg = interp)) { EACH; } \
- if ((arg = script)) { EACH; } \
+ arg = interp; { EACH } \
+ if ((arg = script)) { EACH } \
const char *const *walk = argv; \
- while ((arg = *walk++)) { EACH; } \
+ while ((arg = *walk++)) { EACH } \
}
size_t count = 1;
- MAKE_NEW_ARGV( count++ );
+ MAKE_NEW_ARGV( (void)arg; count++; );
executor_argv = calloc(count, sizeof(char*));
if (!executor_argv) diee("allocate for arguments");
char **out = executor_argv;
- MAKE_NEW_ARGV( *out++ = arg );
+ MAKE_NEW_ARGV( *out++ = arg; );
*out++ = 0;
}
// - possibly script
// - remaining args
// which ought to be passed on to the actual executor.
- make_new_argv(argv);
+ make_executor_argv(argv);
find_socket_path();
FILLZERO(sun);