diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2009-12-13 11:27:33 +0100 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2009-12-13 11:27:33 +0100 |
commit | ef8cc767b201e4798a060282d4a6f280094bb8cc (patch) | |
tree | 4f19eae6870321f280959be4b7b24cd0e38d4c2a /nslcd | |
parent | 7dd703c9af5f8b4a50f056c47588a9e51d4ea681 (diff) |
change dict and set API to perform loops with a list of strings instead of loop_first() and loop_next() functions
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1028 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nslcd')
-rw-r--r-- | nslcd/group.c | 33 | ||||
-rw-r--r-- | nslcd/myldap.c | 67 |
2 files changed, 20 insertions, 80 deletions
diff --git a/nslcd/group.c b/nslcd/group.c index 12021b2..cc2a95d 100644 --- a/nslcd/group.c +++ b/nslcd/group.c @@ -153,20 +153,10 @@ void group_init(void) static int do_write_group( TFILE *fp,MYLDAP_ENTRY *entry,const char **names,gid_t gids[],int numgids, - const char *passwd,SET *members,const char *reqname) + const char *passwd,const char **members,const char *reqname) { - int32_t tmpint32; + int32_t tmpint32,tmp2int32,tmp3int32; int i,j; - int nummembers; - const char *tmp; - /* count the number of members */ - nummembers=0; - if (members!=NULL) - { - set_loop_first(members); - while (set_loop_next(members)!=NULL) - nummembers++; - } /* write entries for all names and gids */ for (i=0;names[i]!=NULL;i++) { @@ -183,14 +173,7 @@ static int do_write_group( WRITE_STRING(fp,names[i]); WRITE_STRING(fp,passwd); WRITE_TYPE(fp,gids[j],gid_t); - /* write a list of values */ - WRITE_INT32(fp,nummembers); - if (members!=NULL) - { - set_loop_first(members); - while ((tmp=set_loop_next(members))!=NULL) - { WRITE_STRING(fp,tmp); } - } + WRITE_STRINGLIST(fp,members); } } } @@ -199,7 +182,7 @@ static int do_write_group( /* return the list of members as a \0 separated string with an extra \0 at the end (doing dn->uid lookups as needed) */ -static SET *getmembers(MYLDAP_ENTRY *entry,MYLDAP_SESSION *session) +static const char **getmembers(MYLDAP_ENTRY *entry,MYLDAP_SESSION *session) { char buf[20]; int i; @@ -227,7 +210,9 @@ static SET *getmembers(MYLDAP_ENTRY *entry,MYLDAP_SESSION *session) set_add(set,buf); } /* return the members */ - return set; + values=set_tolist(set); + set_free(set); + return values; } /* the maximum number of gidNumber attributes per entry */ @@ -239,7 +224,7 @@ static int write_group(TFILE *fp,MYLDAP_ENTRY *entry,const char *reqname, { const char **names,**gidvalues; const char *passwd; - SET *members; + const char **members; gid_t gids[MAXGIDS_PER_ENTRY]; int numgids; char *tmp; @@ -292,7 +277,7 @@ static int write_group(TFILE *fp,MYLDAP_ENTRY *entry,const char *reqname, rc=do_write_group(fp,entry,names,gids,numgids,passwd,members,reqname); /* free and return */ if (members!=NULL) - set_free(members); + free(members); return rc; } diff --git a/nslcd/myldap.c b/nslcd/myldap.c index 518e0c3..8118464 100644 --- a/nslcd/myldap.c +++ b/nslcd/myldap.c @@ -75,7 +75,6 @@ #include "common.h" #include "log.h" #include "cfg.h" -#include "attmap.h" #include "common/set.h" #include "compat/ldap_compat.h" @@ -1215,57 +1214,10 @@ char *myldap_cpy_dn(MYLDAP_ENTRY *entry,char *buf,size_t buflen) return buf; } -/* Return a buffer that is an a list of strings that can be freed - with a single call to free(). This function frees the set. */ -static char **set2values(SET *set) -{ - char *buf; - char **values; - const char *val; - size_t sz; - int num; - /* check set */ - if (set==NULL) - return NULL; - /* count number of entries and needed space */ - sz=0; - num=1; - set_loop_first(set); - while ((val=set_loop_next(set))!=NULL) - { - num++; - sz+=strlen(val)+1; - } - /* allocate the needed memory */ - buf=(char *)malloc(num*sizeof(char *)+sz); - if (buf==NULL) - { - log_log(LOG_CRIT,"set2values(): malloc() failed to allocate memory"); - set_free(set); - return NULL; - } - values=(char **)(void *)buf; - buf+=num*sizeof(char *); - /* copy set into buffer */ - sz=0; - num=0; - set_loop_first(set); - while ((val=set_loop_next(set))!=NULL) - { - strcpy(buf,val); - values[num++]=buf; - buf+=strlen(buf)+1; - } - values[num]=NULL; - /* we're done */ - set_free(set); - return values; -} - /* Perform ranged retreival of attributes. http://msdn.microsoft.com/en-us/library/aa367017(vs.85).aspx http://www.tkk.fi/cc/docs/kerberos/draft-kashi-incremental-00.txt */ -static char **myldap_get_ranged_values(MYLDAP_ENTRY *entry,const char *attr) +static SET *myldap_get_ranged_values(MYLDAP_ENTRY *entry,const char *attr) { char **values; char *attn; @@ -1345,7 +1297,8 @@ static char **myldap_get_ranged_values(MYLDAP_ENTRY *entry,const char *attr) /* close any started searches */ if (search!=NULL) myldap_search_close(search); - return set2values(set); + /* return the contents of the set as a list */ + return set; } /* Simple wrapper around ldap_get_values(). */ @@ -1354,6 +1307,7 @@ const char **myldap_get_values(MYLDAP_ENTRY *entry,const char *attr) char **values; int rc; int i; + SET *set; /* check parameters */ if (!is_valid_entry(entry)) { @@ -1385,19 +1339,20 @@ const char **myldap_get_values(MYLDAP_ENTRY *entry,const char *attr) { /* we have a success code but no values, let's try to get ranged values */ - values=myldap_get_ranged_values(entry,attr); - if (values==NULL) + set=myldap_get_ranged_values(entry,attr); + if (set==NULL) return NULL; /* store values entry so we can free it later on */ for (i=0;i<MAX_RANGED_ATTRIBUTES_PER_ENTRY;i++) if (entry->rangedattributevalues[i]==NULL) { - entry->rangedattributevalues[i]=values; - return (const char **)values; + entry->rangedattributevalues[i]=(char **)set_tolist(set); + set_free(set); + return (const char **)entry->rangedattributevalues[i]; } /* we found no room to store the values */ log_log(LOG_ERR,"ldap_get_values() couldn't store results, increase MAX_RANGED_ATTRIBUTES_PER_ENTRY"); - free(values); + set_free(set); return NULL; } else @@ -1651,7 +1606,7 @@ int myldap_passwd( { log_log(LOG_ERR,"myldap_exop_passwd(): invalid parameter passed"); errno=EINVAL; - return NULL; + return LDAP_OTHER; } /* log the call */ log_log(LOG_DEBUG,"myldap_exop_passwd(userdn=\"%s\")",userdn); |