diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index 1ffd3cd7cab783f7b5c538a18605fa5d1b835b16..e5b8f0108ee3ccc3505208ddf603191749d33661 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -1538,6 +1538,38 @@ int putnmsg(scfg_t* cfg, int num, char *strin)
 	return(0);
 }
 
+/* Return node's client's socket descriptor or negative on error */
+int getnodeclient(scfg_t* cfg, uint number, client_t* client)
+{
+	SOCKET sock = INVALID_SOCKET;
+	char path[MAX_PATH + 1];
+	char value[INI_MAX_VALUE_LEN];
+	char* p;
+	FILE* fp;
+
+	if(!VALID_CFG(cfg)
+		|| client == NULL || number < 1 || number > cfg->sys_nodes)
+		return -1;
+
+	if(client->size == sizeof(client))
+		free((char*)client->protocol);
+	memset(client, 0, sizeof(*client));
+	client->size = sizeof(client);
+	SAFEPRINTF(path, "%sclient.ini", cfg->node_path[number - 1]);
+	fp = iniOpenFile(path, /* create: */FALSE);
+	if(fp == NULL)
+		return -2;
+	sock = iniReadShortInt(fp, ROOT_SECTION, "sock", 0);
+	client->port = iniReadShortInt(fp, ROOT_SECTION, "port", 0);
+	client->time = iniReadInteger(fp, ROOT_SECTION, "time", 0);
+	SAFECOPY(client->addr, iniReadString(fp, ROOT_SECTION, "addr", "<none>", value));
+	SAFECOPY(client->host, iniReadString(fp, ROOT_SECTION, "host", "<none>", value));
+	if((p = iniReadString(fp, ROOT_SECTION, "prot", NULL, value)) != NULL)
+		client->protocol = strdup(p);
+	fclose(fp);
+	return sock;
+}
+
 static int getdirnum(scfg_t* cfg, char* code)
 {
 	size_t i;
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index 36c46244028272515a82ccd82081b6b460be3aab..50f0b5cd6f7734c9384b52dd788fb4b659355755 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -76,6 +76,7 @@ DLLEXPORT char* getsmsg(scfg_t*, int usernumber);
 DLLEXPORT int	putsmsg(scfg_t*, int usernumber, char *strin);
 DLLEXPORT char* getnmsg(scfg_t*, int node_num);
 DLLEXPORT int	putnmsg(scfg_t*, int num, char *strin);
+DLLEXPORT int	getnodeclient(scfg_t*, uint number, client_t*);
 
 DLLEXPORT uint	userdatdupe(scfg_t*, uint usernumber, uint offset, uint datlen, char *dat
 					,BOOL del, BOOL next, void (*progress)(void*, int, int), void* cbdata);