--- libaitcfg/src/pq.c 2012/09/19 13:05:44 1.1.2.9 +++ libaitcfg/src/pq.c 2012/09/19 13:30:46 1.1.2.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: pq.c,v 1.1.2.9 2012/09/19 13:05:44 misho Exp $ +* $Id: pq.c,v 1.1.2.10 2012/09/19 13:30:46 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -137,31 +137,44 @@ cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit int cfg_unsetPasswd(pwd_root_t * __restrict pwd, int criteria, ...) { - struct tagUser *u; + struct tagUser *u, *u2; va_list lst; + u_int n = 0; + char *name = NULL; if (!pwd) return -1; va_start(lst, criteria); switch (criteria) { - case PWD_CRIT_NAME: - u = _selectPasswd(pwd, 0, va_arg(lst, char*)); - break; case PWD_CRIT_UID: - u = _selectPasswd(pwd, va_arg(lst, u_int), NULL); + n = va_arg(lst, u_int); break; + case PWD_CRIT_NAME: + name = va_arg(lst, char*); + if (name) + break; default: va_end(lst); return -1; } va_end(lst); + + u = _selectPasswd(pwd, n, name); if (!u) return 0; PWD_LOCK(pwd); RB_REMOVE(tagPWD, pwd, u); SLIST_REMOVE(pwd, u, tagUser, usr_next); + + /* if duplicates exists, then update r/b tree */ + SLIST_FOREACH(u2, pwd, usr_next) + if (!AIT_ISEMPTY(&u2->usr_name) && + !strcmp(AIT_GET_STR(&u->usr_name), AIT_GET_STR(&u2->usr_name))) { + RB_INSERT(tagPWD, pwd, u2); + break; + } PWD_UNLOCK(pwd); AIT_FREE_VAL(&u->usr_name);