diff options
-rw-r--r-- | src/nvim/eval.c | 22 | ||||
-rw-r--r-- | test/functional/eval/server_spec.lua | 10 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index e2e95ee69e..0e538598e1 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -14296,23 +14296,39 @@ static void f_serverstart(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } + char *address; // If the user supplied an address, use it, otherwise use a temp. if (argvars[0].v_type != VAR_UNKNOWN) { if (argvars[0].v_type != VAR_STRING) { EMSG(_(e_invarg)); return; } else { - rettv->vval.v_string = (char_u *)xstrdup(tv_get_string(argvars)); + address = xstrdup(tv_get_string(argvars)); } } else { - rettv->vval.v_string = (char_u *)server_address_new(); + address = server_address_new(); } - int result = server_start((char *) rettv->vval.v_string); + int result = server_start(address); + xfree(address); + if (result != 0) { EMSG2("Failed to start server: %s", result > 0 ? "Unknonwn system error" : uv_strerror(result)); + return; } + + // Since it's possible server_start adjusted the given {address} (e.g., + // "localhost:" will now have a port), return the final value to the user. + size_t n; + char **addrs = server_address_list(&n); + rettv->vval.v_string = (char_u *)addrs[n - 1]; + + n--; + for (size_t i = 0; i < n; i++) { + xfree(addrs[i]); + } + xfree(addrs); } /// "serverstop()" function diff --git a/test/functional/eval/server_spec.lua b/test/functional/eval/server_spec.lua index a621be2100..115114c3c3 100644 --- a/test/functional/eval/server_spec.lua +++ b/test/functional/eval/server_spec.lua @@ -62,12 +62,14 @@ describe('serverstart(), serverstop()', function() clear_serverlist() eq({}, funcs.serverlist()) - funcs.serverstart('127.0.0.1:0') -- assign random port - assert(string.match(funcs.serverlist()[1], '127.0.0.1:%d+')) + local s = funcs.serverstart('127.0.0.1:0') -- assign random port + assert(string.match(s, '127.0.0.1:%d+')) + eq(s, funcs.serverlist()[1]) clear_serverlist() - funcs.serverstart('127.0.0.1:') -- assign random port - assert(string.match(funcs.serverlist()[1], '127.0.0.1:%d+')) + s = funcs.serverstart('127.0.0.1:') -- assign random port + assert(string.match(s, '127.0.0.1:%d+')) + eq(s, funcs.serverlist()[1]) clear_serverlist() funcs.serverstart('127.0.0.1:12345') |