summaryrefslogtreecommitdiff
path: root/nslcd
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2014-12-03 22:06:07 -0500
committerLuke Shumaker <lukeshu@sbcglobal.net>2014-12-03 22:06:07 -0500
commit7a38ced276835128fd93262d362e91932040839e (patch)
treec67ab2d1857aad5f549070b8ce1753abe168f84c /nslcd
parentdba5f85e8f1943863b4cbab1ab52913c62365ce1 (diff)
use NSLCD_HANDLE{,_UID}() to generate more of the code
Diffstat (limited to 'nslcd')
-rw-r--r--nslcd/.gitignore2
-rw-r--r--nslcd/Makefile.am27
-rw-r--r--nslcd/common.h51
-rw-r--r--nslcd/db_passwd.c9
-rw-r--r--nslcd/db_shadow.c6
-rw-r--r--nslcd/nslcd.c45
6 files changed, 42 insertions, 98 deletions
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);