Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nss
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2006-11-16 13:50:27 +0100
committerArthur de Jong <arthur@arthurdejong.org>2006-11-16 13:50:27 +0100
commit4bbb60e380e068cf4bd49e8468957c55a5199259 (patch)
tree6c121042348f99ee3392c56c1e3ff72a2f3efe7f /nss
parentfc0578b5d55645ad060f3a64697a2ed79e88e8e6 (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.c30
-rw-r--r--nss/common.h40
-rw-r--r--nss/ethers.c56
-rw-r--r--nss/group.c43
-rw-r--r--nss/hosts.c8
-rw-r--r--nss/networks.c4
-rw-r--r--nss/passwd.c43
-rw-r--r--nss/shadow.c25
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)