summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2007-11-29 14:02:08 -0500
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2007-11-29 14:02:08 -0500
commit2f3138be2b0a3bd593e7a7b3c5636ebaf9dddbfa (patch)
treea686e78dd7adb97b8518536df36a0441ec8b1d6c /src
parentf82215df2d4af8456d7228628ea5a6678ed908dd (diff)
downloadslapi-nis-2f3138be2b0a3bd593e7a7b3c5636ebaf9dddbfa.tar.gz
slapi-nis-2f3138be2b0a3bd593e7a7b3c5636ebaf9dddbfa.tar.xz
slapi-nis-2f3138be2b0a3bd593e7a7b3c5636ebaf9dddbfa.zip
begun breaking up the big worker function
Diffstat (limited to 'src')
-rw-r--r--src/nis.c143
1 files changed, 90 insertions, 53 deletions
diff --git a/src/nis.c b/src/nis.c
index 6090a18..c8be67b 100644
--- a/src/nis.c
+++ b/src/nis.c
@@ -17,6 +17,74 @@
#include "plugin.h"
#include "schema.h"
+/* send a reply which _could_ be sent over a datagram */
+static void
+nis_reply(int client, struct sockaddr *client_addr, socklen_t client_addrlen,
+ struct rpc_msg *reply, XDR *reply_xdrs, unsigned char *reply_buf)
+{
+ uint32_t len;
+ if (client_addr != NULL) {
+ /* datagram reply */
+ xdr_replymsg(reply_xdrs, reply);
+ sendto(client, reply_buf, xdr_getpos(reply_xdrs),
+ 0, client_addr, client_addrlen);
+ } else {
+ /* record reply - one fragment */
+ xdr_setpos(reply_xdrs, 4);
+ xdr_replymsg(reply_xdrs, reply);
+ len = htonl((xdr_getpos(&reply_xdrs) - 4) | 0x80000000);
+ memcpy(reply_buf, &len, 4);
+ send(client, reply_buf, xdr_getpos(&reply_xdrs), 0);
+ }
+}
+
+/* indicate whether or not we support a specified domain */
+static void
+nis_domain(int client, struct sockaddr *client_addr, socklen_t client_addrlen,
+ XDR *request_xdrs, bool_t reply_on_failure,
+ struct rpc_msg *reply, XDR *reply_xdrs, unsigned char *reply_buf,
+ bool_t *reply_bool)
+{
+ char domain[YPMAXDOMAIN + 1], *p;
+ *reply_bool = FALSE;
+ if (xdr_string(request_xdrs, &p, sizeof(domainname))) {
+ *reply_bool = schema_supports_domain(p);
+ }
+ if (*reply_bool || reply_on_failure) {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "domain(%s) -> %d\n", p, *reply_bool);
+ nis_reply(client, client_addr, client_addrlen,
+ reply, reply_xdrs, reply_buf);
+ } else {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "domain(%s) -> %d (no reply)\n",
+ p, *reply_bool);
+ }
+}
+
+ if (xdr_ypreq_key(&request_xdrs, &req_key)) {
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "match(%s/%s/%.*s)? ",
+ req_key.domain,
+ req_key.map,
+ (int) req_key.keydat.keydat_len,
+ req_key.keydat.keydat_val);
+ memset(&resp_val, 0, sizeof(resp_val));
+ resp_val.status = YP_TRUE;
+ resp_val.valdat.valdat_val = "jimbo:*K*:1234:5678:Leeroy Jenkins:/home/leeroy:/bin/bash";
+ resp_val.valdat.valdat_len = strlen(resp_val.valdat.valdat_val);
+ reply.rm_reply.rp_stat = MSG_ACCEPTED;
+ reply.rm_reply.rp_acpt.ar_stat = SUCCESS;
+ reply.rm_reply.rp_acpt.ar_results.where = &resp_val;
+ reply.rm_reply.rp_acpt.ar_results.proc = xdr_ypresp_val;
+ slapi_log_error(SLAPI_LOG_PLUGIN,
+ state->plugin_desc->spd_id,
+ "-> %d\n",
+ resp_val.status);
+ }
void
nis_process_request(struct plugin_state *state, int client,
struct sockaddr *client_addr, socklen_t client_addrlen,
@@ -104,69 +172,38 @@ nis_process_request(struct plugin_state *state, int client,
reply.rm_reply.rp_rjct.rj_stat = RPC_MISMATCH;
xdr_replymsg(&reply_xdrs, &reply);
} else {
- char domainname[YPMAXDOMAIN], *p = domainname;
- bool_t bool_ret = 1;
- struct ypreq_key req_key;
- struct ypreq_nokey req_nokey;
- struct ypresp_val resp_val;
- struct ypresp_key_val resp_key_val;
- struct ypresp_master resp_master;
- struct ypresp_order resp_order;
- struct ypresp_all resp_all;
+ /* default reply - success, no data */
+ reply.rm_reply.rp_stat = MSG_ACCEPTED;
+ reply.rm_reply.rp_acpt.ar_stat = SUCCESS;
+ reply.rm_reply.rp_acpt.ar_results.where = &reply_bool;
+ reply.rm_reply.rp_acpt.ar_results.proc = xdr_void;
+ /* call the right function */
switch (request.rm_call.cb_proc) {
case YPPROC_NULL:
case YPPROC_XFR:
case YPPROC_CLEAR:
/* do nothing */
- reply.rm_reply.rp_stat = MSG_ACCEPTED;
- reply.rm_reply.rp_acpt.ar_stat = SUCCESS;
break;
case YPPROC_DOMAIN:
case YPPROC_DOMAIN_NONACK:
- /* indicate whether or not we support a
- * specified domain */
- if (xdr_string(&request_xdrs,
- &p, sizeof(domainname))) {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "domain(%s)? ", p);
- reply.rm_reply.rp_stat = MSG_ACCEPTED;
- reply.rm_reply.rp_acpt.ar_stat = SUCCESS;
- bool_ret = schema_supports_domain(p);
- reply.rm_reply.rp_acpt.ar_results.where = &bool_ret;
- reply.rm_reply.rp_acpt.ar_results.proc = xdr_bool;
- if ((request.rm_call.cb_proc == YPPROC_DOMAIN_NONACK) &&
- (bool_ret == 0)) {
- send_reply = 0;
- }
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "-> %d\n", bool_ret);
- }
+ /* set reply type to be a boolean */
+ reply.rm_reply.rp_acpt.ar_results.where = &reply_bool;
+ reply.rm_reply.rp_acpt.ar_results.proc = xdr_bool;
+ nis_domain(&request_xdrs,
+ request.rm_call.cb_proc == YPPROC_DOMAIN,
+ &reply,
+ &reply_bool,
+ reply_buf);
break;
case YPPROC_MATCH:
- /* match one key */
- if (xdr_ypreq_key(&request_xdrs, &req_key)) {
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "match(%s/%s/%.*s)? ",
- req_key.domain,
- req_key.map,
- (int) req_key.keydat.keydat_len,
- req_key.keydat.keydat_val);
- memset(&resp_val, 0, sizeof(resp_val));
- resp_val.status = YP_TRUE;
- resp_val.valdat.valdat_val = "jimbo:*K*:1234:5678:Leeroy Jenkins:/home/leeroy:/bin/bash";
- resp_val.valdat.valdat_len = strlen(resp_val.valdat.valdat_val);
- reply.rm_reply.rp_stat = MSG_ACCEPTED;
- reply.rm_reply.rp_acpt.ar_stat = SUCCESS;
- reply.rm_reply.rp_acpt.ar_results.where = &resp_val;
- reply.rm_reply.rp_acpt.ar_results.proc = xdr_ypresp_val;
- slapi_log_error(SLAPI_LOG_PLUGIN,
- state->plugin_desc->spd_id,
- "-> %d\n",
- resp_val.status);
- }
+ /* set reply type to a resp_val */
+ reply.rm_reply.rp_acpt.ar_results.where = &resp_val;
+ reply.rm_reply.rp_acpt.ar_results.proc = xdr_ypresp_val;
+ nis_match(&request_xdrs,
+ request.rm_call.cb_proc == YPPROC_DOMAIN,
+ &reply,
+ &reply_val,
+ reply_buf);
break;
case YPPROC_FIRST:
/* get first key/val */