gid_t Str2Gid(const char *gidbuff, char *groupcopy, const Promise *pp) { struct group *gr; int gid = -2, tmp = -2; if (StringIsNumeric(gidbuff)) { sscanf(gidbuff, "%d", &tmp); gid = (gid_t) tmp; } else { if (strcmp(gidbuff, "*") == 0) { gid = CF_SAME_GROUP; /* signals wildcard */ } else if ((gr = getgrnam(gidbuff)) == NULL) { Log(LOG_LEVEL_INFO, "Unknown group '%s' in promise", gidbuff); if (pp) { PromiseRef(LOG_LEVEL_INFO, pp); } gid = CF_UNKNOWN_GROUP; } else { gid = gr->gr_gid; if (groupcopy != NULL) { strcpy(groupcopy, gidbuff); } } } return gid; }
uid_t Str2Uid(const char *uidbuff, char *usercopy, const Promise *pp) { Item *ip, *tmplist; struct passwd *pw; int offset, uid = -2, tmp = -2; char *machine, *user, *domain; if (uidbuff[0] == '+') /* NIS group - have to do this in a roundabout */ { /* way because calling getpwnam spoils getnetgrent */ offset = 1; if (uidbuff[1] == '@') { offset++; } setnetgrent(uidbuff + offset); tmplist = NULL; while (getnetgrent(&machine, &user, &domain)) { if (user != NULL) { AppendItem(&tmplist, user, NULL); } } endnetgrent(); for (ip = tmplist; ip != NULL; ip = ip->next) { if ((pw = getpwnam(ip->name)) == NULL) { Log(LOG_LEVEL_INFO, "Unknown user in promise '%s'", ip->name); if (pp != NULL) { PromiseRef(LOG_LEVEL_INFO, pp); } uid = CF_UNKNOWN_OWNER; /* signal user not found */ } else { uid = pw->pw_uid; if (usercopy != NULL) { strcpy(usercopy, ip->name); } } } DeleteItemList(tmplist); return uid; } if (StringIsNumeric(uidbuff)) { sscanf(uidbuff, "%d", &tmp); uid = (uid_t) tmp; } else { if (strcmp(uidbuff, "*") == 0) { uid = CF_SAME_OWNER; /* signals wildcard */ } else if ((pw = getpwnam(uidbuff)) == NULL) { Log(LOG_LEVEL_INFO, "Unknown user '%s' in promise", uidbuff); uid = CF_UNKNOWN_OWNER; /* signal user not found */ if (usercopy != NULL) { strcpy(usercopy, uidbuff); } } else { uid = pw->pw_uid; } } return uid; }
//FIXME duplicated code void SVCmd_SVACInfo_f (void) { ptrdiff_t clientID; const char *substring; const char *filesubstring; client_t *cl; linkednamelist_t *bad; if (!svs.initialized) { Com_Printf ("No server running.\n", LOG_GENERAL); return; } if (Cmd_Argc() == 1) { Com_Printf ("Usage: svacinfo [substring|id]\n", LOG_GENERAL); return; } else { substring = Cmd_Argv (1); filesubstring = Cmd_Argv (2); clientID = -1; if (StringIsNumeric (substring)) { clientID = atoi (substring); if (clientID >= maxclients->intvalue || clientID < 0) { Com_Printf ("Invalid client ID.\n", LOG_GENERAL); return; } } else { for (cl = svs.clients; cl < svs.clients + maxclients->intvalue; cl++) { if (cl->state < cs_spawned) continue; if (strstr (cl->name, substring)) { clientID = cl - svs.clients; break; } } } if (clientID == -1) { Com_Printf ("Player not found.\n", LOG_GENERAL); return; } cl = &svs.clients[clientID]; if (cl->state < cs_spawned) { Com_Printf ("Player is not active.\n", LOG_GENERAL); return; } } bad = &cl->anticheat_bad_files; Com_Printf ("File check failures for %s:\n", LOG_GENERAL, cl->name); while (bad->next) { bad = bad->next; if (!filesubstring[0] || strstr (bad->name, filesubstring)) Com_Printf ("%s\n", LOG_GENERAL, bad->name); } }