diff options
author | Marco Hinz <mh.codebro@gmail.com> | 2017-05-16 14:56:08 +0200 |
---|---|---|
committer | Marco Hinz <mh.codebro@gmail.com> | 2017-05-22 23:38:09 +0200 |
commit | fd5e4e2e4c6b231980effc3055fb93300bd055b0 (patch) | |
tree | 3e8e96268df351348c3aca261466978bdb5e0f30 | |
parent | afa781f42058b82fa9b25b7de755b521a878323e (diff) | |
download | rneovim-fd5e4e2e4c6b231980effc3055fb93300bd055b0.tar.gz rneovim-fd5e4e2e4c6b231980effc3055fb93300bd055b0.tar.bz2 rneovim-fd5e4e2e4c6b231980effc3055fb93300bd055b0.zip |
Server: don't fall back to Unix sockets
-rw-r--r-- | src/nvim/event/socket.c | 34 | ||||
-rw-r--r-- | src/nvim/msgpack_rpc/server.c | 9 |
2 files changed, 26 insertions, 17 deletions
diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c index 8c75023636..82686641c0 100644 --- a/src/nvim/event/socket.c +++ b/src/nvim/event/socket.c @@ -18,13 +18,14 @@ #include "nvim/memory.h" #include "nvim/macros.h" #include "nvim/charset.h" +#include "nvim/log.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "event/socket.c.generated.h" #endif -void socket_watcher_init(Loop *loop, SocketWatcher *watcher, - const char *endpoint) +int socket_watcher_init(Loop *loop, SocketWatcher *watcher, + const char *endpoint) FUNC_ATTR_NONNULL_ALL { xstrlcpy(watcher->addr, endpoint, sizeof(watcher->addr)); @@ -32,33 +33,34 @@ void socket_watcher_init(Loop *loop, SocketWatcher *watcher, char *host_end = strrchr(addr, ':'); if (host_end && addr != host_end) { - intmax_t port; - int ret = getdigits_safe(&(char_u *){ (char_u *)host_end + 1 }, &port); - if (ret == FAIL || port < 0 || port > UINT16_MAX) { - // Invalid port. - goto do_pipe; + // Split user specified address into two strings, addr(hostname) and port. + // The port part in watcher->addr will be updated later. + *host_end = '\0'; + char *port = host_end + 1; + intmax_t iport; + + int ret = getdigits_safe(&(char_u *){ (char_u *)port }, &iport); + if (ret == FAIL || iport < 0 || iport > UINT16_MAX) { + ELOG("Invalid port: %s", port); + return UV_EINVAL; } - *host_end = '\0'; uv_getaddrinfo_t request; - int retval = uv_getaddrinfo(&loop->uv, &request, NULL, addr, host_end+1, + int retval = uv_getaddrinfo(&loop->uv, &request, NULL, addr, port, &(struct addrinfo){ .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, }); - *host_end = ':'; if (retval != 0) { - // Failed to look up address. - goto do_pipe; + ELOG("Host lookup failed: %s", endpoint); + return retval; } - *(host_end + 1) = '\0'; watcher->uv.tcp.addrinfo = request.addrinfo; uv_tcp_init(&loop->uv, &watcher->uv.tcp.handle); watcher->stream = STRUCT_CAST(uv_stream_t, &watcher->uv.tcp.handle); } else { -do_pipe: uv_pipe_init(&loop->uv, &watcher->uv.pipe.handle, 0); watcher->stream = STRUCT_CAST(uv_stream_t, &watcher->uv.pipe.handle); } @@ -68,6 +70,8 @@ do_pipe: watcher->close_cb = NULL; watcher->events = NULL; watcher->data = NULL; + + return 0; } int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb) @@ -98,7 +102,7 @@ int socket_watcher_start(SocketWatcher *watcher, int backlog, socket_cb cb) : ((struct sockaddr_in6 *)&sas)->sin6_port; // v:servername uses the string from watcher->addr size_t len = strlen(watcher->addr); - snprintf(watcher->addr+len, sizeof(watcher->addr)-len, "%" PRIu16, + snprintf(watcher->addr+len, sizeof(watcher->addr)-len, ":%" PRIu16, ntohs(port)); break; } diff --git a/src/nvim/msgpack_rpc/server.c b/src/nvim/msgpack_rpc/server.c index ee96fa1a74..bae5a32850 100644 --- a/src/nvim/msgpack_rpc/server.c +++ b/src/nvim/msgpack_rpc/server.c @@ -118,7 +118,12 @@ int server_start(const char *endpoint) } SocketWatcher *watcher = xmalloc(sizeof(SocketWatcher)); - socket_watcher_init(&main_loop, watcher, endpoint); + + int result = socket_watcher_init(&main_loop, watcher, endpoint); + if (result < 0) { + xfree(watcher); + return result; + } // Check if a watcher for the endpoint already exists for (int i = 0; i < watchers.ga_len; i++) { @@ -132,7 +137,7 @@ int server_start(const char *endpoint) } } - int result = socket_watcher_start(watcher, MAX_CONNECTIONS, connection_cb); + result = socket_watcher_start(watcher, MAX_CONNECTIONS, connection_cb); if (result < 0) { ELOG("Failed to start server: %s", uv_strerror(result)); socket_watcher_close(watcher, free_server); |