aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2015-10-19 18:53:46 -0400
committerJustin M. Keyes <justinkz@gmail.com>2015-10-19 18:53:46 -0400
commite38cbb93670272d0da15c60222a123b88ec55002 (patch)
tree5ee7b720887210fbf53ceec0ee8f874275b4f692 /src
parentea01c40f520dd532401c1d92c4c78295911943b1 (diff)
parent3e84a91ac1adf120f75f8382e8c71601d3655059 (diff)
downloadrneovim-e38cbb93670272d0da15c60222a123b88ec55002.tar.gz
rneovim-e38cbb93670272d0da15c60222a123b88ec55002.tar.bz2
rneovim-e38cbb93670272d0da15c60222a123b88ec55002.zip
Merge pull request #1909 from equalsraf/tb-os_serveraddress
server_address()
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c2
-rw-r--r--src/nvim/msgpack_rpc/server.c30
2 files changed, 29 insertions, 3 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index d02348028a..a1ac713a75 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -14572,7 +14572,7 @@ static void f_serverstart(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = vim_strsave(get_tv_string(argvars));
}
} else {
- rettv->vval.v_string = vim_tempname();
+ rettv->vval.v_string = (char_u *)server_address_new();
}
int result = server_start((char *) rettv->vval.v_string);
diff --git a/src/nvim/msgpack_rpc/server.c b/src/nvim/msgpack_rpc/server.c
index 8dffea35ca..474e25ffeb 100644
--- a/src/nvim/msgpack_rpc/server.c
+++ b/src/nvim/msgpack_rpc/server.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
+#include <inttypes.h>
#include "nvim/msgpack_rpc/channel.h"
#include "nvim/msgpack_rpc/server.h"
@@ -35,7 +36,7 @@ bool server_init(void)
const char *listen_address = os_getenv(LISTEN_ADDRESS_ENV_VAR);
if (listen_address == NULL) {
must_free = true;
- listen_address = (char *)vim_tempname();
+ listen_address = server_address_new();
}
bool ok = (server_start(listen_address) == 0);
@@ -67,6 +68,27 @@ void server_teardown(void)
GA_DEEP_CLEAR(&watchers, SocketWatcher *, close_socket_watcher);
}
+/// Generates unique address for local server.
+///
+/// In Windows this is a named pipe in the format
+/// \\.\pipe\nvim-<PID>-<COUNTER>.
+///
+/// For other systems it is a path returned by vim_tempname().
+///
+/// This function is NOT thread safe
+char *server_address_new(void)
+{
+#ifdef WIN32
+ static uint32_t count = 0;
+ char template[ADDRESS_MAX_SIZE];
+ snprintf(template, ADDRESS_MAX_SIZE,
+ "\\\\.\\pipe\\nvim-%" PRIu64 "-%" PRIu32, os_get_pid(), count++);
+ return xstrdup(template);
+#else
+ return (char *)vim_tempname();
+#endif
+}
+
/// Starts listening for API calls on the TCP address or pipe path `endpoint`.
/// The socket type is determined by parsing `endpoint`: If it's a valid IPv4
/// address in 'ip[:port]' format, then it will be TCP socket. The port is
@@ -79,8 +101,12 @@ void server_teardown(void)
/// @returns 0 on success, 1 on a regular error, and negative errno
/// on failure to bind or connect.
int server_start(const char *endpoint)
- FUNC_ATTR_NONNULL_ALL
{
+ if (endpoint == NULL) {
+ ELOG("Attempting to start server on NULL endpoint");
+ return 1;
+ }
+
SocketWatcher *watcher = xmalloc(sizeof(SocketWatcher));
socket_watcher_init(&loop, watcher, endpoint, NULL);