diff options
author | Luke Shumaker <lukeshu@sbcglobal.net> | 2014-12-03 22:06:07 -0500 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2014-12-03 22:06:07 -0500 |
commit | 7a38ced276835128fd93262d362e91932040839e (patch) | |
tree | c67ab2d1857aad5f549070b8ce1753abe168f84c | |
parent | dba5f85e8f1943863b4cbab1ab52913c62365ce1 (diff) |
use NSLCD_HANDLE{,_UID}() to generate more of the code
-rw-r--r-- | common/Makefile.am | 2 | ||||
-rw-r--r-- | nslcd/.gitignore | 2 | ||||
-rw-r--r-- | nslcd/Makefile.am | 27 | ||||
-rw-r--r-- | nslcd/common.h | 51 | ||||
-rw-r--r-- | nslcd/db_passwd.c | 9 | ||||
-rw-r--r-- | nslcd/db_shadow.c | 6 | ||||
-rw-r--r-- | nslcd/nslcd.c | 45 |
7 files changed, 43 insertions, 99 deletions
diff --git a/common/Makefile.am b/common/Makefile.am index cee985a..0549426 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -33,4 +33,4 @@ libexpr_a_SOURCES = expr.c expr.h libinotify_helpers_a_SOURCES = inotify_helpers.c inotify_helpers.h libinotify_helpers_a_CFLAGS = -std=c99 -libinotify_helpers_a_CPPFLAGS = -D_POSIX_SOURCE +libinotify_helpers_a_CPPFLAGS = -D_XOPEN_SOURCE=500 # for NAME_MAX diff --git a/nslcd/.gitignore b/nslcd/.gitignore new file mode 100644 index 0000000..e32dc21 --- /dev/null +++ b/nslcd/.gitignore @@ -0,0 +1,2 @@ +dispatch.c +dispatch.h diff --git a/nslcd/Makefile.am b/nslcd/Makefile.am index 8e501da..bbd76cb 100644 --- a/nslcd/Makefile.am +++ b/nslcd/Makefile.am @@ -28,9 +28,36 @@ nslcd_SOURCES = nslcd.c ../nslcd.h ../common/nslcd-prot.h \ ../compat/attrs.h \ log.c log.h \ common.c common.h \ + dispatch.c dispatch.h \ cfg.c cfg.h \ nsswitch.c invalidator.c \ db_config.c db_pam.c db_passwd.c db_shadow.c nslcd_LDADD = ../common/libtio.a ../common/libdict.a \ ../common/libexpr.a ../compat/libcompat.a \ @nslcd_LIBS@ @PTHREAD_LIBS@ + +dispatch.c: $(filter db_%.c,$(nslcd_SOURCES)) $(MAKEFILE_LIST) + { \ + echo '#define _XOPEN_SOURCE 500 /* for pthread_rwlock_t */' && \ + echo '#include "common.h"' && \ + echo '#include "log.h"' && \ + { \ + echo '#define NSLCD_HANDLE(db, fn) case NSLCD_ACTION_##db##_##fn: (void)nslcd_##db##_##fn(fp, session); break;' && \ + echo '#define NSLCD_HANDLE_UID(db, fn) case NSLCD_ACTION_##db##_##fn: (void)nslcd_##db##_##fn(fp, session, uid); break;' && \ + echo 'void dispatch(TFILE *fp, int32_t action, MYLDAP_SESSION *session, uid_t uid) {' && \ + echo ' switch (action) {' && \ + sed -n 's/^NSLCD_HANDLE.*/ &)/p' $(filter %.c,$^) && \ + echo ' default:' && \ + echo ' log_log(LOG_WARNING, "invalid request id: 0x%08x", (unsigned int)action);' && \ + echo ' }' ; \ + echo '}' ; \ + } | cpp | sed '/^#/d' ; \ + } > $@ + +dispatch.h: $(filter db_%.c,$(nslcd_SOURCES)) $(MAKEFILE_LIST) + { \ + echo '#define NSLCD_HANDLE(db, fn) int nslcd_##db##_##fn(TFILE *fp, MYLDAP_SESSION *);' && \ + echo '#define NSLCD_HANDLE_UID(db, fn) int nslcd_##db##_##fn(TFILE *fp, MYLDAP_SESSION *, uid_t);' && \ + echo 'void dispatch(TFILE *fp, int32_t action, MYLDAP_SESSION *session, uid_t uid);' && \ + sed -n 's/^NSLCD_HANDLE.*/&)/p' $(filter %.c,$^); \ + } | cpp | sed '/^#/d' > $@ diff --git a/nslcd/common.h b/nslcd/common.h index 9d9a29e..89022b8 100644 --- a/nslcd/common.h +++ b/nslcd/common.h @@ -201,53 +201,16 @@ void shadow_init(void); /* these are the different functions that handle the database specific actions, see nslcd.h for the action descriptions */ -int nslcd_config_get(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_alias_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_alias_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_ether_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_ether_byether(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_ether_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_group_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_group_bygid(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_group_bymember(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_group_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_host_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_host_byaddr(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_host_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_netgroup_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_netgroup_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_network_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_network_byaddr(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_network_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_passwd_byname(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_passwd_byuid(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_passwd_all(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_protocol_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_protocol_bynumber(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_protocol_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_rpc_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_rpc_bynumber(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_rpc_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_service_byname(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_service_bynumber(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_service_all(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_shadow_byname(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_shadow_all(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_pam_authc(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_pam_authz(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_pam_sess_o(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_pam_sess_c(TFILE *fp, MYLDAP_SESSION *session); -int nslcd_pam_pwmod(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); -int nslcd_usermod(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); +#include "dispatch.h" /* macros for generating service handling code */ -#define NSLCD_HANDLE(db, fn, action, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \ +#define NSLCD_HANDLE(db, fn, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \ int nslcd_##db##_##fn(TFILE *fp, MYLDAP_SESSION *session) \ - NSLCD_HANDLE_BODY(db, fn, action, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) -#define NSLCD_HANDLE_UID(db, fn, action, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \ + 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 *fp, MYLDAP_SESSION *session, uid_t calleruid) \ - NSLCD_HANDLE_BODY(db, fn, action, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) -#define NSLCD_HANDLE_BODY(db, fn, action, fndecls, fnread, fncheck, tentry, fnsearch, fnwrite, fnclean) \ + 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 */ \ int32_t tmpint32; \ @@ -261,7 +224,7 @@ int nslcd_usermod(TFILE *fp, MYLDAP_SESSION *session, uid_t calleruid); fncheck \ /* write the response header */ \ WRITE_INT32(fp, NSLCD_VERSION); \ - WRITE_INT32(fp, action); \ + WRITE_INT32(fp, NSLCD_ACTION_##db##_##fn); \ /* go over results */ \ while ((entry = search(&rc)) != NULL) \ { \ diff --git a/nslcd/db_passwd.c b/nslcd/db_passwd.c index 2dad2da..4bdc17f 100644 --- a/nslcd/db_passwd.c +++ b/nslcd/db_passwd.c @@ -82,8 +82,7 @@ static int write_passwd(TFILE *fp, struct passwd *entry, uid_t calleruid) return 0; } -NSLCD_HANDLE_UID( - passwd, byname, NSLCD_ACTION_PASSWD_BYNAME +NSLCD_HANDLE_UID(PASSWD, BYNAME ,/* decls */ char name[BUFLEN_NAME]; ,/* read */ @@ -114,8 +113,7 @@ NSLCD_HANDLE_UID( ,/* cleanup */ ) -NSLCD_HANDLE_UID( - passwd, byuid, NSLCD_ACTION_PASSWD_BYUID +NSLCD_HANDLE_UID(PASSWD, BYUID ,/* decls */ uid_t uid; ,/* read */ @@ -148,8 +146,7 @@ NSLCD_HANDLE_UID( ,/* cleanup */ ) -NSLCD_HANDLE_UID( - passwd, all, NSLCD_ACTION_PASSWD_ALL +NSLCD_HANDLE_UID(PASSWD, ALL ,/* decls */ ,/* read */ log_setrequest("passwd(all)"); diff --git a/nslcd/db_shadow.c b/nslcd/db_shadow.c index 3764873..06c4312 100644 --- a/nslcd/db_shadow.c +++ b/nslcd/db_shadow.c @@ -74,8 +74,7 @@ static int write_shadow(TFILE *fp, struct shadow *entry, uid_t calleruid) return 0; } -NSLCD_HANDLE_UID( - shadow, byname, NSLCD_ACTION_SHADOW_BYNAME +NSLCD_HANDLE_UID(SHADOW, BYNAME ,/* decls */ char name[BUFLEN_NAME]; struct shadow ret; @@ -108,8 +107,7 @@ NSLCD_HANDLE_UID( ,/* cleanup */ ) -NSLCD_HANDLE_UID( - shadow, all, NSLCD_ACTION_SHADOW_ALL +NSLCD_HANDLE_UID(SHADOW, ALL ,/* decls */ struct shadow ret; ,/* read */ diff --git a/nslcd/nslcd.c b/nslcd/nslcd.c index ddf5f24..bc763eb 100644 --- a/nslcd/nslcd.c +++ b/nslcd/nslcd.c @@ -256,50 +256,7 @@ static void handleconnection(int sock, MYLDAP_SESSION *session) return; } /* handle request */ - switch (action) - { - case NSLCD_ACTION_CONFIG_GET: (void)nslcd_config_get(fp, session); break; - /* case NSLCD_ACTION_ALIAS_BYNAME: (void)nslcd_alias_byname(fp, session); break; */ - /* case NSLCD_ACTION_ALIAS_ALL: (void)nslcd_alias_all(fp, session); break; */ - /* case NSLCD_ACTION_ETHER_BYNAME: (void)nslcd_ether_byname(fp, session); break; */ - /* case NSLCD_ACTION_ETHER_BYETHER: (void)nslcd_ether_byether(fp, session); break; */ - /* case NSLCD_ACTION_ETHER_ALL: (void)nslcd_ether_all(fp, session); break; */ - case NSLCD_ACTION_GROUP_BYNAME: (void)nslcd_group_byname(fp, session); break; - case NSLCD_ACTION_GROUP_BYGID: (void)nslcd_group_bygid(fp, session); break; - case NSLCD_ACTION_GROUP_BYMEMBER: (void)nslcd_group_bymember(fp, session); break; - case NSLCD_ACTION_GROUP_ALL: (void)nslcd_group_all(fp, session); break; - /* case NSLCD_ACTION_HOST_BYNAME: (void)nslcd_host_byname(fp, session); break; */ - /* case NSLCD_ACTION_HOST_BYADDR: (void)nslcd_host_byaddr(fp, session); break; */ - /* case NSLCD_ACTION_HOST_ALL: (void)nslcd_host_all(fp, session); break; */ - /* case NSLCD_ACTION_NETGROUP_BYNAME: (void)nslcd_netgroup_byname(fp, session); break; */ - /* case NSLCD_ACTION_NETGROUP_ALL: (void)nslcd_netgroup_all(fp, session); break; */ - /* case NSLCD_ACTION_NETWORK_BYNAME: (void)nslcd_network_byname(fp, session); break; */ - /* case NSLCD_ACTION_NETWORK_BYADDR: (void)nslcd_network_byaddr(fp, session); break; */ - /* case NSLCD_ACTION_NETWORK_ALL: (void)nslcd_network_all(fp, session); break; */ - case NSLCD_ACTION_PASSWD_BYNAME: (void)nslcd_passwd_byname(fp, session, uid); break; - case NSLCD_ACTION_PASSWD_BYUID: (void)nslcd_passwd_byuid(fp, session, uid); break; - case NSLCD_ACTION_PASSWD_ALL: (void)nslcd_passwd_all(fp, session, uid); break; - /* case NSLCD_ACTION_PROTOCOL_BYNAME: (void)nslcd_protocol_byname(fp, session); break; */ - /* case NSLCD_ACTION_PROTOCOL_BYNUMBER:(void)nslcd_protocol_bynumber(fp, session); break; */ - /* case NSLCD_ACTION_PROTOCOL_ALL: (void)nslcd_protocol_all(fp, session); break; */ - /* case NSLCD_ACTION_RPC_BYNAME: (void)nslcd_rpc_byname(fp, session); break; */ - /* case NSLCD_ACTION_RPC_BYNUMBER: (void)nslcd_rpc_bynumber(fp, session); break; */ - /* case NSLCD_ACTION_RPC_ALL: (void)nslcd_rpc_all(fp, session); break; */ - /* case NSLCD_ACTION_SERVICE_BYNAME: (void)nslcd_service_byname(fp, session); break; */ - /* case NSLCD_ACTION_SERVICE_BYNUMBER: (void)nslcd_service_bynumber(fp, session); break; */ - /* case NSLCD_ACTION_SERVICE_ALL: (void)nslcd_service_all(fp, session); break; */ - case NSLCD_ACTION_SHADOW_BYNAME: (void)nslcd_shadow_byname(fp, session, uid); break; - case NSLCD_ACTION_SHADOW_ALL: (void)nslcd_shadow_all(fp, session, uid); break; - case NSLCD_ACTION_PAM_AUTHC: (void)nslcd_pam_authc(fp, session, uid); break; - case NSLCD_ACTION_PAM_AUTHZ: (void)nslcd_pam_authz(fp, session); break; - case NSLCD_ACTION_PAM_SESS_O: (void)nslcd_pam_sess_o(fp, session); break; - case NSLCD_ACTION_PAM_SESS_C: (void)nslcd_pam_sess_c(fp, session); break; - case NSLCD_ACTION_PAM_PWMOD: (void)nslcd_pam_pwmod(fp, session, uid); break; - case NSLCD_ACTION_USERMOD: (void)nslcd_usermod(fp, session, uid); break; - default: - log_log(LOG_WARNING, "invalid request id: 0x%08x", (unsigned int)action); - break; - } + dispatch(fp, action, session, uid); /* we're done with the request */ myldap_session_cleanup(session); (void)tio_close(fp); |