diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index df7458aa9e1f171bd0ce35acdabca56c3a3f5690..07182e5c6dc2b2463d5e0ce2df56cbc780e26911 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 9307c4f5fa36cdfe0c07a636660c164ac7e8825b..4f60493d722b1bc9065161ae627308664a7787d8 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 */