From 44ba3a8541b3db0ad98b250448d3353bf555b776 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 17 Jul 2022 16:42:26 +0100 Subject: [PATCH 1/1] prefork-interp: wip Signed-off-by: Ian Jackson --- cprogs/prefork-interp.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cprogs/prefork-interp.c b/cprogs/prefork-interp.c index de2b6f1..e1a703c 100644 --- a/cprogs/prefork-interp.c +++ b/cprogs/prefork-interp.c @@ -88,6 +88,7 @@ struct sockaddr_un sun; #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; @@ -160,8 +161,7 @@ static void prepare_string(size_t *len, char **buf, const char *string) { 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; @@ -172,7 +172,7 @@ static void prepare_message(size_t *len, char **buf, prepare_string(len, buf, ""); - p = argv; + p = executor_argv; while ((s = *p++)) prepare_string(len, buf, s); } @@ -302,7 +302,9 @@ static void become_setup(int sfd, int fake_pair[2]) 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) { @@ -355,20 +357,20 @@ 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; } @@ -380,7 +382,7 @@ int main(int argc_unused, const char *const *argv) { // - 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); -- 2.30.2