luad

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit e2685769d04bd7c2f92255e5744d6cdee161e95e
parent 262fc6437c1f1ca2c1bb08da00d9ff8b5ed54efd
Author: Daniel Barlow <dan@telent.net>
Date:   Tue, 19 May 2026 17:54:36 +0100

make the peers table a global

less complicated when the size is known at compile time

Diffstat:
Mluad.c | 50+++++++++++++++++++++++++++++---------------------
1 file changed, 29 insertions(+), 21 deletions(-)

diff --git a/luad.c b/luad.c @@ -8,6 +8,7 @@ #include <string.h> #include <stdlib.h> #include <stdint.h> +#include <stdbool.h> #include <errno.h> #include <error.h> #include <sys/un.h> @@ -115,27 +116,36 @@ struct peer_entry { pid_t pid; int addrlen; struct sockaddr_un addr; -}; +} peer_entries[500]; -int register_peer(struct peer_entry *table, pid_t pid, struct sockaddr_un *addr, int addrlen) { + +int register_peer(pid_t pid, struct sockaddr_un *addr, int addrlen) { if(addrlen > sizeof (struct sockaddr_un)) - return -1; - - struct peer_entry *p = table; - while(p->pid != 0 && p->pid != -1) - p++; - if(p->pid == -1) - return -1; - p->pid = pid; - p->addrlen = addrlen; - memcpy(&(p->addr), addr, addrlen); + return 0; + + struct peer_entry *p = peer_entries; + int peer_entries_max = sizeof peer_entries / sizeof(peer_entries[0]); + + for(int i=0; i < peer_entries_max; i++) { + struct peer_entry *p = &peer_entries[i]; + if(p->pid == 0) { + p->pid = pid; + p->addrlen = addrlen; + memcpy(&(p->addr), addr, addrlen); + return 1; + } + } + return 0; } -struct peer_entry* find_peer(struct peer_entry *table, pid_t pid) { - while(table->pid != -1) { - if(table->pid == pid) - return table; - table++; +struct peer_entry* find_peer(pid_t pid) { + int peer_entries_max = sizeof peer_entries / sizeof(peer_entries[0]); + + for(int i=0; i < peer_entries_max; i++) { + struct peer_entry *p = &peer_entries[i]; + if(p->pid == pid) { + return p; + } } return NULL; } @@ -148,8 +158,6 @@ int main(int argc, char **argv) lua_State *L = luaL_newstate(); luaL_openlibs(L); int sigpipe_fds[2]; - struct peer_entry * peer_table = calloc(501, sizeof (struct peer_entry)); - peer_table[500].pid = -1; char * socket_path = getenv("LUAD_SOCKET_PATH"); if(! socket_path) { @@ -213,7 +221,7 @@ int main(int argc, char **argv) pid_t child_pid = fork_lua(L, argline, len, peer_fds, 5); if(child_pid >= 0) { - register_peer(peer_table, child_pid, &peer_addr, msg.msg_namelen); + register_peer(child_pid, &peer_addr, msg.msg_namelen); } } @@ -223,7 +231,7 @@ int main(int argc, char **argv) read(pollfds[1].fd, buf, sizeof buf); while((pid=waitpid(0, &wstatus, WNOHANG)) > 0) { - struct peer_entry *peer = find_peer(peer_table, pid); + struct peer_entry *peer = find_peer(pid); if(peer) { uint32_t ret = 0; if(WIFEXITED(wstatus)) {