Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nss/group.c
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2010-10-03 23:57:11 +0200
committerArthur de Jong <arthur@arthurdejong.org>2010-10-03 23:57:11 +0200
commitbebac035f67df5083daba4613c77cbc412faee86 (patch)
treea19f3e450cc3581bf88d02f5cc7fbaee0d7b623c /nss/group.c
parent7d3e113db9f89f3ed2fbe3854bd9e441a460483b (diff)
first attempt to split Solaris and Glibc code more and determine NSS flavour in configure script
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd-solaris@1236 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nss/group.c')
-rw-r--r--nss/group.c216
1 files changed, 115 insertions, 101 deletions
diff --git a/nss/group.c b/nss/group.c
index dadac67..2e3013d 100644
--- a/nss/group.c
+++ b/nss/group.c
@@ -48,9 +48,7 @@ static nss_status_t read_group(
gids of these groups to the list */
static nss_status_t read_gids(
TFILE *fp,gid_t skipgroup,long int *start,
-#ifndef HAVE_NSSWITCH_H
long int *size,
-#endif /* HAVE_NSSWITCH_H */
gid_t **groupsp,long int limit,int *errnop)
{
int32_t res=(int32_t)NSLCD_RESULT_BEGIN;
@@ -76,7 +74,7 @@ static nss_status_t read_gids(
if ( (limit>0) && (*start>=limit) )
return NSS_STATUS_TRYAGAIN;
/* check if our buffer is large enough */
-#ifndef HAVE_NSSWITCH_H
+#ifdef NSS_FLAVOUR_GLIBC
if ((*start)>=(*size))
{
/* for some reason Glibc expects us to grow the array (completely
@@ -92,8 +90,8 @@ static nss_status_t read_gids(
*groupsp=newgroups;
*size=newsize;
}
+#endif /* NSS_FLAVOUR_GLIBC */
/* add gid to list */
-#endif /* HAVE_NSSWITCH_H */
(*groupsp)[(*start)++]=gid;
}
/* read next response code
@@ -105,30 +103,47 @@ static nss_status_t read_gids(
return NSS_STATUS_SUCCESS;
}
-#ifdef HAVE_NSSWITCH_H
-nss_status_t _nss_nslcd_getgrnam_r(
-#else /* not HAVE_NSSWITCH_H */
+#ifdef NSS_FLAVOUR_GLIBC
+
nss_status_t _nss_ldap_getgrnam_r(
-#endif /* HAVE_NSSWITCH_H */
const char *name,struct group *result,char *buffer,
size_t buflen,int *errnop)
{
- NSS_BYNAME(NSLCD_ACTION_GROUP_BYNAME,
+ NSS_BYNAME(NSLCD_ACTION_GROUP_BYNAME,buffer,buflen,
name,
read_group(fp,result,buffer,buflen,errnop));
+ return retv;
}
-#ifdef HAVE_NSSWITCH_H
-nss_status_t _nss_nslcd_getgrgid_r(
-#else /* not HAVE_NSSWITCH_H */
nss_status_t _nss_ldap_getgrgid_r(
-#endif /* HAVE_NSSWITCH_H */
gid_t gid,struct group *result,char *buffer,
size_t buflen,int *errnop)
{
- NSS_BYTYPE(NSLCD_ACTION_GROUP_BYGID,
+ NSS_BYTYPE(NSLCD_ACTION_GROUP_BYGID,buffer,buflen,
gid,gid_t,
read_group(fp,result,buffer,buflen,errnop));
+ return retv;
+}
+
+/* thread-local file pointer to an ongoing request */
+static __thread TFILE *grentfp;
+
+nss_status_t _nss_ldap_setgrent(int UNUSED(stayopen))
+{
+ NSS_SETENT(grentfp);
+}
+
+nss_status_t _nss_ldap_getgrent_r(
+ struct group *result,char *buffer,size_t buflen,int *errnop)
+{
+ NSS_GETENT(grentfp,NSLCD_ACTION_GROUP_ALL,buffer,buflen,
+ read_group(grentfp,result,buffer,buflen,errnop));
+ return retv;
+}
+
+nss_status_t _nss_ldap_endgrent(void)
+{
+ NSS_ENDENT(grentfp);
}
/* this function returns a list of groups, documentation for the
@@ -145,77 +160,38 @@ nss_status_t _nss_ldap_getgrgid_r(
*/
nss_status_t _nss_ldap_initgroups_dyn(
const char *user,gid_t skipgroup,long int *start,
-#ifndef HAVE_NSSWITCH_H
long int *size,
-#endif /* HAVE_NSSWITCH_H */
gid_t **groupsp,long int limit,int *errnop)
{
-#ifdef HAVE_NSSWITCH_H
- long int buffer_size=limit;
- long int *size=&buffer_size;
-#endif /* HAVE_NSSWITCH_H */
-/* temporarily map the buffer and buflen names so the check in NSS_BYNAME
- for validity of the buffer works (renaming the parameters may cause
- confusion) */
-#define buffer groupsp
-#define buflen *size
-#ifdef HAVE_NSSWITCH_H
- NSS_BYNAME(NSLCD_ACTION_GROUP_BYMEMBER,
- user,
- read_gids(fp,skipgroup,start,groupsp,limit,errnop));
-#else /* not HAVE_NSSWITCH_H */
- NSS_BYNAME(NSLCD_ACTION_GROUP_BYMEMBER,
+ NSS_BYNAME(NSLCD_ACTION_GROUP_BYMEMBER,groupsp,*size,
user,
read_gids(fp,skipgroup,start,size,groupsp,limit,errnop));
-#endif /* not HAVE_NSSWITCH_H */
-#undef buffer
-#undef buflen
+ return retv;
}
-/* thread-local file pointer to an ongoing request */
-static __thread TFILE *grentfp;
-
-#ifdef HAVE_NSSWITCH_H
-nss_status_t _nss_ldap_setgrent(nss_backend_t *gr_context,void *args)
-#else /* not HAVE_NSSWITCH_H */
-nss_status_t _nss_ldap_setgrent(int UNUSED(stayopen))
-#endif /* HAVE_NSSWITCH_H */
-{
- NSS_SETENT(grentfp);
-}
+#endif /* NSS_FLAVOUR_GLIBC */
-#ifdef HAVE_NSSWITCH_H
-nss_status_t _nss_nslcd_getgrent_r(
-#else /* not HAVE_NSSWITCH_H */
-nss_status_t _nss_ldap_getgrent_r(
-#endif /* HAVE_NSSWITCH_H */
- struct group *result,char *buffer,size_t buflen,int *errnop)
-{
- NSS_GETENT(grentfp,NSLCD_ACTION_GROUP_ALL,
- read_group(grentfp,result,buffer,buflen,errnop));
-}
+#ifdef NSS_FLAVOUR_SOLARIS
-#ifdef HAVE_NSSWITCH_H
-nss_status_t _nss_ldap_endgrent(nss_backend_t *gr_context,void *args)
-#else /* not HAVE_NSSWITCH_H */
-nss_status_t _nss_ldap_endgrent(void)
-#endif /* HAVE_NSSWITCH_H */
+static nss_status_t _nss_nslcd_getgrnam_r(
+ const char *name,struct group *result,char *buffer,
+ size_t buflen,int *errnop)
{
- NSS_ENDENT(grentfp);
+ NSS_BYNAME(NSLCD_ACTION_GROUP_BYNAME,buffer,buflen,
+ name,
+ read_group(fp,result,buffer,buflen,errnop));
+ return retv;
}
-#ifdef HAVE_NSSWITCH_H
-
-static nss_status_t _nss_ldap_getgrnam_r(nss_backend_t *be,void *args)
+static nss_status_t _xnss_ldap_getgrnam_r(nss_backend_t *UNUSED(be),void *args)
{
- char *name=(char *)NSS_ARGS(args)->key.name;
struct group priv_gr;
struct group *gr=NSS_ARGS(args)->buf.result?(struct group *)NSS_ARGS(args)->buf.result:&priv_gr;
char *data_ptr;
char *buffer=NSS_ARGS(args)->buf.buffer;
size_t buflen=NSS_ARGS(args)->buf.buflen;
nss_status_t status;
- status=_nss_nslcd_getgrnam_r(name,gr,buffer,buflen,&errno);
+ status=_nss_nslcd_getgrnam_r(NSS_ARGS(args)->key.name,gr,buffer,buflen,&errno);
if (status!=NSS_STATUS_SUCCESS)
return status;
if (!NSS_ARGS(args)->buf.result)
@@ -245,7 +221,17 @@ static nss_status_t _nss_ldap_getgrnam_r(nss_backend_t *be,void *args)
return status;
}
-static nss_status_t _nss_ldap_getgrgid_r(nss_backend_t *be,void *args)
+static nss_status_t _nss_nslcd_getgrgid_r(
+ gid_t gid,struct group *result,char *buffer,
+ size_t buflen,int *errnop)
+{
+ NSS_BYTYPE(NSLCD_ACTION_GROUP_BYGID,buffer,buflen,
+ gid,gid_t,
+ read_group(fp,result,buffer,buflen,errnop));
+ return retv;
+}
+
+static nss_status_t _xnss_ldap_getgrgid_r(nss_backend_t *UNUSED(be),void *args)
{
gid_t gid=NSS_ARGS(args)->key.gid;
struct group priv_gr;
@@ -284,7 +270,20 @@ static nss_status_t _nss_ldap_getgrgid_r(nss_backend_t *be,void *args)
return status;
}
-static nss_status_t _nss_ldap_getgrent_r(nss_backend_t *gr_context,void *args)
+static nss_status_t _xnss_ldap_setgrent(nss_backend_t *UNUSED(be),void *UNUSED(args))
+{
+ NSS_SETENT(grentfp);
+}
+
+static nss_status_t _nss_nslcd_getgrent_r(
+ struct group *result,char *buffer,size_t buflen,int *errnop)
+{
+ NSS_GETENT(grentfp,NSLCD_ACTION_GROUP_ALL,buffer,buflen,
+ read_group(grentfp,result,buffer,buflen,errnop));
+ return retv;
+}
+
+static nss_status_t _xnss_ldap_getgrent_r(nss_backend_t *UNUSED(be),void *args)
{
struct group priv_gr;
struct group *gr=NSS_ARGS(args)->buf.result?(struct group *)NSS_ARGS(args)->buf.result:&priv_gr;
@@ -292,12 +291,9 @@ static nss_status_t _nss_ldap_getgrent_r(nss_backend_t *gr_context,void *args)
char *buffer=NSS_ARGS(args)->buf.buffer;
size_t buflen=NSS_ARGS(args)->buf.buflen;
nss_status_t status;
-
status=_nss_nslcd_getgrent_r(gr,buffer,buflen,&errno);
-
if (status!=NSS_STATUS_SUCCESS)
return status;
-
if (!NSS_ARGS(args)->buf.result)
{
/* result==NULL, return file format */
@@ -315,7 +311,6 @@ static nss_status_t _nss_ldap_getgrent_r(nss_backend_t *gr_context,void *args)
}
strcpy(NSS_ARGS(args)->buf.buffer,data_ptr);
free(data_ptr);
-
NSS_ARGS(args)->returnval=NSS_ARGS(args)->buf.buffer;
NSS_ARGS(args)->returnlen=strlen(NSS_ARGS(args)->buf.buffer);
}
@@ -326,58 +321,77 @@ static nss_status_t _nss_ldap_getgrent_r(nss_backend_t *gr_context,void *args)
return status;
}
-static nss_status_t _nss_ldap_group_destr(nss_backend_t *gr_context,void *args)
+static nss_status_t _xnss_ldap_endgrent(nss_backend_t *UNUSED(be),void *UNUSED(args))
{
- return _nss_ldap_default_destr(gr_context,args);
+ NSS_ENDENT(grentfp);
}
-static nss_status_t _nss_ldap_getgroupsbymember_r(nss_backend_t *gr_context,void *args)
+/* this function returns a list of groups, documentation for the
+ interface is scarce (any pointers are welcome) but this is
+ what is assumed the parameters mean:
+
+ user IN - the user name to find groups for
+ skipgroup IN - a group to not include in the list
+ *start IN/OUT - where to write in the array, is incremented
+ **groupsp IN/OUT - pointer to the array of returned groupids
+ limit IN - the maxium size of the array
+ *errnop OUT - for returning errno
+*/
+static nss_status_t _xnss_ldap_initgroups_dyn(
+ const char *user,gid_t skipgroup,long int *start,
+ gid_t **groupsp,long int limit,int *errnop)
+{
+ NSS_BYNAME(NSLCD_ACTION_GROUP_BYMEMBER,groupsp,limit,
+ user,
+ read_gids(fp,skipgroup,start,&limit,groupsp,limit,errnop));
+ return retv;
+}
+
+static nss_status_t _xnss_ldap_getgroupsbymember_r(nss_backend_t *UNUSED(be),void *args)
{
struct nss_groupsbymem *argp=(struct nss_groupsbymem *)args;
- char *user=(char *)argp->username;
nss_status_t status;
- long int limit=(long int) argp->maxgids;
- long int start=(long int) argp->numgids;
+ long int limit=(long int)argp->maxgids;
+ long int start=(long int)argp->numgids;
gid_t skipgroup;
- int i;
-
- if (start > 0)
+ if (start>0)
skipgroup=argp->gid_array[0];
-
- status=_nss_ldap_initgroups_dyn(
- user,
- (start > 0)?skipgroup:-1,
+ status=_xnss_ldap_initgroups_dyn(
+ argp->username,
+ (start>0)?skipgroup:(gid_t)-1,
&start,
(gid_t **)&argp->gid_array,
limit,
&errno);
argp->numgids=(int)start;
-
return status;
}
+static nss_status_t _xnss_ldap_group_destr(nss_backend_t *be,void *UNUSED(args))
+{
+ free(be);
+ return NSS_STATUS_SUCCESS;
+}
+
static nss_backend_op_t group_ops[]={
- _nss_ldap_group_destr,
- _nss_ldap_endgrent,
- _nss_ldap_setgrent,
- _nss_ldap_getgrent_r,
- _nss_ldap_getgrnam_r,
- _nss_ldap_getgrgid_r,
- _nss_ldap_getgroupsbymember_r
+ _xnss_ldap_group_destr,
+ _xnss_ldap_endgrent,
+ _xnss_ldap_setgrent,
+ _xnss_ldap_getgrent_r,
+ _xnss_ldap_getgrnam_r,
+ _xnss_ldap_getgrgid_r,
+ _xnss_ldap_getgroupsbymember_r
};
-nss_backend_t *_nss_ldap_group_constr(const char *db_name,
- const char *src_name,const char *cfg_args)
+nss_backend_t *_nss_ldap_group_constr(const char *UNUSED(db_name),
+ const char *UNUSED(src_name),const char *UNUSED(cfg_args))
{
- nss_ldap_backend_t *be;
- if (!(be=(nss_ldap_backend_t *)malloc(sizeof(*be))))
+ nss_backend_t *be;
+ if (!(be=(nss_backend_t *)malloc(sizeof(*be))))
return NULL;
be->ops=group_ops;
be->n_ops=sizeof(group_ops)/sizeof(nss_backend_op_t);
- /* a NOOP at the moment */
- if (_nss_ldap_default_constr(be)!=NSS_STATUS_SUCCESS)
- return NULL;
return (nss_backend_t *)be;
}
-#endif /* HAVE_NSSWITCH_H */
+#endif /* NSS_FLAVOUR_SOLARIS */