diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2006-11-16 13:50:27 +0100 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2006-11-16 13:50:27 +0100 |
commit | 4bbb60e380e068cf4bd49e8468957c55a5199259 (patch) | |
tree | 6c121042348f99ee3392c56c1e3ff72a2f3efe7f /nss | |
parent | fc0578b5d55645ad060f3a64697a2ed79e88e8e6 (diff) |
switch to a simpler and more compact framework to generate methods (one reader function to deserialize a struct from the stream and auto-generated functions)
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/libnss_ldapd@92 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nss')
-rw-r--r-- | nss/aliases.c | 30 | ||||
-rw-r--r-- | nss/common.h | 40 | ||||
-rw-r--r-- | nss/ethers.c | 56 | ||||
-rw-r--r-- | nss/group.c | 43 | ||||
-rw-r--r-- | nss/hosts.c | 8 | ||||
-rw-r--r-- | nss/networks.c | 4 | ||||
-rw-r--r-- | nss/passwd.c | 43 | ||||
-rw-r--r-- | nss/shadow.c | 25 |
8 files changed, 105 insertions, 144 deletions
diff --git a/nss/aliases.c b/nss/aliases.c index 2674d9c..70a619f 100644 --- a/nss/aliases.c +++ b/nss/aliases.c @@ -36,30 +36,27 @@ #define ALIAS_NAME result->alias_name #define ALIAS_RCPTS result->alias_members -enum nss_status _nss_ldap_getaliasbyname_r( - const char *name,struct aliasent *result, +static enum nss_status read_aliasent( + FILE *fp,struct aliasent *result, char *buffer,size_t buflen,int *errnop) { - FILE *fp; - size_t bufptr=0; int32_t tmpint32,tmp2int32; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_ALIAS_BYNAME); - WRITE_STRING(fp,name); - WRITE_FLUSH(fp); - /* read response header */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_ALIAS_BYNAME); - /* read response */ - READ_RESPONSE_CODE(fp); + size_t bufptr=0; + /* auto-genereted read code */ LDF_ALIAS; /* fill in remaining gaps in struct */ result->alias_local=0; - /* close socket and we're done */ - fclose(fp); + /* we're done */ return NSS_STATUS_SUCCESS; } +enum nss_status _nss_ldap_getaliasbyname_r( + const char *name,struct aliasent *result, + char *buffer,size_t buflen,int *errnop) +{ + NSS_BYNAME(NSLCD_ACTION_ALIAS_BYNAME,name,read_aliasent); +} + /* thread-local file pointer to an ongoing request */ static __thread FILE *aliasentfp; #define fp aliasentfp @@ -71,8 +68,7 @@ enum nss_status _nss_ldap_setaliasent(void) enum nss_status _nss_ldap_getaliasent_r(struct aliasent *result,char *buffer,size_t buflen,int *errnop) { - int32_t tmp2int32; - NSS_GETENT(LDF_ALIAS); + NSS_GETENT(read_aliasent); } enum nss_status _nss_ldap_endaliasent(void) diff --git a/nss/common.h b/nss/common.h index 0dbee34..8eb6ee9 100644 --- a/nss/common.h +++ b/nss/common.h @@ -59,6 +59,37 @@ enum nss_status nslcd2nss(int code); /* helper macros available to easily generate {set,get,end}ent functions */ +#define NSS_BYGEN(action,param,readfn) \ + FILE *fp; \ + int32_t tmpint32; \ + enum nss_status retv; \ + /* open socket and write request */ \ + OPEN_SOCK(fp); \ + WRITE_REQUEST(fp,action); \ + param; \ + WRITE_FLUSH(fp); \ + /* read response header */ \ + READ_RESPONSEHEADER(fp,action); \ + /* read response */ \ + READ_RESPONSE_CODE(fp); \ + readfn(fp,result,buffer,buflen,errnop); \ + retv=readfn(fp,result,buffer,buflen,errnop); \ + /* check read result */ \ + if (retv!=NSS_STATUS_SUCCESS) \ + return retv; \ + /* close socket and we're done */ \ + fclose(fp); \ + return NSS_STATUS_SUCCESS; + +#define NSS_BYNAME(action,name,readfn) \ + NSS_BYGEN(action,WRITE_STRING(fp,name),readfn) + +#define NSS_BYTYPE(action,val,type,readfn) \ + NSS_BYGEN(action,WRITE_TYPE(fp,val,type),readfn) + +#define NSS_BYINT32(action,val,readfn) \ + NSS_BYGEN(action,WRITE_INT32(fp,val),readfn) + #define NSS_SETENT(action) \ int32_t tmpint32; \ int errnocp; \ @@ -75,9 +106,9 @@ enum nss_status nslcd2nss(int code); READ_RESPONSEHEADER(fp,action); \ return NSS_STATUS_SUCCESS; -#define NSS_GETENT(type) \ +#define NSS_GETENT(readfn) \ int32_t tmpint32; \ - size_t bufptr=0; \ + enum nss_status retv; \ /* check that we have a valid file descriptor */ \ if (fp==NULL) \ { \ @@ -86,7 +117,10 @@ enum nss_status nslcd2nss(int code); } \ /* read a response */ \ READ_RESPONSE_CODE(fp); \ - type; \ + retv=readfn(fp,result,buffer,buflen,errnop); \ + /* check read result */ \ + if (retv!=NSS_STATUS_SUCCESS) \ + return retv; \ return NSS_STATUS_SUCCESS; #define NSS_ENDENT() \ diff --git a/nss/ethers.c b/nss/ethers.c index 6a475cf..13443f7 100644 --- a/nss/ethers.c +++ b/nss/ethers.c @@ -36,48 +36,32 @@ #define ETHER_NAME result->e_name #define ETHER_ADDR result->e_addr -/* map a hostname to the corresponding ethernet address */ -enum nss_status _nss_ldap_gethostton_r( - const char *name,struct etherent *result, +static enum nss_status read_etherent( + FILE *fp,struct etherent *result, char *buffer,size_t buflen,int *errnop) { - FILE *fp; int32_t tmpint32; size_t bufptr=0; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_ETHER_BYNAME); - WRITE_STRING(fp,name); - WRITE_FLUSH(fp); - /* read response */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_ETHER_BYNAME); - READ_RESPONSE_CODE(fp); + /* auto-genereted read code */ LDF_ETHER; - /* close socket and we're done */ - fclose(fp); + /* we're done */ return NSS_STATUS_SUCCESS; } +/* map a hostname to the corresponding ethernet address */ +enum nss_status _nss_ldap_gethostton_r( + const char *name,struct etherent *result, + char *buffer,size_t buflen,int *errnop) +{ + NSS_BYNAME(NSLCD_ACTION_ETHER_BYNAME,name,read_etherent); +} + /* map an ethernet address to the corresponding hostname */ enum nss_status _nss_ldap_getntohost_r( const struct ether_addr *addr,struct etherent *result, char *buffer,size_t buflen,int *errnop) { - FILE *fp; - int32_t tmpint32; - size_t bufptr=0; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_ETHER_BYNAME); - WRITE_TYPE(fp,addr,u_int8_t[6]); - WRITE_FLUSH(fp); - /* read response */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_ETHER_BYNAME); - READ_RESPONSE_CODE(fp); - LDF_ETHER; - /* close socket and we're done */ - fclose(fp); - return NSS_STATUS_SUCCESS; + NSS_BYTYPE(NSLCD_ACTION_ETHER_BYETHER,addr,u_int8_t[6],read_etherent); } /* thread-local file pointer to an ongoing request */ @@ -93,19 +77,7 @@ enum nss_status _nss_ldap_getetherent_r( struct etherent *result, char *buffer,size_t buflen,int *errnop) { - int32_t tmpint32; - size_t bufptr=0; - /* check that we have a valid file descriptor */ - if (fp==NULL) - { - *errnop=ENOENT; - return NSS_STATUS_UNAVAIL; - } - /* read a response */ - READ_RESPONSE_CODE(fp); - LDF_ETHER; - /* return result code */ - return NSS_STATUS_SUCCESS; + NSS_GETENT(read_etherent); } enum nss_status _nss_ldap_endetherent(void) diff --git a/nss/group.c b/nss/group.c index b25ae81..cdac7d5 100644 --- a/nss/group.c +++ b/nss/group.c @@ -39,42 +39,26 @@ #define GROUP_GID result->gr_gid #define GROUP_MEMBERS result->gr_mem -enum nss_status _nss_ldap_getgrnam_r(const char *name,struct group *result,char *buffer,size_t buflen,int *errnop) +static enum nss_status read_group( + FILE *fp,struct group *result, + char *buffer,size_t buflen,int *errnop) { - FILE *fp; - size_t bufptr=0; int32_t tmpint32,tmp2int32,tmp3int32; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_GROUP_BYNAME); - WRITE_STRING(fp,name); - WRITE_FLUSH(fp); - /* read response */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_GROUP_BYNAME); - READ_RESPONSE_CODE(fp); + size_t bufptr=0; + /* auto-genereted read code */ LDF_GROUP; - /* close socket and we're done */ - fclose(fp); + /* we're done */ return NSS_STATUS_SUCCESS; } +enum nss_status _nss_ldap_getgrnam_r(const char *name,struct group *result,char *buffer,size_t buflen,int *errnop) +{ + NSS_BYNAME(NSLCD_ACTION_GROUP_BYNAME,name,read_group); +} + enum nss_status _nss_ldap_getgrgid_r(gid_t gid,struct group *result,char *buffer,size_t buflen,int *errnop) { - FILE *fp; - size_t bufptr=0; - int32_t tmpint32,tmp2int32,tmp3int32; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_GROUP_BYGID); - WRITE_TYPE(fp,gid,gid_t); - WRITE_FLUSH(fp); - /* read response */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_GROUP_BYGID); - READ_RESPONSE_CODE(fp); - LDF_GROUP; - /* close socket and we're done */ - fclose(fp); - return NSS_STATUS_SUCCESS; + NSS_BYTYPE(NSLCD_ACTION_GROUP_BYGID,gid,gid_t,read_group); } /* this function returns a list of groups, documentation for the @@ -147,8 +131,7 @@ enum nss_status _nss_ldap_setgrent(int stayopen) enum nss_status _nss_ldap_getgrent_r(struct group *result,char *buffer,size_t buflen,int *errnop) { - int32_t tmp2int32,tmp3int32; - NSS_GETENT(LDF_GROUP); + NSS_GETENT(read_group); } enum nss_status _nss_ldap_endgrent(void) diff --git a/nss/hosts.c b/nss/hosts.c index 30c0ec6..852b37d 100644 --- a/nss/hosts.c +++ b/nss/hosts.c @@ -52,7 +52,7 @@ specified address family, result is stored in result it will return NSS_STATUS_NOTFOUND if an empty entry was read (no addresses in the address family) */ -static enum nss_status host_readhostent( +static enum nss_status read_hostent( FILE *fp,int af,struct hostent *result, char *buffer,size_t buflen,int *errnop,int *h_errnop) { @@ -126,7 +126,7 @@ enum nss_status _nss_ldap_gethostbyname2_r( /* read response */ READ_RESPONSEHEADER(fp,NSLCD_ACTION_HOST_BYNAME); READ_RESPONSE_CODE(fp); - retv=host_readhostent(fp,af,result,buffer,buflen,errnop,h_errnop); + retv=read_hostent(fp,af,result,buffer,buflen,errnop,h_errnop); /* check read result */ if (retv==NSS_STATUS_NOTFOUND) { @@ -179,7 +179,7 @@ enum nss_status _nss_ldap_gethostbyaddr_r( /* read response */ READ_RESPONSEHEADER(fp,NSLCD_ACTION_HOST_BYADDR); READ_RESPONSE_CODE(fp); - retv=host_readhostent(fp,af,result,buffer,buflen,errnop,h_errnop); + retv=read_hostent(fp,af,result,buffer,buflen,errnop,h_errnop); /* check read result */ if (retv==NSS_STATUS_NOTFOUND) { @@ -221,7 +221,7 @@ enum nss_status _nss_ldap_gethostent_r( { /* read a response */ READ_RESPONSE_CODE(fp); - retv=host_readhostent(fp,AF_INET,result,buffer,buflen,errnop,h_errnop); + retv=read_hostent(fp,AF_INET,result,buffer,buflen,errnop,h_errnop); /* do another loop run if we read an ok address or */ } while ((retv==NSS_STATUS_SUCCESS)||(retv==NSS_STATUS_NOTFOUND)); diff --git a/nss/networks.c b/nss/networks.c index fac29a0..8c5ddb5 100644 --- a/nss/networks.c +++ b/nss/networks.c @@ -152,8 +152,8 @@ enum nss_status _nss_ldap_getnetbyaddr_r(uint32_t addr,int af,struct netent *res } /* thread-local file pointer to an ongoing request */ -static __thread FILE *hostentfp; -#define fp hostentfp +static __thread FILE *netentfp; +#define fp netentfp enum nss_status _nss_ldap_setnetent(int stayopen) { diff --git a/nss/passwd.c b/nss/passwd.c index 4862ad5..c544ec8 100644 --- a/nss/passwd.c +++ b/nss/passwd.c @@ -41,44 +41,25 @@ #define PASSWD_DIR result->pw_dir #define PASSWD_SHELL result->pw_shell -enum nss_status _nss_ldap_getpwnam_r(const char *name,struct passwd *result,char *buffer,size_t buflen,int *errnop) + +static enum nss_status read_passwd( + FILE *fp,struct passwd *result, + char *buffer,size_t buflen,int *errnop) { - FILE *fp; - size_t bufptr=0; int32_t tmpint32; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_PASSWD_BYNAME); - WRITE_STRING(fp,name); - WRITE_FLUSH(fp); - /* read response header */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_PASSWD_BYNAME); - /* read response */ - READ_RESPONSE_CODE(fp); + size_t bufptr=0; LDF_PASSWD; - /* close socket and we're done */ - fclose(fp); return NSS_STATUS_SUCCESS; } +enum nss_status _nss_ldap_getpwnam_r(const char *name,struct passwd *result,char *buffer,size_t buflen,int *errnop) +{ + NSS_BYNAME(NSLCD_ACTION_PASSWD_BYNAME,name,read_passwd); +} + enum nss_status _nss_ldap_getpwuid_r(uid_t uid,struct passwd *result,char *buffer,size_t buflen,int *errnop) { - FILE *fp; - size_t bufptr=0; - int32_t tmpint32; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_PASSWD_BYUID); - WRITE_TYPE(fp,uid,uid_t); - WRITE_FLUSH(fp); - /* read response header */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_PASSWD_BYUID); - /* read response */ - READ_RESPONSE_CODE(fp); - LDF_PASSWD; - /* close socket and we're done */ - fclose(fp); - return NSS_STATUS_SUCCESS; + NSS_BYTYPE(NSLCD_ACTION_PASSWD_BYUID,uid,uid_t,read_passwd); } /* thread-local file pointer to an ongoing request */ @@ -94,7 +75,7 @@ enum nss_status _nss_ldap_setpwent(int stayopen) /* read password data from an opened stream */ enum nss_status _nss_ldap_getpwent_r(struct passwd *result,char *buffer,size_t buflen,int *errnop) { - NSS_GETENT(LDF_PASSWD); + NSS_GETENT(read_passwd); } /* close the stream opened with setpwent() above */ diff --git a/nss/shadow.c b/nss/shadow.c index 62f55b3..4b2c9e2 100644 --- a/nss/shadow.c +++ b/nss/shadow.c @@ -43,26 +43,21 @@ #define SHADOW_EXPIRE result->sp_expire #define SHADOW_FLAG result->sp_flag -enum nss_status _nss_ldap_getspnam_r(const char *name,struct spwd *result,char *buffer,size_t buflen,int *errnop) +static enum nss_status read_spwd( + FILE *fp,struct spwd *result, + char *buffer,size_t buflen,int *errnop) { - FILE *fp; - size_t bufptr=0; int32_t tmpint32; - /* open socket and write request */ - OPEN_SOCK(fp); - WRITE_REQUEST(fp,NSLCD_ACTION_SHADOW_BYNAME); - WRITE_STRING(fp,name); - WRITE_FLUSH(fp); - /* read response header */ - READ_RESPONSEHEADER(fp,NSLCD_ACTION_SHADOW_BYNAME); - /* read response */ - READ_RESPONSE_CODE(fp); + size_t bufptr=0; LDF_SHADOW; - /* close socket and we're done */ - fclose(fp); return NSS_STATUS_SUCCESS; } +enum nss_status _nss_ldap_getspnam_r(const char *name,struct spwd *result,char *buffer,size_t buflen,int *errnop) +{ + NSS_BYNAME(NSLCD_ACTION_SHADOW_BYNAME,name,read_spwd); +} + /* thread-local file pointer to an ongoing request */ static __thread FILE *spentfp; #define fp spentfp @@ -74,7 +69,7 @@ enum nss_status _nss_ldap_setspent(int stayopen) enum nss_status _nss_ldap_getspent_r(struct spwd *result,char *buffer,size_t buflen,int *errnop) { - NSS_GETENT(LDF_SHADOW); + NSS_GETENT(read_spwd); } enum nss_status _nss_ldap_endspent(void) |