aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/api/ui.c8
-rw-r--r--src/nvim/eval.lua1
-rw-r--r--src/nvim/main.c18
-rw-r--r--src/nvim/msgpack_rpc/server.c31
-rw-r--r--src/nvim/os/env.c30
-rw-r--r--src/nvim/os/input.c2
6 files changed, 51 insertions, 39 deletions
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c
index a99d97acb8..5dc373acdc 100644
--- a/src/nvim/api/ui.c
+++ b/src/nvim/api/ui.c
@@ -93,15 +93,15 @@ void remote_ui_free_all_mem(void)
}
#endif
-/// Wait until ui has connected on stdio channel if only_stdio
-/// is true, otherwise any channel.
+/// Wait until UI has connected.
+///
+/// @param only_stdio UI is expected to connect on stdio.
void remote_ui_wait_for_attach(bool only_stdio)
{
if (only_stdio) {
Channel *channel = find_channel(CHAN_STDIO);
if (!channel) {
- // this function should only be called in --embed mode, stdio channel
- // can be assumed.
+ // `only_stdio` implies --embed mode, thus stdio channel can be assumed.
abort();
}
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index 5087c2d36d..cbab735489 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -6442,6 +6442,7 @@ M.funcs = {
"lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
form, only present when it differs from "lhsraw"
"rhs" The {rhs} of the mapping as typed.
+ "callback" Lua function, if RHS was defined as such.
"silent" 1 for a |:map-silent| mapping, else 0.
"noremap" 1 if the {rhs} of the mapping is not remappable.
"script" 1 if mapping was defined with <script>.
diff --git a/src/nvim/main.c b/src/nvim/main.c
index c507a201b0..a45ee81c81 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -332,12 +332,6 @@ int main(int argc, char **argv)
#endif
bool use_builtin_ui = (has_term && !headless_mode && !embedded_mode && !silent_mode);
- // don't bind the server yet, if we are using builtin ui.
- // This will be done when nvim server has been forked from the ui process
- if (!use_builtin_ui) {
- server_init(params.listen_addr);
- }
-
if (params.remote) {
remote_request(&params, params.remote, params.server_addr, argc, argv,
use_builtin_ui);
@@ -355,11 +349,19 @@ int main(int argc, char **argv)
ui_client_channel_id = rv;
}
+ // NORETURN: Start builtin UI client.
if (ui_client_channel_id) {
time_finish();
ui_client_run(remote_ui); // NORETURN
}
assert(!ui_client_channel_id && !use_builtin_ui);
+ // Nvim server...
+
+ int listen_rv = server_init(params.listen_addr);
+ if (listen_rv != 0) {
+ mainerr("Failed to --listen", listen_rv < 0
+ ? os_strerror(listen_rv) : (listen_rv == 1 ? "empty address" : NULL));
+ }
TIME_MSG("expanding arguments");
@@ -1434,9 +1436,9 @@ scripterror:
// On Windows expand "~\" or "~/" prefix in file names to profile directory.
#ifdef MSWIN
if (*p == '~' && (p[1] == '\\' || p[1] == '/')) {
- size_t size = strlen(os_get_homedir()) + strlen(p);
+ size_t size = strlen(os_homedir()) + strlen(p);
char *tilde_expanded = xmalloc(size);
- snprintf(tilde_expanded, size, "%s%s", os_get_homedir(), p + 1);
+ snprintf(tilde_expanded, size, "%s%s", os_homedir(), p + 1);
xfree(p);
p = tilde_expanded;
}
diff --git a/src/nvim/msgpack_rpc/server.c b/src/nvim/msgpack_rpc/server.c
index 24bd343a34..ae34829181 100644
--- a/src/nvim/msgpack_rpc/server.c
+++ b/src/nvim/msgpack_rpc/server.c
@@ -28,27 +28,32 @@ static garray_T watchers = GA_EMPTY_INIT_VALUE;
#endif
/// Initializes the module
-bool server_init(const char *listen_addr)
+///
+/// @returns 0: success, 1: validation error, 2: already listening, -errno: failed to bind/listen.
+int server_init(const char *listen_addr)
{
+ bool must_free = false;
ga_init(&watchers, sizeof(SocketWatcher *), 1);
// $NVIM_LISTEN_ADDRESS (deprecated)
- if (!listen_addr && os_env_exists(ENV_LISTEN)) {
+ if ((!listen_addr || listen_addr[0] == '\0') && os_env_exists(ENV_LISTEN)) {
listen_addr = os_getenv(ENV_LISTEN);
}
- int rv = listen_addr ? server_start(listen_addr) : 1;
- if (0 != rv) {
+ if (!listen_addr || listen_addr[0] == '\0') {
listen_addr = server_address_new(NULL);
- if (!listen_addr) {
- return false;
- }
- rv = server_start(listen_addr);
- xfree((char *)listen_addr);
+ must_free = true;
+ }
+
+ if (!listen_addr) {
+ abort(); // Cannot happen.
}
+ int rv = server_start(listen_addr);
+
if (os_env_exists(ENV_LISTEN)) {
- // Unset $NVIM_LISTEN_ADDRESS, it's a liability hereafter.
+ // Unset $NVIM_LISTEN_ADDRESS, it's a liability hereafter. It is "input only", it must not be
+ // leaked to child jobs or :terminal.
os_unsetenv(ENV_LISTEN);
}
@@ -57,7 +62,11 @@ bool server_init(const char *listen_addr)
ELOG("test log message");
}
- return rv == 0;
+ if (must_free) {
+ xfree((char *)listen_addr);
+ }
+
+ return rv;
}
/// Teardown a single server
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c
index a4d5c02b5b..8dfedd073e 100644
--- a/src/nvim/os/env.c
+++ b/src/nvim/os/env.c
@@ -395,7 +395,21 @@ void os_get_hostname(char *hostname, size_t size)
#endif
}
-/// To get the "real" home directory:
+/// The "real" home directory as determined by `init_homedir`.
+static char *homedir = NULL;
+static char *os_uv_homedir(void);
+
+/// Gets the "real", resolved user home directory as determined by `init_homedir`.
+const char *os_homedir(void)
+{
+ if (!homedir) {
+ emsg("os_homedir failed: homedir not initialized");
+ return NULL;
+ }
+ return homedir;
+}
+
+/// Sets `homedir` to the "real", resolved user home directory, as follows:
/// 1. get value of $HOME
/// 2. if $HOME is not set, try the following
/// For Windows:
@@ -409,20 +423,6 @@ void os_get_hostname(char *hostname, size_t size)
/// This also works with mounts and links.
/// Don't do this for Windows, it will change the "current dir" for a drive.
/// 3. fall back to current working directory as a last resort
-static char *homedir = NULL;
-static char *os_uv_homedir(void);
-
-/// Public accessor for the cached "real", resolved user home directory. See
-/// comment on `homedir`.
-const char *os_get_homedir(void)
-{
- if (!homedir) {
- emsg("os_get_homedir failed: homedir not initialized");
- return NULL;
- }
- return homedir;
-}
-
void init_homedir(void)
{
// In case we are called a second time.
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index c4eb2803f6..8affc58591 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -514,7 +514,7 @@ static void process_ctrl_c(void)
size_t available = input_available();
ssize_t i;
- for (i = (ssize_t)available - 1; i >= 0; i--) {
+ for (i = (ssize_t)available - 1; i >= 0; i--) { // Reverse-search input for Ctrl_C.
uint8_t c = (uint8_t)input_read_pos[i];
if (c == Ctrl_C
|| (c == 'C' && i >= 3