From 819982bdae5e04275908cd21db81248faf5a3d26 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 11 Feb 2014 21:52:48 +0000 Subject: listening in multiple sockets works now --- src/udp.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/udp.c b/src/udp.c index c3e755f..c600e98 100644 --- a/src/udp.c +++ b/src/udp.c @@ -80,7 +80,8 @@ static int udp_resolv_local(udp_t* sock, const char* local_addr, const char* por } struct addrinfo* r = res; - udp_socket_t* prev_sock = NULL; + udp_socket_t* prev_sock = sock->socks_; + while(prev_sock && prev_sock->next_) prev_sock = prev_sock->next_; while(r) { udp_socket_t* new_sock = malloc(sizeof(udp_socket_t)); if(!new_sock) { @@ -151,9 +152,34 @@ int udp_init(udp_t* sock, const char* local_addr, const char* port, resolv_addr_ sock->active_sock_ = NULL; sock->rail_mode_ = rail_mode; - int ret = udp_resolv_local(sock, local_addr, port, resolv_type); - if(ret) - return ret; + const char* colon = strchr(port, ':'); + if(!colon) { + int ret = udp_resolv_local(sock, local_addr, port, resolv_type); + if(ret) + return ret; + } else { + if(!rail_mode) + log_printf(WARNING, "A port range has been defined - enabling RAIL mode"); + sock->rail_mode_ = 1; + + u_int32_t port_num, port_end; + port_num = atoi(port); + port_end = atoi(colon+1); + if(port_num < 1 || port_num > 65535 || + port_end < 1 || port_end > 65535 || port_end < port_num) { + log_printf(ERROR, "illegal port range"); + return -1; + } + do { + char port_str[10]; + snprintf(port_str, sizeof(port_str), "%d", port_num); + int ret = udp_resolv_local(sock, local_addr, port_str, resolv_type); + if(ret) + return ret; + + port_num++; + } while(port_num <= port_end); + } if(sock->rail_mode_) log_printf(NOTICE, "RAIL mode enabled"); @@ -278,6 +304,7 @@ void udp_close(udp_t* sock) free(s); } sock->socks_ = NULL; + sock->active_sock_ = NULL; } char* udp_endpoint_to_string(udp_endpoint_t* e) -- cgit v1.2.3