From 950c5153d7f351e095127937a931c57b7e1bdfab Mon Sep 17 00:00:00 2001 From: Nicolas Favre-Felix Date: Sun, 11 Jul 2021 22:04:46 -0700 Subject: [PATCH] Fix invalid ioctl call The `request` parameter is unsigned long, not int. This was invalid on macOS and caused issues when sockets were considered non-blocking. Also adds an error log if the call fails. Thanks @likuilin for opening an issue that led to this discovery. --- src/server.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server.c b/src/server.c index 3ddd8ad..72432bd 100644 --- a/src/server.c +++ b/src/server.c @@ -119,7 +119,7 @@ server_can_accept(int fd, short event, void *ptr) { int client_fd; struct sockaddr_in addr; socklen_t addr_sz = sizeof(addr); - char on = 1; + int on = 1; (void)event; /* select worker to send the client to */ @@ -129,7 +129,13 @@ server_can_accept(int fd, short event, void *ptr) { client_fd = accept(fd, (struct sockaddr*)&addr, &addr_sz); /* make non-blocking */ - ioctl(client_fd, (int)FIONBIO, (char *)&on); + int status = ioctl(client_fd, FIONBIO, &on); + if (status == -1) { + char log_msg[200]; + int log_msg_sz = snprintf(log_msg, sizeof(log_msg), + "ioctl failed (%d): %s", errno, strerror(errno)); + slog(s, WEBDIS_ERROR, log_msg, log_msg_sz); + } /* create client and send to worker. */ if(client_fd > 0) {