chiark / gitweb /
prefork-interp: wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 17 Jul 2022 15:42:26 +0000 (16:42 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 20:21:10 +0000 (21:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cprogs/prefork-interp.c

index de2b6f10154edb3385e3c4f35a60dae381763dab..e1a703c05a4da07d5f5e006b4db123bfa522aea8 100644 (file)
@@ -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);