diff options
author | Jo-Philipp Wich <jo@mein.io> | 2025-03-06 14:51:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-06 14:51:52 +0100 |
commit | 48bf272b9d5021ab79b64be169aaf2ffafa8d100 (patch) | |
tree | 1f1e89a1687a0e33d56dbec52fb95a27cc167e6e | |
parent | 0c06376cf5f3149900ddab389b033a7c31353a8c (diff) | |
parent | 21a615c843674c563a61e16c37bcd1c0dbd10c93 (diff) |
Merge pull request #283 from nbd168/socket-reuseaddr
socket: add reuseaddr argument for socket.listen()
-rw-r--r-- | lib/socket.c | 12 |
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) { |