summaryrefslogtreecommitdiffstats
path: root/src/nis.c
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-27 14:39:55 -0400
committerNalin Dahyabhai <nalin.dahyabhai@pobox.com>2008-05-27 14:39:55 -0400
commit21e82e9d4b13359c0d5800466346f24f4b56f479 (patch)
tree1cc4c01163e19a8b80b1c638854e4e654aac2092 /src/nis.c
parent132ac8441e847badeeb5bdd0de432e610398f9b8 (diff)
downloadslapi-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.c134
1 files changed, 32 insertions, 102 deletions
diff --git a/src/nis.c b/src/nis.c
index 88973ab..56098a5 100644
--- a/src/nis.c
+++ b/src/nis.c
@@ -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);