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/common.h | |
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/common.h')
-rw-r--r-- | nss/common.h | 40 |
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() \ |