--- libaitcfg/src/pq.c 2012/09/19 11:47:39 1.1.2.2 +++ libaitcfg/src/pq.c 2012/09/19 14:07:20 1.1.2.11 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: pq.c,v 1.1.2.2 2012/09/19 11:47:39 misho Exp $ +* $Id: pq.c,v 1.1.2.11 2012/09/19 14:07:20 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -61,7 +61,7 @@ _selectPasswd(pwd_root_t * __restrict pwd, u_int uid, return RB_FIND(tagPWD, pwd, &fu); } - return cfg_findPasswdBy(pwd, PWD_CRIT_UID, uid); + return (struct tagUser*) cfg_findPasswdBy(pwd, PWD_CRIT_UID, uid); } /* --------------------------------------------------------------- */ @@ -74,7 +74,7 @@ _selectPasswd(pwd_root_t * __restrict pwd, u_int uid, * @arg1 = Username | UID | GID * return: NULL not found item or error and !=NULL found item */ -struct tagUser * +const struct tagUser * cfg_findPasswdBy(pwd_root_t * __restrict pwd, int criteria, ...) { struct tagUser *u; @@ -83,6 +83,8 @@ cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit if (!pwd) return NULL; + else + AIT_INIT_VAL(&v); va_start(lst, criteria); switch (criteria) { @@ -107,13 +109,13 @@ cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit } break; case PWD_CRIT_UID: - if (AIT_GET_U32(&u->usr_uid) == AIT_GET_U32(&v)) { + if ((u_int) AIT_RAW(&u->usr_uid) == AIT_GET_U32(&v)) { AIT_FREE_VAL(&v); return u; } break; case PWD_CRIT_GID: - if (AIT_GET_U32(&u->usr_gid) == AIT_GET_U32(&v)) { + if ((u_int) AIT_RAW(&u->usr_gid) == AIT_GET_U32(&v)) { AIT_FREE_VAL(&v); return u; } @@ -135,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); @@ -180,24 +195,25 @@ cfg_unsetPasswd(pwd_root_t * __restrict pwd, int crite * cfg_setPasswd() - Set item in password or adding new item if not exists * * @cfg = Password root + * @fields = Meaning continuous field * @csName = Username - * @csPass = Password - * @uid = UID - * @gid = GID - * @Class = Login class - * @change = Chage date - * @expire = Expire date - * @csRealm = Realm - * @csHome = Home dir - * @csShell = Shell + * @arg1 = Password + * @arg2 = UID + * @arg3 = GID + * @arg4 = Login class + * @arg5 = Chage date + * @arg6 = Expire date + * @arg7 = Realm + * @arg8 = Home dir + * @arg9 = Shell * return: 0 nothing changed, -1 error, 1 found and updated item or 2 added new item */ int -cfg_setPasswd(pwd_root_t * __restrict pwd, const char *csName, const char *csPass, - u_int uid, u_int gid, const char *csClass, u_int change, u_int expire, - const char *csRealm, const char *csHome, const char *csShell) +cfg_setPasswd(pwd_root_t * __restrict pwd, u_char fields, const char *csName, ...) { struct tagUser *u; + register int i; + va_list lst; if (!pwd || !csName) return -1; @@ -211,22 +227,51 @@ cfg_setPasswd(pwd_root_t * __restrict pwd, const char return -1; } else { memset(u, 0, sizeof(struct tagUser)); + if (fields && fields < PWD_MAX_FIELDS) + u->usr_fields = fields; + else + u->usr_fields = PWD_MAX_FIELDS - 1; PWD_LOCK(pwd); SLIST_INSERT_HEAD(pwd, u, usr_next); PWD_UNLOCK(pwd); } - AIT_SET_STR(&u->usr_name, csName); - AIT_SET_STR(&u->usr_pass, csPass); - AIT_SET_U32(&u->usr_uid, uid); - AIT_SET_U32(&u->usr_gid, gid); - AIT_SET_STR(&u->usr_class, csClass); - AIT_SET_U32(&u->usr_change, change); - AIT_SET_U32(&u->usr_expire, expire); - AIT_SET_STR(&u->usr_realm, csRealm); - AIT_SET_STR(&u->usr_home, csHome); - AIT_SET_STR(&u->usr_shell, csShell); + va_start(lst, csName); + for (i = 0; i < (u->usr_fields + 1); i++) + switch (i) { + case 0: + AIT_SET_STR(&u->usr_name, csName); + break; + case 1: + AIT_SET_STR(&u->usr_pass, va_arg(lst, char*)); + break; + case 2: + AIT_SET_U32(&u->usr_uid, va_arg(lst, u_int)); + break; + case 3: + AIT_SET_U32(&u->usr_gid, va_arg(lst, u_int)); + break; + case 4: + AIT_SET_STR(&u->usr_class, va_arg(lst, char*)); + break; + case 5: + AIT_SET_U32(&u->usr_change, va_arg(lst, u_int)); + break; + case 6: + AIT_SET_U32(&u->usr_expire, va_arg(lst, u_int)); + break; + case 7: + AIT_SET_STR(&u->usr_realm, va_arg(lst, char*)); + break; + case 8: + AIT_SET_STR(&u->usr_home, va_arg(lst, char*)); + break; + case 9: + AIT_SET_STR(&u->usr_shell, va_arg(lst, char*)); + break; + } + va_end(lst); AIT_KEY(&u->usr_name) = crcFletcher16(AIT_GET_LIKE(&u->usr_name, u_short*), io_align(AIT_LEN(&u->usr_name) - 1, 2) / 2); @@ -247,15 +292,38 @@ cfg_setPasswd(pwd_root_t * __restrict pwd, const char AIT_FREE_VAL(&u->usr_shell); /* Update element */ - AIT_SET_STR(&u->usr_pass, csPass); - AIT_SET_U32(&u->usr_uid, uid); - AIT_SET_U32(&u->usr_gid, gid); - AIT_SET_STR(&u->usr_class, csClass); - AIT_SET_U32(&u->usr_change, change); - AIT_SET_U32(&u->usr_expire, expire); - AIT_SET_STR(&u->usr_realm, csRealm); - AIT_SET_STR(&u->usr_home, csHome); - AIT_SET_STR(&u->usr_shell, csShell); + va_start(lst, csName); + for (i = 1; i < (u->usr_fields + 1); i++) + switch (i) { + case 1: + AIT_SET_STR(&u->usr_pass, va_arg(lst, char*)); + break; + case 2: + AIT_SET_U32(&u->usr_uid, va_arg(lst, u_int)); + break; + case 3: + AIT_SET_U32(&u->usr_gid, va_arg(lst, u_int)); + break; + case 4: + AIT_SET_STR(&u->usr_class, va_arg(lst, char*)); + break; + case 5: + AIT_SET_U32(&u->usr_change, va_arg(lst, u_int)); + break; + case 6: + AIT_SET_U32(&u->usr_expire, va_arg(lst, u_int)); + break; + case 7: + AIT_SET_STR(&u->usr_realm, va_arg(lst, char*)); + break; + case 8: + AIT_SET_STR(&u->usr_home, va_arg(lst, char*)); + break; + case 9: + AIT_SET_STR(&u->usr_shell, va_arg(lst, char*)); + break; + } + va_end(lst); return 1; } @@ -276,6 +344,7 @@ cfg_getPasswd(pwd_root_t * __restrict pwd, int criteri { struct tagUser *u; va_list lst; + char *str; if (!pwd) return NULL; @@ -283,7 +352,11 @@ cfg_getPasswd(pwd_root_t * __restrict pwd, int criteri va_start(lst, criteria); switch (criteria) { case PWD_CRIT_NAME: - u = _selectPasswd(pwd, 0, va_arg(lst, char*)); + str = va_arg(lst, char*); + if (!str) + u = NULL; + else + u = _selectPasswd(pwd, 0, str); break; case PWD_CRIT_UID: u = _selectPasswd(pwd, va_arg(lst, u_int), NULL);