diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2012-10-28 20:13:43 +0000 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2012-10-28 20:13:43 +0000 |
commit | ba1d1f76dfb4fa3f2a408e8b31537dc682f4bf3b (patch) | |
tree | 78815271bc29eb514eafe11a018e5e1098799a44 | |
parent | 8ae169e65c1e99c160d7765e9f4f17ec5894ff75 (diff) |
refactor the read_result() functions into a common macro and move all the Solaris-specific definitions to solnss.h
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1812 ef36b2f9-881f-0410-afb5-c4e39611909c
-rw-r--r-- | nss/Makefile.am | 2 | ||||
-rw-r--r-- | nss/common.h | 47 | ||||
-rw-r--r-- | nss/group.c | 35 | ||||
-rw-r--r-- | nss/hosts.c | 38 | ||||
-rw-r--r-- | nss/networks.c | 35 | ||||
-rw-r--r-- | nss/passwd.c | 35 | ||||
-rw-r--r-- | nss/protocols.c | 35 | ||||
-rw-r--r-- | nss/rpc.c | 35 | ||||
-rw-r--r-- | nss/services.c | 35 | ||||
-rw-r--r-- | nss/shadow.c | 35 | ||||
-rw-r--r-- | nss/solnss.h | 112 |
11 files changed, 125 insertions, 319 deletions
diff --git a/nss/Makefile.am b/nss/Makefile.am index 77fc091..6bb2b24 100644 --- a/nss/Makefile.am +++ b/nss/Makefile.am @@ -25,7 +25,7 @@ noinst_PROGRAMS = nss_ldap.so AM_CPPFLAGS=-I$(top_srcdir) AM_CFLAGS = -fPIC -nss_ldap_so_SOURCES = common.c common.h prototypes.h \ +nss_ldap_so_SOURCES = common.c common.h prototypes.h solnss.h \ ../nslcd.h ../common/nslcd-prot.h \ ../compat/attrs.h EXTRA_nss_ldap_so_SOURCES = aliases.c ethers.c group.c hosts.c netgroup.c \ diff --git a/nss/common.h b/nss/common.h index e620a5c..b75f4a4 100644 --- a/nss/common.h +++ b/nss/common.h @@ -31,6 +31,10 @@ #include "compat/attrs.h" #include "compat/nss_compat.h" +#ifdef NSS_FLAVOUR_SOLARIS +#include "solnss.h" +#endif /* NSS_FLAVOUR_SOLARIS */ + /* These are macros for handling read and write problems, they are NSS specific due to the return code so are defined here. They genrally close the open file, set an error code and return with @@ -90,49 +94,6 @@ #endif /* NSS_FLAVOUR_GLIBC */ -#ifdef NSS_FLAVOUR_SOLARIS - -/* extra definitions we need (Solaris NSS functions don't pass errno) - also clear the output values */ -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN -#define NSS_EXTRA_DEFS \ - int *errnop=&(errno); \ - NSS_ARGS(args)->returnval=NULL; \ - NSS_ARGS(args)->returnlen=0; \ - NSS_ARGS(args)->erange=0; \ - NSS_ARGS(args)->h_errno=0; -#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ -#define NSS_EXTRA_DEFS \ - int *errnop=&(errno); \ - NSS_ARGS(args)->returnval=NULL; \ - NSS_ARGS(args)->erange=0; \ - NSS_ARGS(args)->h_errno=0; -#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - -/* check validity of passed buffer (Solaris flavour) */ -#define NSS_BUFCHECK \ - if ((NSS_ARGS(args)->buf.buffer==NULL)||(NSS_ARGS(args)->buf.buflen<=0)) \ - { \ - NSS_ARGS(args)->erange=1; \ - return NSS_STATUS_TRYAGAIN; \ - } - -/* this is the backend structure for Solaris */ -struct nss_ldap_backend -{ - nss_backend_op_t *ops; /* function-pointer table */ - int n_ops; /* number of function pointers */ - TFILE *fp; /* the file pointer for {set,get,end}ent() functions */ -}; - -/* constructor for LDAP backends */ -nss_backend_t *nss_ldap_constructor(nss_backend_op_t *ops,size_t sizeofops); - -/* destructor for LDAP backends */ -nss_status_t nss_ldap_destructor(nss_backend_t *be,void UNUSED(*args)); - -#endif /* NSS_FLAVOUR_SOLARIS */ - /* The following macros to automatically generate get..byname(), get..bynumber(), setent(), getent() and endent() function bodies. These functions have very common code so this can diff --git a/nss/group.c b/nss/group.c index b2d1cac..e2f9326 100644 --- a/nss/group.c +++ b/nss/group.c @@ -215,40 +215,7 @@ static char *group2str(struct group *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct group result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_group(fp,&result,buffer,args->buf.buflen,&args->erange); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (group2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_group(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(group,&args->erange); } static nss_status_t group_getgrnam(nss_backend_t UNUSED(*be),void *args) diff --git a/nss/hosts.c b/nss/hosts.c index 8ba4a60..86b6a77 100644 --- a/nss/hosts.c +++ b/nss/hosts.c @@ -250,43 +250,7 @@ static char *hostent2str(struct hostent *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,int af,int retry,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct hostent result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer*/ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_hostent(fp,&result,buffer,args->buf.buflen,&args->erange,&args->h_errno,af,retry); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (hostent2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_hostent(fp,args->buf.result,args->buf.buffer,args->buf.buflen, - &args->erange,&args->h_errno,af,retry); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(hostent,&args->erange,&args->h_errno,af,retry); } /* hack to set the correct h_errno */ diff --git a/nss/networks.c b/nss/networks.c index be9e963..859ef0e 100644 --- a/nss/networks.c +++ b/nss/networks.c @@ -185,40 +185,7 @@ static char *netent2str(struct netent *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct netent result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_netent(fp,&result,buffer,args->buf.buflen,&args->erange,&args->h_errno); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (netent2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_netent(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange,&args->h_errno); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(netent,&args->erange,&args->h_errno); } /* more of a dirty hack */ diff --git a/nss/passwd.c b/nss/passwd.c index 113c92d..43694ef 100644 --- a/nss/passwd.c +++ b/nss/passwd.c @@ -113,40 +113,7 @@ static char *passwd2str(struct passwd *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct passwd result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_passwd(fp,&result,buffer,args->buf.buflen,&args->erange); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (passwd2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_passwd(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(passwd,&args->erange); } static nss_status_t passwd_getpwnam(nss_backend_t UNUSED(*be),void *args) diff --git a/nss/protocols.c b/nss/protocols.c index 29dcb5f..4c9279f 100644 --- a/nss/protocols.c +++ b/nss/protocols.c @@ -115,40 +115,7 @@ static char *protoent2str(struct protoent *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct protoent result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_protoent(fp,&result,buffer,args->buf.buflen,&args->erange); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (protoent2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_protoent(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(protoent,&args->erange); } static nss_status_t protocols_getprotobyname(nss_backend_t UNUSED(*be),void *args) @@ -115,40 +115,7 @@ static char *rpcent2str(struct rpcent *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct rpcent result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_rpcent(fp,&result,buffer,args->buf.buflen,&args->erange); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (rpcent2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_rpcent(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(rpcent,&args->erange); } static nss_status_t rpc_getrpcbyname(nss_backend_t UNUSED(*be),void *args) diff --git a/nss/services.c b/nss/services.c index 49c2e54..92190b9 100644 --- a/nss/services.c +++ b/nss/services.c @@ -119,40 +119,7 @@ static char *servent2str(struct servent *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct servent result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_servent(fp,&result,buffer,args->buf.buflen,&args->erange); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (servent2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_servent(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(servent,&args->erange); } static nss_status_t services_getservbyname(nss_backend_t UNUSED(*be),void *args) diff --git a/nss/shadow.c b/nss/shadow.c index 8ab928e..cba7cfb 100644 --- a/nss/shadow.c +++ b/nss/shadow.c @@ -123,40 +123,7 @@ static char *spwd2str(struct spwd *result,char *buffer,size_t buflen) static nss_status_t read_result(TFILE *fp,nss_XbyY_args_t *args) { - nss_status_t retv; -#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN - struct spwd result; - char *buffer; - /* try to return in string format if requested */ - if (args->buf.result==NULL) - { - /* read the entry into a temporary buffer */ - buffer=(char *)malloc(args->buf.buflen); - if (buffer==NULL) - return NSS_STATUS_UNAVAIL; - retv=read_spwd(fp,&result,buffer,args->buf.buflen,&args->erange); - /* format to string */ - if (retv==NSS_STATUS_SUCCESS) - if (spwd2str(&result,args->buf.buffer,args->buf.buflen)==NULL) - { - args->erange=1; - retv=NSS_NOTFOUND; - } - /* clean up and return result */ - free(buffer); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.buffer; - args->returnlen=strlen(args->returnval); - return NSS_STATUS_SUCCESS; - } -#endif /* HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ - /* read the entry */ - retv=read_spwd(fp,args->buf.result,args->buf.buffer,args->buf.buflen,&args->erange); - if (retv!=NSS_STATUS_SUCCESS) - return retv; - args->returnval=args->buf.result; - return NSS_STATUS_SUCCESS; + READ_RESULT(spwd,&args->erange); } static nss_status_t shadow_getspnam(nss_backend_t UNUSED(*be),void *args) diff --git a/nss/solnss.h b/nss/solnss.h new file mode 100644 index 0000000..b71b2ec --- /dev/null +++ b/nss/solnss.h @@ -0,0 +1,112 @@ +/* + solnss.h - common functions for NSS lookups on Solaris + + Copyright (C) 2012 Arthur de Jong + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA +*/ + +#ifndef NSS__SOLNSS_H +#define NSS__SOLNSS_H 1 +#ifdef NSS_FLAVOUR_SOLARIS + +/* extra definitions we need (Solaris NSS functions don't pass errno) + also clear the output values */ +#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN +#define NSS_EXTRA_DEFS \ + int *errnop=&(errno); \ + NSS_ARGS(args)->returnval=NULL; \ + NSS_ARGS(args)->returnlen=0; \ + NSS_ARGS(args)->erange=0; \ + NSS_ARGS(args)->h_errno=0; +#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ +#define NSS_EXTRA_DEFS \ + int *errnop=&(errno); \ + NSS_ARGS(args)->returnval=NULL; \ + NSS_ARGS(args)->erange=0; \ + NSS_ARGS(args)->h_errno=0; +#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ + +/* check validity of passed buffer (Solaris flavour) */ +#define NSS_BUFCHECK \ + if ((NSS_ARGS(args)->buf.buffer==NULL)||(NSS_ARGS(args)->buf.buflen<=0)) \ + { \ + NSS_ARGS(args)->erange=1; \ + return NSS_STATUS_TRYAGAIN; \ + } + +/* wrapper function body for read_xxxent that does the buffer handling, + return code handling and conversion to strings for nscd + (also see READ_RESULT_STRING below) */ +#define READ_RESULT(ent,extra...) \ + nss_status_t retv; \ + READ_RESULT_STRING(ent,##extra) \ + /* read the entry */ \ + retv=read_##ent(fp,args->buf.result,args->buf.buffer,args->buf.buflen,##extra); \ + if (retv!=NSS_STATUS_SUCCESS) \ + return retv; \ + args->returnval=args->buf.result; \ + return NSS_STATUS_SUCCESS; + +/* provide result handling for when libc (or nscd) expects the returned + values to be in string format */ +#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN +#define READ_RESULT_STRING(ent,extra...) \ + struct ent result; \ + char *buffer; \ + /* try to return in string format if requested */ \ + if (args->buf.result==NULL) \ + { \ + /* read the entry into a temporary buffer */ \ + buffer=(char *)malloc(args->buf.buflen); \ + if (buffer==NULL) \ + return NSS_STATUS_UNAVAIL; \ + retv=read_##ent(fp,&result,buffer,args->buf.buflen,##extra); \ + /* format to string */ \ + if (retv==NSS_STATUS_SUCCESS) \ + if (ent##2str(&result,args->buf.buffer,args->buf.buflen)==NULL) \ + { \ + args->erange=1; \ + retv=NSS_NOTFOUND; \ + } \ + /* clean up and return result */ \ + free(buffer); \ + if (retv!=NSS_STATUS_SUCCESS) \ + return retv; \ + args->returnval=args->buf.buffer; \ + args->returnlen=strlen(args->returnval); \ + return NSS_STATUS_SUCCESS; \ + } +#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ +#define READ_RESULT_STRING(ent,extra...) ; +#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */ + +/* this is the backend structure for Solaris */ +struct nss_ldap_backend +{ + nss_backend_op_t *ops; /* function-pointer table */ + int n_ops; /* number of function pointers */ + TFILE *fp; /* the file pointer for {set,get,end}ent() functions */ +}; + +/* constructor for LDAP backends */ +nss_backend_t *nss_ldap_constructor(nss_backend_op_t *ops,size_t sizeofops); + +/* destructor for LDAP backends */ +nss_status_t nss_ldap_destructor(nss_backend_t *be,void UNUSED(*args)); + +#endif /* NSS_FLAVOUR_SOLARIS */ +#endif /* not NSS__COMMON_H */ |