diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2010-10-03 23:57:11 +0200 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2010-10-03 23:57:11 +0200 |
commit | bebac035f67df5083daba4613c77cbc412faee86 (patch) | |
tree | a19f3e450cc3581bf88d02f5cc7fbaee0d7b623c /nss/group.c | |
parent | 7d3e113db9f89f3ed2fbe3854bd9e441a460483b (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.c | 216 |
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 */ |