From 27e3a9a57106ffdf87827c0d6bc2711037defcaf Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 20 Aug 2019 07:56:35 +0000
Subject: [PATCH] New function lookup_user(), a better version of the
 matchname() function from sbbsecho which uses a linked-list for the cached
 user list. Users are looked up by alias or real-name (alias is has higher
 precedence). The found user number is returned or 0 if not-found (or other
 error).

---
 src/sbbs3/userdat.c | 34 ++++++++++++++++++++++++++++++++++
 src/sbbs3/userdat.h |  2 ++
 2 files changed, 36 insertions(+)

diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c
index df7458aa9e..07182e5c6d 100644
--- a/src/sbbs3/userdat.c
+++ b/src/sbbs3/userdat.c
@@ -3355,3 +3355,37 @@ BOOL DLLCALL user_set_time_property(scfg_t* scfg, unsigned user_number, const ch
 }
 
 #endif /* !NO_SOCKET_SUPPORT */
+
+/****************************************************************************/
+/* Returns user number or 0 on failure or "user not found".					*/
+/****************************************************************************/
+int lookup_user(scfg_t* cfg, link_list_t* list, const char *inname)
+{
+	if(inname == NULL || *inname == 0)
+		return 0;
+
+	if(list->first == NULL) {
+		user_t user;
+		int userdat = openuserdat(cfg, /* modify */FALSE);
+		if(userdat < 0)
+			return 0;
+
+		for(user.number = 1; ;user.number++) {
+			if(fgetuserdat(cfg, &user, userdat) != 0)
+				break;
+			if(user.misc&DELETED)
+				continue;
+			listPushNodeData(list, &user, sizeof(user));
+		}
+		close(userdat);
+	}
+	for(list_node_t* node = listFirstNode(list); node != NULL; node = node->next) {
+		if(stricmp(((user_t*)node->data)->alias, inname) == 0)
+			return ((user_t*)node->data)->number;
+	}
+	for(list_node_t* node = listFirstNode(list); node != NULL; node = node->next) {
+		if(stricmp(((user_t*)node->data)->name, inname) == 0)
+			return ((user_t*)node->data)->number;
+	}
+	return 0;
+}
diff --git a/src/sbbs3/userdat.h b/src/sbbs3/userdat.h
index 9307c4f5fa..4f60493d72 100644
--- a/src/sbbs3/userdat.h
+++ b/src/sbbs3/userdat.h
@@ -152,6 +152,8 @@ DLLEXPORT BOOL	DLLCALL check_name(scfg_t*, const char* name);
 DLLEXPORT BOOL	DLLCALL sysop_available(scfg_t*);
 DLLEXPORT BOOL	DLLCALL set_sysop_availability(scfg_t*, BOOL available);
 
+DLLEXPORT int	DLLCALL lookup_user(scfg_t*, link_list_t*, const char* name);
+
 /* Login attempt/hack tracking */
 typedef struct {
 	union xp_sockaddr addr;	/* host with consecutive failed login attempts */
-- 
GitLab