Diff for /libaitcfg/src/pq.c between versions 1.1.2.1 and 1.1.2.11

version 1.1.2.1, 2012/09/18 15:50:59 version 1.1.2.11, 2012/09/19 14:07:20
Line 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
   
   
 static inline struct tagUser *  static inline struct tagUser *
_selectAttribute(pwd_root_t * __restrict pwd, u_int uid, const char *csName)_selectPasswd(pwd_root_t * __restrict pwd, u_int uid, const char *csName)
 {  {
         struct tagUser fu;          struct tagUser fu;
   
Line 61  _selectAttribute(pwd_root_t * __restrict pwd, u_int ui Line 61  _selectAttribute(pwd_root_t * __restrict pwd, u_int ui
                 return RB_FIND(tagPWD, pwd, &fu);                  return RB_FIND(tagPWD, pwd, &fu);
         }          }
   
        return cfg_findPasswdBy(pwd, PWD_CRIT_UID, uid);        return (struct tagUser*) cfg_findPasswdBy(pwd, PWD_CRIT_UID, uid);
 }  }
   
 /* --------------------------------------------------------------- */  /* --------------------------------------------------------------- */
Line 74  _selectAttribute(pwd_root_t * __restrict pwd, u_int ui Line 74  _selectAttribute(pwd_root_t * __restrict pwd, u_int ui
  * @arg1 = Username | UID | GID   * @arg1 = Username | UID | GID
  * return: NULL not found item or error and !=NULL found item   * 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, ...)  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int criteria, ...)
 {  {
         struct tagUser *u;          struct tagUser *u;
Line 83  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit Line 83  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit
   
         if (!pwd)          if (!pwd)
                 return NULL;                  return NULL;
           else
                   AIT_INIT_VAL(&v);
   
         va_start(lst, criteria);          va_start(lst, criteria);
         switch (criteria) {          switch (criteria) {
Line 107  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit Line 109  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit
                                 }                                  }
                                 break;                                  break;
                         case PWD_CRIT_UID:                          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);                                          AIT_FREE_VAL(&v);
                                         return u;                                          return u;
                                 }                                  }
                                 break;                                  break;
                         case PWD_CRIT_GID:                          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);                                          AIT_FREE_VAL(&v);
                                         return u;                                          return u;
                                 }                                  }
Line 135  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit Line 137  cfg_findPasswdBy(pwd_root_t * __restrict pwd, int crit
 int  int
 cfg_unsetPasswd(pwd_root_t * __restrict pwd, int criteria, ...)  cfg_unsetPasswd(pwd_root_t * __restrict pwd, int criteria, ...)
 {  {
        struct tagUser *u;        struct tagUser *u, *u2;
         va_list lst;          va_list lst;
           u_int n = 0;
           char *name = NULL;
   
         if (!pwd)          if (!pwd)
                 return -1;                  return -1;
   
         va_start(lst, criteria);          va_start(lst, criteria);
         switch (criteria) {          switch (criteria) {
                 case PWD_CRIT_NAME:  
                         u = _selectAttribute(pwd, 0, va_arg(lst, char*));  
                         break;  
                 case PWD_CRIT_UID:                  case PWD_CRIT_UID:
                        u = _selectAttribute(pwd, va_arg(lst, u_int), NULL);                        n = va_arg(lst, u_int);
                         break;                          break;
                   case PWD_CRIT_NAME:
                           name = va_arg(lst, char*);
                           if (name)
                                   break;
                 default:                  default:
                         va_end(lst);                          va_end(lst);
                         return -1;                          return -1;
         }          }
         va_end(lst);          va_end(lst);
   
           u = _selectPasswd(pwd, n, name);
         if (!u)          if (!u)
                 return 0;                  return 0;
   
         PWD_LOCK(pwd);          PWD_LOCK(pwd);
         RB_REMOVE(tagPWD, pwd, u);          RB_REMOVE(tagPWD, pwd, u);
         SLIST_REMOVE(pwd, u, tagUser, usr_next);          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);          PWD_UNLOCK(pwd);
   
         AIT_FREE_VAL(&u->usr_name);          AIT_FREE_VAL(&u->usr_name);
Line 176  cfg_unsetPasswd(pwd_root_t * __restrict pwd, int crite Line 191  cfg_unsetPasswd(pwd_root_t * __restrict pwd, int crite
         return 1;          return 1;
 }  }
   
 #if 0  
 /*  /*
 * cfg_setAttribute() - Set item in config or adding new item if not exists * cfg_setPasswd() - Set item in password or adding new item if not exists
  *   *
 * @cfg = Config root * @cfg = Password root
 * @csSec = Config section //[{csSec}], if NULL set in *default* section * @fields = Meaning continuous field
 * @csAttr = Config attribute //{csAttr} = ... * @csName = Username
 * @csVal = Config value //... = {csVal} to setup * @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   * return: 0 nothing changed, -1 error, 1 found and updated item or 2 added new item
  */   */
 int  int
cfg_setAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr, const char *csVal)cfg_setPasswd(pwd_root_t * __restrict pwd, u_char fields, const char *csName, ...) 
 {  {
        struct tagCfg *av, *section;        struct tagUser *u;
         register int i;
         va_list lst;
   
        if (!cfg || !csAttr)        if (!pwd || !csName)
                 return -1;                  return -1;
   
        av = _selectAttribute(cfg, csSec, csAttr);        u = _selectPasswd(pwd, 0, csName);
        if (!av) {        if (!u) {
                 /* adding new element */                  /* adding new element */
                section = _selectAttribute(cfg, csSec, NULL);                u = io_malloc(sizeof(struct tagUser));
                if (!u) {
                av = io_malloc(sizeof(struct tagCfg));                        cfg_SetErr(io_GetErrno(), "%s", io_GetError());
                if (!av) { 
                        LOGERR; 
                         return -1;                          return -1;
                 } else {                  } else {
                        memset(av, 0, sizeof(struct tagCfg));                        memset(u, 0, sizeof(struct tagUser));
                        if (fields && fields < PWD_MAX_FIELDS)
                        CFG_RC_LOCK(cfg);                                u->usr_fields = fields;
                        if (!section) 
                                SLIST_INSERT_HEAD(cfg, av, cfg_next); 
                         else                          else
                                SLIST_INSERT_AFTER(section, av, cfg_next);                                u->usr_fields = PWD_MAX_FIELDS - 1;
                        CFG_RC_UNLOCK(cfg); 
                } 
   
                if (csSec && *csSec) {                        PWD_LOCK(pwd);
                        AIT_SET_STR(&av->cfg_sec, csSec);                        SLIST_INSERT_HEAD(pwd, u, usr_next);
                        AIT_KEY(&av->cfg_sec) = crcFletcher16(AIT_GET_LIKE(&av->cfg_sec, u_short*),                         PWD_UNLOCK(pwd);
                                        io_align(AIT_LEN(&av->cfg_sec) - 1, 2) / 2); 
                 }                  }
                 AIT_SET_STR(&av->cfg_val, csVal ? csVal : "");  
                 AIT_SET_STR(&av->cfg_attr, csAttr);  
                 AIT_KEY(&av->cfg_attr) = crcFletcher16(AIT_GET_LIKE(&av->cfg_attr, u_short*),   
                                 io_align(AIT_LEN(&av->cfg_attr) - 1, 2) / 2);  
   
                CFG_RC_LOCK(cfg);                va_start(lst, csName);
                RB_INSERT(tagRC, cfg, av);                for (i = 0; i < (u->usr_fields + 1); i++)
                CFG_RC_UNLOCK(cfg);                        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);
 
                 PWD_LOCK(pwd);
                 RB_INSERT(tagPWD, pwd, u);
                 PWD_UNLOCK(pwd);
                 return 2;                  return 2;
        }        } else {
                 AIT_FREE_VAL(&u->usr_pass);
                 AIT_FREE_VAL(&u->usr_uid);
                 AIT_FREE_VAL(&u->usr_gid);
                 AIT_FREE_VAL(&u->usr_class);
                 AIT_FREE_VAL(&u->usr_change);
                 AIT_FREE_VAL(&u->usr_expire);
                 AIT_FREE_VAL(&u->usr_realm);
                 AIT_FREE_VAL(&u->usr_home);
                 AIT_FREE_VAL(&u->usr_shell);
   
         if (csVal && AIT_ADDR(&av->cfg_val) &&   
                         strcmp((char*) csVal, (char*) AIT_GET_STR(&av->cfg_val))) {  
                 /* Update element */                  /* Update element */
                AIT_FREE_VAL(&av->cfg_val);                va_start(lst, csName);
                AIT_SET_STR(&av->cfg_val, csVal);                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;                  return 1;
         }          }
   
Line 243  cfg_setAttribute(cfg_root_t * __restrict cfg, const ch Line 332  cfg_setAttribute(cfg_root_t * __restrict cfg, const ch
 }  }
   
 /*  /*
 * cfg_getAttribute() - Get item from config and return value from it * cfg_getPasswd() - Get item from passwords and return structure from it
  *   *
 * @cfg = Config root * @pwd = Password root
 * @csSec = Config section //[{csSec}], if NULL unset in *default* section * @criteria = Search criteria [PWD_CRIT_NAME|PWD_CRIT_UID]
 * @csAttr = Config attribute //{csAttr} = ..., if NULL unset as *any* attribute * @arg1 = Username | UID
 * return: NULL item not found or null parameters, !=NULL value const string * return: NULL item not found, !=NULL structure found
  */   */
inline const char *inline const struct tagUser *
cfg_getAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr)cfg_getPasswd(pwd_root_t * __restrict pwd, int criteria, ...)
 {  {
        struct tagCfg *av;        struct tagUser *u;
         va_list lst;
         char *str;
   
        if (!cfg || !csAttr)        if (!pwd)
                 return NULL;                  return NULL;
   
        av = _selectAttribute(cfg, csSec, csAttr);        va_start(lst, criteria);
        if (!av)        switch (criteria) {
                return NULL;                case PWD_CRIT_NAME:
                        str = va_arg(lst, char*);
        return AIT_GET_STR(&av->cfg_val);                        if (!str)
}                                u = NULL;
                        else
/*                                u = _selectPasswd(pwd, 0, str);
 * cfg_loadAttribute() - Get guarded attribute, if not found item return *default value*                        break;
 *                case PWD_CRIT_UID:
 * @cfg = Config root                        u = _selectPasswd(pwd, va_arg(lst, u_int), NULL);
 * @csSec = Config section //[{csSec}], if NULL unset in *default* section                        break;
 * @csAttr = Config attribute //{csAttr} = ...                default:
 * @val = Return buffer for item Value //... = {val}                        u = NULL;
 * @csDefValue = *Default Value* for return in //{val}, if not found item in config                        break;
 * return: 0 item not found, -1 error or >0 number of copied bytes in //{val} 
 */ 
int 
cfg_loadAttribute(cfg_root_t * __restrict cfg, const char *csSec, const char *csAttr,  
                ait_val_t * __restrict val, const char *csDefValue) 
{ 
        struct tagCfg *av; 
        int ret = 0; 
 
        if (!cfg || !csAttr || !val) { 
                cfg_SetErr(EINVAL, "Invalid argument(s)"); 
                return -1; 
         }          }
           va_end(lst);
   
        AIT_INIT_VAL(val);        return u;
        av = _selectAttribute(cfg, csSec, csAttr); 
        if (!av) { 
                /* not found item */ 
                if (csDefValue) { 
                        AIT_SET_STR(val, csDefValue); 
                        ret = AIT_LEN(val); 
                } else 
                        AIT_INIT_VAL(val); 
                return ret; 
        } 
 
        if (AIT_ISEMPTY(&av->cfg_val) || !AIT_ADDR(&av->cfg_val) ||  
                        !*AIT_GET_LIKE(&av->cfg_val, char*)) { 
                /* empty value */ 
                if (csDefValue) { 
                        AIT_SET_STR(val, csDefValue); 
                        ret = AIT_LEN(val); 
                } else 
                        AIT_INIT_VAL(val); 
        } else { 
                /* copy value */ 
                AIT_SET_STR(val, AIT_GET_STR(&av->cfg_val)); 
                ret = AIT_LEN(val); 
        } 
 
        return ret; 
 }  }
 #endif  

Removed from v.1.1.2.1  
changed lines
  Added in v.1.1.2.11


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>