aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-04-11 00:01:43 +0200
committerJustin M. Keyes <justinkz@gmail.com>2018-04-11 02:41:05 +0200
commit704ba4151e7f67999510ee0ac19fdabb595d530c (patch)
tree144b393b12da6379fd36e463339c5ba07adcae42
parent507bda1c95cdac2886f64e59aa6bbf85c3fac389 (diff)
downloadrneovim-704ba4151e7f67999510ee0ac19fdabb595d530c.tar.gz
rneovim-704ba4151e7f67999510ee0ac19fdabb595d530c.tar.bz2
rneovim-704ba4151e7f67999510ee0ac19fdabb595d530c.zip
server: init v:servername if $NVIM_LISTEN_ADDRESS is invalid
Before this change, if $NVIM_LISTEN_ADDRESS was invalid, v:servername was left empty.
-rw-r--r--src/nvim/msgpack_rpc/server.c33
-rw-r--r--test/functional/eval/server_spec.lua32
2 files changed, 36 insertions, 29 deletions
diff --git a/src/nvim/msgpack_rpc/server.c b/src/nvim/msgpack_rpc/server.c
index abff5cfe4f..e5d80aea1d 100644
--- a/src/nvim/msgpack_rpc/server.c
+++ b/src/nvim/msgpack_rpc/server.c
@@ -32,28 +32,27 @@ static garray_T watchers = GA_EMPTY_INIT_VALUE;
#endif
/// Initializes the module
-bool server_init(const char *listen_address)
+bool server_init(const char *listen_addr)
{
ga_init(&watchers, sizeof(SocketWatcher *), 1);
- bool must_free = false;
- if (listen_address == NULL) {
- // Deprecated: $NVIM_LISTEN_ADDRESS
- listen_address = os_getenv(LISTEN_ADDRESS_ENV_VAR);
- if (listen_address == NULL) {
- must_free = true;
- listen_address = server_address_new();
- if (listen_address == NULL) {
+ // $NVIM_LISTEN_ADDRESS
+ const char *env_addr = os_getenv(LISTEN_ADDRESS_ENV_VAR);
+ int rv = listen_addr == NULL ? 1 : server_start(listen_addr);
+
+ if (0 != rv) {
+ rv = env_addr == NULL ? 1 : server_start(env_addr);
+ if (0 != rv) {
+ listen_addr = server_address_new();
+ if (listen_addr == NULL) {
return false;
}
+ rv = server_start(listen_addr);
+ xfree((char *)listen_addr);
}
}
- bool ok = (server_start(listen_address) == 0);
- if (must_free) {
- xfree((char *)listen_address);
- }
- return ok;
+ return rv == 0;
}
/// Teardown a single server
@@ -122,8 +121,8 @@ bool server_owns_pipe_address(const char *path)
/// @param endpoint Address of the server. Either a 'ip:[port]' string or an
/// arbitrary identifier (trimmed to 256 bytes) for the Unix
/// socket or named pipe.
-/// @returns 0 on success, 1 on a regular error, and negative errno
-/// on failure to bind or listen.
+/// @returns 0: success, 1: validation error, 2: already listening,
+/// -errno: failed to bind or listen.
int server_start(const char *endpoint)
{
if (endpoint == NULL || endpoint[0] == '\0') {
@@ -147,7 +146,7 @@ int server_start(const char *endpoint)
uv_freeaddrinfo(watcher->uv.tcp.addrinfo);
}
socket_watcher_close(watcher, free_server);
- return 1;
+ return 2;
}
}
diff --git a/test/functional/eval/server_spec.lua b/test/functional/eval/server_spec.lua
index a2644498f2..4e4aed864b 100644
--- a/test/functional/eval/server_spec.lua
+++ b/test/functional/eval/server_spec.lua
@@ -2,8 +2,9 @@ local helpers = require('test.functional.helpers')(after_each)
local eq, neq, eval = helpers.eq, helpers.neq, helpers.eval
local command = helpers.command
local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
+local iswin = helpers.iswin
local ok = helpers.ok
-local os_name = helpers.os_name
+local matches = helpers.matches
local function clear_serverlist()
for _, server in pairs(funcs.serverlist()) do
@@ -25,7 +26,15 @@ describe('server', function()
eq('', eval('$NVIM_LISTEN_ADDRESS'))
end)
- it('serverstart() sets v:servername at startup or if all servers were stopped',
+ it('sets new v:servername if $NVIM_LISTEN_ADDRESS is invalid', function()
+ clear({env={NVIM_LISTEN_ADDRESS='.'}})
+ eq('.', eval('$NVIM_LISTEN_ADDRESS'))
+ local servers = funcs.serverlist()
+ eq(1, #servers)
+ ok(string.len(servers[1]) > 4) -- Like /tmp/nvim…/… or \\.\pipe\…
+ end)
+
+ it('sets v:servername at startup or if all servers were stopped',
function()
local initial_server = meths.get_vvar('servername')
assert(initial_server ~= nil and initial_server:len() > 0,
@@ -46,9 +55,8 @@ describe('server', function()
eq('', meths.get_vvar('servername'))
-- v:servername will take the next available server.
- local servername = (os_name() == 'windows'
- and [[\\.\pipe\Xtest-functional-server-pipe]]
- or 'Xtest-functional-server-socket')
+ local servername = (iswin() and [[\\.\pipe\Xtest-functional-server-pipe]]
+ or 'Xtest-functional-server-socket')
funcs.serverstart(servername)
eq(servername, meths.get_vvar('servername'))
end)
@@ -102,7 +110,7 @@ describe('server', function()
local n = eval('len(serverlist())')
-- Add some servers.
- local servs = (os_name() == 'windows'
+ local servs = (iswin()
and { [[\\.\pipe\Xtest-pipe0934]], [[\\.\pipe\Xtest-pipe4324]] }
or { [[Xtest-pipe0934]], [[Xtest-pipe4324]] })
for _, s in ipairs(servs) do
@@ -129,18 +137,18 @@ describe('startup --listen', function()
local cmd = { unpack(helpers.nvim_argv) }
table.insert(cmd, '--listen')
- eq('nvim: Argument missing after: "--listen"',
- string.match(funcs.system(cmd), '.-n"'))
+ matches('nvim.*: Argument missing after: "%-%-listen"', funcs.system(cmd))
cmd = { unpack(helpers.nvim_argv) }
table.insert(cmd, '--listen2')
- eq('nvim: Garbage after option argument: "--listen2"',
- string.match(funcs.system(cmd), '.-2"'))
+ matches('nvim.*: Garbage after option argument: "%-%-listen2"', funcs.system(cmd))
end)
it('sets v:servername, overrides $NVIM_LISTEN_ADDRESS', function()
+ local addr = (iswin() and [[\\.\pipe\Xtest-listen-pipe]]
+ or 'Xtest-listen-pipe')
clear({ env={ NVIM_LISTEN_ADDRESS='Xtest-env-pipe' },
- args={ '--listen', 'Xtest-listen-pipe' } })
- eq('Xtest-listen-pipe', meths.get_vvar('servername'))
+ args={ '--listen', addr } })
+ eq(addr, meths.get_vvar('servername'))
end)
end)