From ebcccd34a7597133cfcb2bfa0a17f92f51f4eaf3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 17 Jul 2022 20:00:34 +0100 Subject: [PATCH] prefork-interp: wip compile Signed-off-by: Ian Jackson --- cprogs/prefork-interp.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/cprogs/prefork-interp.c b/cprogs/prefork-interp.c index fdc5da9..4e044a2 100644 --- a/cprogs/prefork-interp.c +++ b/cprogs/prefork-interp.c @@ -91,7 +91,7 @@ struct sockaddr_un sun; #define ACK_BYTE '\n' -static struct sockaddr_unix socket_sun; +static struct sockaddr_un socket_sun; static const char *const *executor_argv; static void propagate_exit_status(int status, const char *what) { @@ -130,11 +130,11 @@ static void propagate_exit_status(int status, const char *what) { signame); } - die("setup failed due to signal %d %s%s", sig, signame, + die("%s failed due to signal %d %s%s", what, sig, signame, WCOREDUMP(status) ? " (core dumped)" : ""); } - die("setup failed with weird wait status %d 0x%x", status, status); + die("%s failed with weird wait status %d 0x%x", what, status, status); } static __attribute((noreturn)) void die_data_overflow(void) { @@ -256,6 +256,10 @@ static FILE *call_sock_from_fd(int fd) { return call_sock; } +static bool was_eof(FILE *call_sock) { + return feof(call_sock) || errno==ECONNRESET; +} + // Returns: call(client-end), or 0 to mean "is garbage" // find_socket_path must have been called static FILE *connect_existing(void) { @@ -279,7 +283,7 @@ static FILE *connect_existing(void) { char ack; size_t sr = fread(&ack, sizeof(ack), 1, call_sock); if (sr != 1) { - if (feof(call_sock) || errno==ECONNRESET) goto x_garbage; + if (was_eof(call_sock)) goto x_garbage; diee("read() ack byte"); } if (ack != '\n') die("got ack byte 0x%02x, not '\n'", ack); @@ -358,7 +362,7 @@ static FILE *connect_or_spawn(void) { if (got == (pid_t)-1) diee("waitpid setup [%ld]", (long)setup_pid); if (got != setup_pid) diee("waitpid setup [%ld] gave [%ld]!", (long)setup_pid, (long)got); - if (status != 0) propagate_exit_status(status, "invocation"); + if (status != 0) propagate_exit_status(status, "setup"); close(lockfd); return call_sock_from_fd(fake_pair[0]); @@ -401,4 +405,16 @@ int main(int argc_unused, const char *const *argv) { strncpy(sun.sun_path, socket_path, sizeof(sun.sun_path)); FILE *call_sock = connect_or_spawn(); + uint32_t status; + ssize_t sr = fread(&status, sizeof(status), 1, call_sock); + if (sr != 1) { + if (was_eof(call_sock)) die("per-call server monitor process quit"); + diee("read status from call socket"); + } + + status = ntohl(status); + if (status > INT_MAX) die("status 0x%lx does not fit in an int", + (unsigned long)status); + + propagate_exit_status(status, "invocation"); } -- 2.30.2