summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2025-03-06 14:51:52 +0100
committerGitHub <noreply@github.com>2025-03-06 14:51:52 +0100
commit48bf272b9d5021ab79b64be169aaf2ffafa8d100 (patch)
tree1f1e89a1687a0e33d56dbec52fb95a27cc167e6e
parent0c06376cf5f3149900ddab389b033a7c31353a8c (diff)
parent21a615c843674c563a61e16c37bcd1c0dbd10c93 (diff)
Merge pull request #283 from nbd168/socket-reuseaddr
socket: add reuseaddr argument for socket.listen()
-rw-r--r--lib/socket.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/socket.c b/lib/socket.c
index f4b10de..70c7299 100644
--- a/lib/socket.c
+++ b/lib/socket.c
@@ -2966,7 +2966,7 @@ uc_socket_listen(uc_vm_t *vm, size_t nargs)
{
int ret, fd, curr_weight, prev_weight, socktype = 0, protocol = 0;
struct addrinfo *ai_results, *ai_hints, *ai;
- uc_value_t *host, *serv, *hints, *backlog;
+ uc_value_t *host, *serv, *hints, *backlog, *reuseaddr;
struct sockaddr_storage ss = { 0 };
bool v6, lo, ll;
socklen_t slen;
@@ -2975,7 +2975,8 @@ uc_socket_listen(uc_vm_t *vm, size_t nargs)
"host", UC_NULL, true, &host,
"service", UC_NULL, true, &serv,
"hints", UC_OBJECT, true, &hints,
- "backlog", UC_INTEGER, true, &backlog);
+ "backlog", UC_INTEGER, true, &backlog,
+ "reuseaddr", UC_BOOLEAN, true, &reuseaddr);
ai_hints = hints
? (struct addrinfo *)uv_to_struct(hints, &st_addrinfo) : NULL;
@@ -3063,6 +3064,13 @@ uc_socket_listen(uc_vm_t *vm, size_t nargs)
if (fd == -1)
err_return(errno, "socket()");
+ if (ucv_is_truish(reuseaddr)) {
+ ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int));
+
+ if (ret == -1)
+ err_return(errno, "setsockopt()");
+ }
+
ret = bind(fd, (struct sockaddr *)&ss, slen);
if (ret == -1) {