From dd9f3278d2470863d187fa907fac51c443902e54 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 17 Jul 2022 18:23:38 +0100 Subject: [PATCH] prefork-interp: wip compile Signed-off-by: Ian Jackson --- cprogs/prefork-interp.c | 60 ++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/cprogs/prefork-interp.c b/cprogs/prefork-interp.c index e1a703c..65aa679 100644 --- a/cprogs/prefork-interp.c +++ b/cprogs/prefork-interp.c @@ -83,6 +83,10 @@ * (if was bad signal, reports to stderr, exits 127) */ +#include + +#include "prefork.h" + struct sockaddr_un sun; #define ACK_BYTE '\n' @@ -99,7 +103,7 @@ static void propagate_exit_status(int status, const char *what) { if (WIFSIGNALED(status)) { int sig = WTERMSIG(status); - char *signame = strsignal(sig); + const char *signame = strsignal(sig); if (signame == 0) signame = "unknown signal"; if (! WCOREDUMP(status) && @@ -117,7 +121,7 @@ static void propagate_exit_status(int status, const char *what) { sigset_t sset; sigemptyset(&sset); sigaddset(&sset, sig); - r = sigprocmask(SA_UNBLOCK, sset, 0); + r = sigprocmask(SIG_UNBLOCK, &sset, 0); if (r) diee("failed to reset signal block while propagating %s", signame); @@ -133,7 +137,7 @@ static void propagate_exit_status(int status, const char *what) { die("setup failed with weird wait status %d 0x%x", status, status); } -static void die_data_overflow __attribute((noreturn)) { +static __attribute((noreturn)) void die_data_overflow(void) { die("cannot handle data with length >2^32"); } @@ -141,7 +145,7 @@ static void prepare_data(size_t *len, char **buf, const void *data, size_t dl) { if (len) { if (dl >= SIZE_MAX - *len) - die_data_overlow(); + die_data_overflow(); *len += dl; } if (buf) { @@ -150,13 +154,13 @@ static void prepare_data(size_t *len, char **buf, } } -static void prepare_length(size_t *len, char **buf, size_t dl) { - if (dl > UINT32_MAX) die_data_overflow(); - uint32_t dl = htonl(dl); +static void prepare_length(size_t *len, char **buf, size_t dl_sz) { + if (dl_sz > UINT32_MAX) die_data_overflow(); + uint32_t dl = htonl(dl_sz); prepare_data(len, buf, &dl, sizeof(dl)); } -static void prepare_string(size_t *len, char **buf, const char *string) { +static void prepare_string(size_t *len, char **buf, const char *s) { size_t sl = strlen(s); prepare_data(len, buf, s, sl+1); } @@ -164,7 +168,7 @@ static void prepare_string(size_t *len, char **buf, const char *string) { static void prepare_message(size_t *len, char **buf) { const char *s; - const char *const *p = environ; + const char *const *p = (void*)environ; while ((s = *p++)) { if (strchr(s, '=')) prepare_string(len, buf, s); @@ -181,28 +185,31 @@ static void send_fd(int via_fd, int payload_fd) { union { struct cmsghdr align; char buf[CMSG_SPACE(sizeof(payload_fd))]; - } msg; + } cmsg_buf; + struct msghdr msg; FILLZERO(msg); - - struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(sizeof(payload_fd)); - *(int*)CMSG_DATA(cmsg) = payload_fd; + FILLZERO(cmsg_buf); char dummy_byte = 0; - struct iovec iov; - FIULLZERO(iov); + FILLZERO(iov); iov.iov_base = &dummy_byte; iov.iov_len = 1; msg.msg_name = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; - msg.msg_control = msg.buf; - msg.msg_controllen = sizeof(msg.buf); + msg.msg_control = cmsg_buf.buf; + msg.msg_controllen = sizeof(cmsg_buf.buf); + + struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN(sizeof(payload_fd)); + *(int*)CMSG_DATA(cmsg) = payload_fd; + + msg.msg_controllen = sizeof(cmsg_buf.buf); for (;;) { ssize_t r = sendmsg(via_fd, &msg, 0); @@ -210,12 +217,12 @@ static void send_fd(int via_fd, int payload_fd) { if (errno == EINTR) continue; diee("send fd"); } - assert!(r == 1); + assert(r == 1); break; } } -static void send_request(int call_fd, const char *const *argv) { +static void send_request(int call_fd) { // Sending these first makes it easier for the script to // use buffered IO for the message. send_fd(call_fd, 0); @@ -223,12 +230,12 @@ static void send_request(int call_fd, const char *const *argv) { send_fd(call_fd, 2); size_t len = 4; - prepare_message(&len, 0, argv); + prepare_message(&len, 0); char *m = malloc(len); if (!m) diee("failed to allocate for message"); char *p = m; prepare_length(0, &p, len - 4); - prepare_message(0, &p, argv); + prepare_message(0, &p); assert(p == m + len); p = m; @@ -251,13 +258,10 @@ static int connect_existing(void) { int r; int fd = -1; - bool isgarbage = check_garbage(); - if (isgarbage) goto x_garbage; - fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd==-1) diee("socket() for client"); - salen_t salen = sizeof(sun); + socklen_t salen = sizeof(sun); r = connect(client, (const struct sockaddr*)&socket_sun, salen); if (r==-1) { if (errno==ECONNREFUSED || errno==ENOENT) goto x_garbgae; -- 2.30.2