summaryrefslogtreecommitdiff
path: root/nslcd/common.h
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd/common.h')
-rw-r--r--nslcd/common.h100
1 files changed, 54 insertions, 46 deletions
diff --git a/nslcd/common.h b/nslcd/common.h
index 6477284..ca543fb 100644
--- a/nslcd/common.h
+++ b/nslcd/common.h
@@ -101,56 +101,64 @@ void invalidator_do(enum nss_map_selector map);
#include "dispatch.h"
/* macros for generating service handling code */
-#define NSLCD_HANDLE(db, fn, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \
- int nslcd_##db##_##fn(TFILE *_handle_fp, struct session *_handle_session) \
- NSLCD_HANDLE_BODY(db, fn, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean)
-#define NSLCD_HANDLE_UID(db, fn, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \
- int nslcd_##db##_##fn(TFILE *_handle_fp, struct session *_handle_session, uid_t calleruid) \
- NSLCD_HANDLE_BODY(db, fn, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean)
-#define NSLCD_HANDLE_BODY(db, fn, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \
- { \
- /* define common variables */ \
- tentry *_handle_entry = NULL; \
- int _handle_rc = 1; \
- bool _handle_more = true; \
- fndecls \
- __extension__ int read(TFILE *fp) { fnread } \
- __extension__ tentry *search(struct session *session, \
- int *rcp, bool *more) { fnsearch } \
- __extension__ int write(TFILE *fp, tentry *entry) { fnwrite } \
- __extension__ void clean() { fnclean } \
- /* read request parameters */ \
- if ((_handle_rc = read(_handle_fp)) != 0) \
- return _handle_rc; \
- _handle_rc = 1; \
- /* validate request parameters */ \
- fncheck \
- /* write the response header */ \
- WRITE_INT32(_handle_fp, NSLCD_VERSION); \
- WRITE_INT32(_handle_fp, NSLCD_ACTION_##db##_##fn); \
- /* go over results */ \
- while ((_handle_entry = search(_handle_session, &_handle_rc, &_handle_more)) != NULL)\
- { \
- if ( write(_handle_fp, _handle_entry) ) { \
- clean(); \
- return -1; \
- } \
- if (! _handle_more) \
- break; \
- } \
- /* write the final result code */ \
- if (_handle_rc == 0) \
- { \
- WRITE_INT32(_handle_fp, NSLCD_RESULT_END); \
- } \
- clean(); \
- return 0; \
+#define NSLCD_HANDLE( db, fn, type_request, type_searchdat, type_entry, fnread, fncheck, fnsearch, fnwrite, fnclean) \
+ int nslcd_##db##_##fn(TFILE *_fp, struct session *_session) \
+ NSLCD_HANDLE_BODY(db, fn, type_request, type_searchdat, type_entry, fnread, fncheck, fnsearch, fnwrite, fnclean)
+#define NSLCD_HANDLE_UID(db, fn, type_request, type_searchdat, type_entry, fnread, fncheck, fnsearch, fnwrite, fnclean) \
+ int nslcd_##db##_##fn(TFILE *_fp, struct session *_session, uid_t calleruid) \
+ NSLCD_HANDLE_BODY(db, fn, type_request, type_searchdat, type_entry, fnread, fncheck, fnsearch, fnwrite, fnclean)
+#define NSLCD_HANDLE_BODY(_db, _fn, _type_request, _type_searchdat, _type_entry, _fnread, _fncheck, _fnsearch, _fnwrite, _fnclean) \
+ { \
+ /* define common variables */ \
+ int _rc = 1; \
+ _type_request _request; memset(&_request, 0, sizeof(_request)); \
+ _type_searchdat _searchdat; memset(&_searchdat, 0, sizeof(_searchdat)); \
+ _type_entry *_entry = NULL; \
+ __extension__ int _read(TFILE *fp, __typeof__(_request) *req) \
+ { _fnread } \
+ __extension__ int _check(__typeof__(_request) *req) \
+ { _fncheck } \
+ __extension__ int _search(struct session *session, \
+ __typeof__(_request) *req, \
+ __typeof__(_searchdat) *searchdat, \
+ __typeof__(_entry) *entry) \
+ { _fnsearch } \
+ __extension__ int _write(TFILE *fp, __typeof__(_entry) entry) \
+ { _fnwrite } \
+ __extension__ void _clean(__typeof__(_request) *req, \
+ __typeof__(_searchdat) *searchdat) \
+ { _fnclean } \
+ /* read request parameters */ \
+ if ((_rc = _read(_fp, &_request)) != 0) \
+ return _rc; \
+ /* validate request parameters */ \
+ if ((_rc = _check(&_request)) != 0) \
+ return _rc; \
+ /* write the response header */ \
+ WRITE_INT32(_fp, NSLCD_VERSION); \
+ WRITE_INT32(_fp, NSLCD_ACTION_##_db##_##_fn); \
+ /* go over results */ \
+ do { \
+ _rc = _search(_session, &_request, &_searchdat, &_entry); \
+ if (_entry != NULL) { \
+ /* write the response */ \
+ WRITE_INT32(_fp, NSLCD_RESULT_BEGIN); \
+ if ( _write(_fp, _entry) != 0 ) { \
+ _clean(&_request, &_searchdat); \
+ return -1; \
+ } \
+ } \
+ } while (_rc == 0 && _entry != NULL ); \
+ if (_rc == 0) \
+ WRITE_INT32(_fp, NSLCD_RESULT_END); \
+ _clean(&_request, &_searchdat); \
+ return 0; \
}
/* macro to compare strings which uses the ignorecase config option to
determine whether or not to do a case-sensitive match */
-#define STR_CMP(str1, str2) \
- (nslcd_cfg->ignorecase == 1 ? \
+#define STR_CMP(str1, str2) \
+ (nslcd_cfg->ignorecase == 1 ? \
strcasecmp(str1, str2) : strcmp(str1, str2))
#endif /* not NSLCD__COMMON_H */