commit 0d7dfa957070d4c6311472f595846d36873befc3
parent ae1e109cd1b54ec7c91d2e0d1aa25808f339b2dd
Author: Daniel Barlow <dan@telent.net>
Date: Tue, 26 May 2026 19:41:13 +0100
-Wall -Werror
Diffstat:
2 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,5 +1,6 @@
default: luad luac
+CFLAGS=-Wall -Werror
luad: LOADLIBES=-llua
install:
diff --git a/luad.c b/luad.c
@@ -19,16 +19,29 @@
#include <poll.h>
#include <arpa/inet.h>
+#include <stdarg.h>
+#include <stdnoreturn.h>
static int sigchild_fd = -1;
static void handle_sigchld(int num) {
if(sigchild_fd >= 0) {
- write(sigchild_fd, "\n", 1);
+ (void) !write(sigchild_fd, "\n", 1);
}
}
-#define die(...) error(EXIT_FAILURE, errno, __VA_ARGS__)
+static void noreturn die(char *fmt, ...) {
+ va_list ap;
+ va_start(ap, fmt);
+ if(errno > 0) {
+ fprintf(stderr, "luad: %s: ", strerror(errno));
+ } else {
+ fprintf(stderr, "luad: ");
+ }
+ vfprintf(stderr, fmt, ap);
+ exit(1);
+}
+
int open_socket(char * pathname) {
struct sockaddr_un addr;
@@ -94,7 +107,7 @@ int * fds_from_msg(struct msghdr *msg, int * peer_fds) {
}
}
-int start_lua_child(lua_State *L,
+void start_lua_child(lua_State *L,
char * command_line, int command_line_length,
int * fds) {
char * word = command_line;
@@ -125,8 +138,6 @@ int start_lua_child(lua_State *L,
int status = luaL_dofile(L, pathname);
if (status) {
die("Lua error: %s", lua_tostring(L, -1));
- } else {
- return 0;
}
}
@@ -135,8 +146,8 @@ pid_t fork_lua(lua_State *L,
int * fds) {
pid_t pid = fork();
if(pid == 0) {
- exit(start_lua_child(L, command_line, command_line_length,
- fds));
+ start_lua_child(L, command_line, command_line_length, fds);
+ exit(0);
} else if(pid > 0) {
free(command_line);
return pid;
@@ -151,7 +162,6 @@ struct peer_entry {
struct sockaddr_un addr;
} peer_entries[500];
-
bool register_peer(pid_t pid, struct sockaddr_un *addr, int addrlen) {
if(addrlen > sizeof (struct sockaddr_un))
return false;
@@ -210,7 +220,7 @@ int main(int argc, char **argv)
int socket = open_socket(socket_path);
struct sockaddr_un peer_addr;
- socklen_t peer_addr_len;
+
char buf[1025];
struct iovec iov[1];
iov[0].iov_base = buf;
@@ -271,8 +281,10 @@ int main(int argc, char **argv)
pid_t pid;
int wstatus;
- read(pollfds[1].fd, buf, sizeof buf);
- while((pid=waitpid(0, &wstatus, WNOHANG)) > 0) {
+ if(read(pollfds[1].fd, buf, sizeof buf) < 0)
+ continue;
+
+ while((pid = waitpid(0, &wstatus, WNOHANG)) > 0) {
struct peer_entry *peer = find_peer(pid);
if(peer) {
uint32_t ret = 0;