diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2007-11-29 14:02:08 -0500 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2007-11-29 14:02:08 -0500 |
| commit | 2f3138be2b0a3bd593e7a7b3c5636ebaf9dddbfa (patch) | |
| tree | a686e78dd7adb97b8518536df36a0441ec8b1d6c /src | |
| parent | f82215df2d4af8456d7228628ea5a6678ed908dd (diff) | |
| download | slapi-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.c | 143 |
1 files changed, 90 insertions, 53 deletions
@@ -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 */ |
