diff options
author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-27 14:39:55 -0400 |
---|---|---|
committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2008-05-27 14:39:55 -0400 |
commit | 21e82e9d4b13359c0d5800466346f24f4b56f479 (patch) | |
tree | 1cc4c01163e19a8b80b1c638854e4e654aac2092 /src/nis.c | |
parent | 132ac8441e847badeeb5bdd0de432e610398f9b8 (diff) | |
download | slapi-nis-21e82e9d4b13359c0d5800466346f24f4b56f479.tar.gz slapi-nis-21e82e9d4b13359c0d5800466346f24f4b56f479.tar.xz slapi-nis-21e82e9d4b13359c0d5800466346f24f4b56f479.zip |
- make the dispatcher callback data slightly more opaque to the NIS routines
Diffstat (limited to 'src/nis.c')
-rw-r--r-- | src/nis.c | 134 |
1 files changed, 32 insertions, 102 deletions
@@ -17,65 +17,15 @@ #include <nspr.h> +#include "dispatch.h" #include "map.h" #include "nis.h" #include "plugin.h" -static ssize_t -nis_write_with_retry(struct plugin_state *state, int fd, - const void *buffer1, ssize_t length1, - const void *buffer2, ssize_t length2) -{ - ssize_t sent, i; - struct iovec iov[2]; - int iovc; - sent = 0; - while ((sent != -1) && (sent < (length1 + length2))) { - if (sent < length1) { - iov[0].iov_base = ((char *) buffer1) + sent; - iov[0].iov_len = length1 - sent; - iov[1].iov_base = (char *) buffer2; - iov[1].iov_len = length2; - iovc = 2; - } else { - iov[0].iov_base = ((char *) buffer2) + (sent - length1); - iov[0].iov_len = length2 - (sent - length1); - iovc = 1; - } - i = writev(fd, &iov[0], iovc); - switch (i) { - case 0: - sent = -1; - break; - case -1: - switch (errno) { - case EAGAIN: - continue; - break; - default: - slapi_log_error(SLAPI_LOG_PLUGIN, - state->plugin_desc->spd_id, - "Got error %s sending " - "%d bytes (at %d) to %d.\n", - strerror(errno), - length1 + length2, - sent, fd); - sent = -1; - break; - } - break; - default: - sent += i; - break; - } - } - return sent; -} - /* Indicate whether or not we serve the specified domain. */ static void nis_domain(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, PRBool reply_on_failure, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, bool_t *reply_bool) @@ -89,8 +39,7 @@ nis_domain(struct plugin_state *state, state->plugin_desc->spd_id, "domain(%s) -> %s\n", domain, *reply_bool ? "TRUE" : "FALSE"); - dispatch_reply(state, client, - client_addr, client_addrlen, + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); } else { slapi_log_error(SLAPI_LOG_PLUGIN, @@ -108,7 +57,7 @@ nis_domain(struct plugin_state *state, static void nis_match(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_val *reply_val) @@ -135,8 +84,7 @@ nis_match(struct plugin_state *state, } else { reply_val->status = YP_NOKEY; } - dispatch_reply(state, client, client_addr, client_addrlen, - reply, reply_xdrs, reply_buf); + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); } else { /* XXX */ } @@ -144,7 +92,7 @@ nis_match(struct plugin_state *state, static void nis_first(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_key_val *reply_key_val) @@ -174,8 +122,7 @@ nis_first(struct plugin_state *state, reply_key_val->status = map_supported ? YP_NOKEY : YP_NOMAP; } - dispatch_reply(state, client, client_addr, client_addrlen, - reply, reply_xdrs, reply_buf); + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); } else { /* XXX */ } @@ -183,7 +130,7 @@ nis_first(struct plugin_state *state, static void nis_next(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_key_val *reply_key_val) @@ -209,7 +156,7 @@ nis_next(struct plugin_state *state, req_key.map, reply_key_val->status); } else { - reply_key_val->status = YP_NOKEY; + reply_key_val->status = YP_NOKEY; /* XXX: YP_NOMORE? */ slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id, "next(%.*s/%s/%s) -> no more!\n", @@ -218,8 +165,7 @@ nis_next(struct plugin_state *state, req_key.domain, req_key.map); } - dispatch_reply(state, client, client_addr, client_addrlen, - reply, reply_xdrs, reply_buf); + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); } else { /* XXX */ } @@ -227,7 +173,7 @@ nis_next(struct plugin_state *state, static void nis_master(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_master *reply_master) @@ -248,8 +194,7 @@ nis_master(struct plugin_state *state, req_nokey.domain, req_nokey.map, reply_master->master); - dispatch_reply(state, client, client_addr, client_addrlen, - reply, reply_xdrs, reply_buf); + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); } else { /* XXX */ } @@ -257,7 +202,7 @@ nis_master(struct plugin_state *state, static void nis_order(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_order *reply_order) @@ -284,8 +229,7 @@ nis_order(struct plugin_state *state, req_nokey.domain, req_nokey.map); } - dispatch_reply(state, client, client_addr, client_addrlen, - reply, reply_xdrs, reply_buf); + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); } else { /* XXX */ } @@ -324,7 +268,7 @@ nis_free_maplist_cb_result(struct ypmaplist **list) } static void nis_maplist(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_maplist *reply_maplist) @@ -352,8 +296,7 @@ nis_maplist(struct plugin_state *state, domain, list->map); } } - dispatch_reply(state, client, client_addr, client_addrlen, - reply, reply_xdrs, reply_buf); + dispatch_reply(state, cdata, reply, reply_xdrs, reply_buf); nis_free_maplist_cb_result(&list); } else { /* XXX */ @@ -362,7 +305,7 @@ nis_maplist(struct plugin_state *state, static void nis_all(struct plugin_state *state, - int client, struct sockaddr *client_addr, socklen_t client_addrlen, + struct dispatch_client_data *cdata, XDR *request_xdrs, struct rpc_msg *reply, XDR *reply_xdrs, char *reply_buf, struct ypresp_all *reply_all) @@ -384,16 +327,14 @@ nis_all(struct plugin_state *state, reply_all->ypresp_all_u.val.status = YP_NOMAP; reply_key->keydat_len = 0; reply_val->valdat_len = 0; - dispatch_reply_fragment(state, client, - client_addr, client_addrlen, + dispatch_reply_fragment(state, cdata, reply, reply_xdrs, reply_buf, TRUE, FALSE); /* End of data. */ reply_all->more = FALSE; xdr_setpos(reply_xdrs, 0); xdr_ypresp_all(reply_xdrs, reply_all); - dispatch_reply_fragment(state, client, - client_addr, client_addrlen, + dispatch_reply_fragment(state, cdata, reply, reply_xdrs, reply_buf, FALSE, TRUE); } else { @@ -419,9 +360,7 @@ nis_all(struct plugin_state *state, reply_key->keydat_len, reply_key->keydat_val, reply_all->more); - dispatch_reply_fragment(state, client, - client_addr, - client_addrlen, + dispatch_reply_fragment(state, cdata, reply, reply_xdrs, reply_buf, first, FALSE); @@ -453,8 +392,7 @@ nis_all(struct plugin_state *state, reply_all->more = FALSE; xdr_ypresp_all(reply_xdrs, reply_all); /* Bundle those two chunks into one reply. */ - dispatch_reply_fragment(state, client, - client_addr, client_addrlen, + dispatch_reply_fragment(state, cdata, reply, reply_xdrs, reply_buf, FALSE, TRUE); slapi_log_error(SLAPI_LOG_PLUGIN, @@ -471,8 +409,8 @@ nis_all(struct plugin_state *state, * assume that the client is a datagram client, otherwise we assume it's a * stream client. */ void -nis_process_request(struct plugin_state *state, int client, - struct sockaddr *client_addr, socklen_t client_addrlen, +nis_process_request(struct plugin_state *state, + struct dispatch_client_data *cdata, char *request_buf, size_t request_buflen) { XDR request_xdrs, reply_xdrs, auth_xdrs; @@ -625,8 +563,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_bool; accepted->ar_results.proc = (xdrproc_t) xdr_bool; /* Call the real function. */ - nis_domain(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_domain(state, cdata, &request_xdrs, request.rm_call.cb_proc == YPPROC_DOMAIN, &reply, &reply_xdrs, reply_buf, &reply_bool); goto sent_reply; @@ -640,8 +577,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_val; accepted->ar_results.proc = (xdrproc_t) xdr_ypresp_val; /* Call the real function. */ - nis_match(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_match(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_val); goto sent_reply; break; @@ -654,8 +590,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_key_val; accepted->ar_results.proc = (xdrproc_t) xdr_ypresp_key_val; /* Call the real function. */ - nis_first(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_first(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_key_val); goto sent_reply; break; @@ -668,8 +603,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_key_val; accepted->ar_results.proc = (xdrproc_t) xdr_ypresp_key_val; /* Call the real function. */ - nis_next(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_next(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_key_val); goto sent_reply; break; @@ -694,8 +628,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_all; accepted->ar_results.proc = (xdrproc_t) &xdr_ypresp_all; /* Call the real function. */ - nis_all(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_all(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_all); goto sent_reply; break; @@ -708,8 +641,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_master; accepted->ar_results.proc = (xdrproc_t) xdr_ypresp_master; /* Call the real function. */ - nis_master(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_master(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_master); goto sent_reply; break; @@ -722,7 +654,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_order; accepted->ar_results.proc = (xdrproc_t) xdr_ypresp_order; /* Call the real function. */ - nis_order(state, client, client_addr, client_addrlen, + nis_order(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_order); goto sent_reply; @@ -736,8 +668,7 @@ nis_process_request(struct plugin_state *state, int client, accepted->ar_results.where = (caddr_t) &reply_maplist; accepted->ar_results.proc = (xdrproc_t) xdr_ypresp_maplist; /* Call the real function. */ - nis_maplist(state, client, client_addr, client_addrlen, - &request_xdrs, + nis_maplist(state, cdata, &request_xdrs, &reply, &reply_xdrs, reply_buf, &reply_maplist); goto sent_reply; break; @@ -751,8 +682,7 @@ nis_process_request(struct plugin_state *state, int client, } send_reply: - dispatch_reply(state, client, client_addr, client_addrlen, - &reply, &reply_xdrs, reply_buf); + dispatch_reply(state, cdata, &reply, &reply_xdrs, reply_buf); sent_reply: xdr_destroy(&reply_xdrs); |