Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nslcd
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2009-12-13 11:27:33 +0100
committerArthur de Jong <arthur@arthurdejong.org>2009-12-13 11:27:33 +0100
commitef8cc767b201e4798a060282d4a6f280094bb8cc (patch)
tree4f19eae6870321f280959be4b7b24cd0e38d4c2a /nslcd
parent7dd703c9af5f8b4a50f056c47588a9e51d4ea681 (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.c33
-rw-r--r--nslcd/myldap.c67
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);