diff --git a/command.c b/command.c index 2fdcef7b13..23ececc44e 100644 --- a/command.c +++ b/command.c @@ -123,25 +123,23 @@ static const struct cmd_map map[] = { #if defined(HAVE_NETWORK_CMD) && defined(HAVE_NETPLAY) static bool cmd_init_network(rarch_cmd_t *handle, uint16_t port) { - int *file_desc = (int*)&handle->net_fd; struct addrinfo *res = NULL; int yes = 1; RARCH_LOG("Bringing up command interface on port %hu.\n", (unsigned short)port); - if (!socket_init(res, file_desc, port, NULL, SOCKET_TYPE_DATAGRAM)) + handle->net_fd = socket_init((void**)&res, port, NULL, SOCKET_TYPE_DATAGRAM); + + if (handle->net_fd < 0) goto error; - if (*file_desc < 0) + if (!socket_nonblock(handle->net_fd)) goto error; - if (!socket_nonblock(*file_desc)) - goto error; - - setsockopt(*file_desc, SOL_SOCKET, + setsockopt(handle->net_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&yes, sizeof(int)); - if (bind(*file_desc, res->ai_addr, res->ai_addrlen) < 0) + if (bind(handle->net_fd, res->ai_addr, res->ai_addrlen) < 0) { RARCH_ERR("Failed to bind socket.\n"); goto error; diff --git a/libretro-common/include/net/net_socket.h b/libretro-common/include/net/net_socket.h index 742c973315..b58fd0c4dc 100644 --- a/libretro-common/include/net/net_socket.h +++ b/libretro-common/include/net/net_socket.h @@ -37,7 +37,7 @@ enum socket_type SOCKET_TYPE_STREAM }; -bool socket_init(void *address, int *fd, uint16_t port, const char *server, enum socket_type type); +int socket_init(void **address, uint16_t port, const char *server, enum socket_type type); int socket_close(int fd); diff --git a/libretro-common/net/net_http.c b/libretro-common/net/net_http.c index 0ea58eecd7..7052520b17 100644 --- a/libretro-common/net/net_http.c +++ b/libretro-common/net/net_http.c @@ -26,6 +26,7 @@ #include #include +#include #include enum @@ -72,34 +73,17 @@ struct http_connection_t static int net_http_new_socket(const char *domain, int port) { - int fd; int ret; #ifndef _WIN32 #ifndef VITA struct timeval timeout; #endif #endif - struct addrinfo hints, *addr = NULL; - char portstr[16] = {0}; - - /* Initialize the network. */ - if (!network_init()) + struct addrinfo *addr = NULL; + int fd = socket_init((void**)&addr, port, domain, SOCKET_TYPE_STREAM); + if (fd == -1) return -1; - snprintf(portstr, sizeof(portstr), "%i", port); - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = 0; - - if (getaddrinfo_retro(domain, portstr, &hints, &addr) < 0) - return -1; - if (!addr) - return -1; - - fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); - #ifndef _WIN32 #ifndef VITA timeout.tv_sec=4; @@ -107,6 +91,7 @@ static int net_http_new_socket(const char *domain, int port) setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof timeout); #endif #endif + ret = connect(fd, addr->ai_addr, addr->ai_addrlen); freeaddrinfo_retro(addr); diff --git a/libretro-common/net/net_socket.c b/libretro-common/net/net_socket.c index fd0f640f66..5fd0ff67b9 100644 --- a/libretro-common/net/net_socket.c +++ b/libretro-common/net/net_socket.c @@ -24,14 +24,13 @@ #include #include -bool socket_init(void *address, int *fd, uint16_t port, const char *server, enum socket_type type) +int socket_init(void **address, uint16_t port, const char *server, enum socket_type type) { char port_buf[16] = {0}; struct addrinfo hints = {0}; - struct addrinfo *addr = (struct addrinfo*)address; - - if (!fd) - goto error; + struct addrinfo **addrinfo = (struct addrinfo**)address; + struct addrinfo *addr = NULL; + if (!network_init()) goto error; @@ -51,23 +50,24 @@ bool socket_init(void *address, int *fd, uint16_t port, const char *server, enum hints.ai_socktype = SOCK_STREAM; break; } + if (!server) hints.ai_flags = AI_PASSIVE; snprintf(port_buf, sizeof(port_buf), "%hu", (unsigned short)port); - if (getaddrinfo_retro(server, port_buf, &hints, &addr) < 0) + if (getaddrinfo_retro(server, port_buf, &hints, addrinfo) < 0) goto error; + addr = (struct addrinfo*)*addrinfo; + if (!addr) goto error; - *fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); - - return true; + return socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); error: - return false; + return -1; } int socket_receive_all_blocking(int fd, void *data_, size_t size) diff --git a/netplay/netplay.c b/netplay/netplay.c index 0c660976d7..7cbdc835c2 100644 --- a/netplay/netplay.c +++ b/netplay/netplay.c @@ -762,11 +762,9 @@ static bool init_tcp_socket(netplay_t *netplay, const char *server, static bool init_udp_socket(netplay_t *netplay, const char *server, uint16_t port) { - int *file_desc = (int*)&netplay->udp_fd; - if (!socket_init(&netplay->addr, file_desc, port, server, SOCKET_TYPE_DATAGRAM)) - return false; + netplay->udp_fd = socket_init((void**)&netplay->addr, port, server, SOCKET_TYPE_DATAGRAM); - if (*file_desc < 0) + if (netplay->udp_fd < 0) { RARCH_ERR("Failed to initialize socket.\n"); return false;