luad

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

commit 7a567117e16152d00120afd901cd87b90f66934c
parent d286b82eba1028731b80d1b1610aca9739ae1634
Author: Daniel Barlow <dan@telent.net>
Date:   Mon, 18 May 2026 21:11:25 +0100

tidy up open_socket and explain need for abstract bind

Diffstat:
Mluac.c | 37+++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/luac.c b/luac.c @@ -44,23 +44,28 @@ size_t strlcpy(char *dst, const char *src, size_t dsize) return(src - osrc - 1); /* count does not include NUL */ } -int open_socket(char * pathname){ - - struct sockaddr_un addr; - addr.sun_family = AF_UNIX; - addr.sun_path[0] = '\0'; /* abstract path */ - strncpy(&addr.sun_path[1], pathname, sizeof(addr.sun_path) - 2); - +int open_socket(struct sockaddr_un *addr, struct sockaddr_un * peer_addr) { int fd = socket(AF_LOCAL, SOCK_DGRAM, PF_LOCAL); if(fd < 0) { perror("socket"); exit(EXIT_FAILURE); } - if((bind(fd, (struct sockaddr *) &addr, sizeof addr)) < 0) { + // local address is in the abstract namespace and ok to include + // trailing nul bytes + if((bind(fd, (struct sockaddr *) addr, sizeof (struct sockaddr_un))) < 0) { perror("bind"); exit(EXIT_FAILURE); } + + // peer address is in the actual filesystem, so we need to pass + // the real length + int namelen = sizeof peer_addr->sun_family + strlen(peer_addr->sun_path); + if((connect(fd, (struct sockaddr *) peer_addr, namelen)) < 0) { + perror("connect"); + exit(EXIT_FAILURE); + } + return fd; } @@ -101,15 +106,19 @@ int main(int argc, char **argv) if(!iobuf) return 1; int iobuf_len = encode_args(iobuf, 1024, argc, argv); - int maxnamelen=sizeof (((struct sockaddr_un *) 0)->sun_path); - char *sockname = calloc(maxnamelen, 1); + + /* for sendmsg with peer address to work on the luad side, we need to + * bind our connected docket on this side to something, so we create + * a hopefully unique abstract name based on the pid and argv */ + + struct sockaddr_un my_addr = { AF_UNIX, "" }; + int maxnamelen = sizeof my_addr.sun_path; pid_t mypid = getpid(); - memcpy(sockname, (void *) &mypid, sizeof mypid); - memcpy(sockname + sizeof mypid, iobuf, maxnamelen - sizeof mypid); + memcpy(my_addr.sun_path + 1, (void *) &mypid, sizeof mypid); + memcpy(my_addr.sun_path + 1 + sizeof mypid, iobuf, maxnamelen - sizeof mypid - 1); struct sockaddr_un peer_addr = { AF_UNIX, "/tmp/mysock" }; - int socket = open_socket(sockname); - connect(socket, (struct sockaddr *) &peer_addr, sizeof peer_addr); + int socket = open_socket(&my_addr, &peer_addr); struct msghdr msg = { 0 }; struct cmsghdr *cmsg;