diff options
Diffstat (limited to 'nslcd/common.h')
-rw-r--r-- | nslcd/common.h | 100 |
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 */ |