Compare commits

...

5 Commits

Author SHA1 Message Date
dan 4a7fc45704 wait for server to send script's exit status 2026-05-18 22:48:50 +01:00
dan e2a87ea5c9 use static initaliser for msg 2026-05-18 22:48:50 +01:00
dan 7a567117e1 tidy up open_socket and explain need for abstract bind 2026-05-18 22:48:50 +01:00
dan d286b82eba add luac to makefile 2026-05-18 22:48:50 +01:00
dan 05d083d5b5 no need to call access() here
lua will report an error if the file is not found anyway
2026-05-18 22:48:50 +01:00
3 changed files with 38 additions and 29 deletions
+2 -3
View File
@@ -1,7 +1,6 @@
default: luad
default: luad luac
LOADLIBES=-llua
luad: luad.c
luad: LOADLIBES=-llua
install:
mkdir -p $(TARGET)/bin/
+36 -21
View File
@@ -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,19 +106,22 @@ 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;
int myfds[] = {0,1,2};
int myfds[] = {0, 1, 2};
struct iovec iov = {
.iov_base = iobuf,
.iov_len = iobuf_len
@@ -124,10 +132,15 @@ int main(int argc, char **argv)
struct cmsghdr align;
} u;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_control = u.buf;
msg.msg_controllen = sizeof(u.buf);
struct msghdr msg = {
.msg_name = 0,
.msg_namelen = 0,
.msg_iov = &iov,
.msg_iovlen = 1,
.msg_control = u.buf,
.msg_controllen = sizeof(u.buf)
};
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
@@ -140,5 +153,7 @@ int main(int argc, char **argv)
exit(1);
}
/* FIXME: wait for bytes on socket signifying return value */
uint32_t exitstatus = 0;
recv(socket, (void *) &exitstatus, sizeof exitstatus, 0);
exit((int) ntohl(exitstatus));
}
-5
View File
@@ -157,11 +157,6 @@ int main(int argc, char **argv)
signal(SIGCHLD, handle_sigchld);
if (argc >= 2) {
if (!access(argv[1], F_OK) == 0) {
fprintf(stderr, "File %s does not exist!\n", argv[1]);
exit(1);
}
status = luaL_dofile(L, argv[1]);
if (status) {
fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));