commit d79a9dcd422133bc1e4b4ef94444962560d7a6d7
parent cb8c9186e6ff563e23ca8faac5e3148fbdf68d10
Author: Sathya Pramodh <94102031+sathya-pramodh@users.noreply.github.com>
Date: Sat, 21 Feb 2026 05:11:55 +0530
refactor(net): socket_address_is_tcp #37947
Diffstat:
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c
@@ -23,6 +23,26 @@
#include "event/socket.c.generated.h"
+/// Checks if an address string looks like a TCP endpoint.
+///
+/// @param address Address string
+/// @return true if address looks like a TCP endpoint, false otherwise
+bool socket_address_is_tcp(const char *address)
+{
+ if (address == NULL) {
+ return false;
+ }
+
+ // Windows drive letter path: "X:\..." or "X:/..." is a local path, not TCP.
+ if (ASCII_ISALPHA((uint8_t)address[0]) && address[1] == ':'
+ && (address[2] == '\\' || address[2] == '/')) {
+ return false;
+ }
+
+ const char *colon = strrchr(address, ':');
+ return colon != NULL && colon != address;
+}
+
int socket_watcher_init(Loop *loop, SocketWatcher *watcher, const char *endpoint)
FUNC_ATTR_NONNULL_ALL
{
@@ -30,7 +50,7 @@ int socket_watcher_init(Loop *loop, SocketWatcher *watcher, const char *endpoint
char *addr = watcher->addr;
char *host_end = strrchr(addr, ':');
- if (host_end && addr != host_end) {
+ if (socket_address_is_tcp(addr)) {
// Split user specified address into two strings, addr (hostname) and port.
// The port part in watcher->addr will be updated later.
*host_end = NUL;
diff --git a/src/nvim/main.c b/src/nvim/main.c
@@ -47,6 +47,7 @@
#include "nvim/event/loop.h"
#include "nvim/event/multiqueue.h"
#include "nvim/event/proc.h"
+#include "nvim/event/socket.h"
#include "nvim/event/stream.h"
#include "nvim/ex_cmds.h"
#include "nvim/ex_docmd.h"
@@ -927,7 +928,7 @@ static uint64_t server_connect(char *server_addr, const char **errmsg)
}
CallbackReader on_data = CALLBACK_READER_INIT;
const char *error = NULL;
- bool is_tcp = strrchr(server_addr, ':') ? true : false;
+ bool is_tcp = socket_address_is_tcp(server_addr);
// connected to channel
uint64_t chan = channel_connect(is_tcp, server_addr, true, on_data, 500, &error);
if (error) {
diff --git a/src/nvim/ui_client.c b/src/nvim/ui_client.c
@@ -12,6 +12,7 @@
#include "nvim/channel_defs.h"
#include "nvim/eval/typval_defs.h"
#include "nvim/event/multiqueue.h"
+#include "nvim/event/socket.h"
#include "nvim/globals.h"
#include "nvim/highlight.h"
#include "nvim/highlight_defs.h"
@@ -297,7 +298,7 @@ static void channel_connect_event(void **argv)
char *server_addr = argv[0];
const char *err = "";
- bool is_tcp = !!strrchr(server_addr, ':');
+ bool is_tcp = socket_address_is_tcp(server_addr);
CallbackReader on_data = CALLBACK_READER_INIT;
uint64_t chan = channel_connect(is_tcp, server_addr, true, on_data, 50, &err);