aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/eval.c22
-rw-r--r--test/functional/eval/server_spec.lua10
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')