Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nss/common.h
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/common.h
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/common.h')
-rw-r--r--nss/common.h40
1 files changed, 37 insertions, 3 deletions
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() \