[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha7-1525-g46dea8c
Volker Lendecke
vlendec at samba.org
Sat May 9 19:51:44 GMT 2009
The branch, master has been updated
via 46dea8c24750b98ca589777904cc05e4e3e92d71 (commit)
via af2189cfeda936a91eda7313c029272bbfd8811f (commit)
from efa9bc9dc690e77ef623e7337b34b14d13912101 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 46dea8c24750b98ca589777904cc05e4e3e92d71
Author: Volker Lendecke <vl at samba.org>
Date: Sat May 9 21:12:33 2009 +0200
wb_int_trans -> wb_simple_trans in wbclient.c
commit af2189cfeda936a91eda7313c029272bbfd8811f
Author: Volker Lendecke <vl at samba.org>
Date: Sat May 9 21:01:09 2009 +0200
Add wb_simple_trans_send/recv
-----------------------------------------------------------------------
Summary of changes:
source3/include/wbc_async.h | 7 ++
source3/lib/wb_reqtrans.c | 131 ++++++++++++++++++++++++++++++++-
source3/lib/wbclient.c | 172 ++++++-------------------------------------
3 files changed, 161 insertions(+), 149 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/include/wbc_async.h b/source3/include/wbc_async.h
index 57b0cb8..57625d5 100644
--- a/source3/include/wbc_async.h
+++ b/source3/include/wbc_async.h
@@ -61,4 +61,11 @@ struct tevent_req *wb_resp_write_send(TALLOC_CTX *mem_ctx,
struct winbindd_response *wb_resp);
ssize_t wb_resp_write_recv(struct tevent_req *req, int *err);
+struct tevent_req *wb_simple_trans_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tevent_queue *queue, int fd,
+ struct winbindd_request *wb_req);
+int wb_simple_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ struct winbindd_response **presponse, int *err);
+
#endif /*_WBC_ASYNC_H_*/
diff --git a/source3/lib/wb_reqtrans.c b/source3/lib/wb_reqtrans.c
index d7ec17b..c11561f 100644
--- a/source3/lib/wb_reqtrans.c
+++ b/source3/lib/wb_reqtrans.c
@@ -169,7 +169,14 @@ static void wb_req_write_done(struct tevent_req *subreq)
int err;
state->ret = writev_recv(subreq, &err);
- TALLOC_FREE(subreq);
+ /*
+ * We do not TALLOC_FREE(subreq) here, as this would trigger the next
+ * write of a client. The winbind protocol is purely request/response
+ * without multiplex ID's, so having multiple requeusts on the fly
+ * would confuse sequencing.
+ *
+ * Eventually the writev_req will be freed, "subreq" a child of "req"
+ */
if (state->ret < 0) {
tevent_req_error(req, err);
return;
@@ -337,3 +344,125 @@ ssize_t wb_resp_write_recv(struct tevent_req *req, int *err)
}
return state->ret;
}
+
+static bool closed_fd(int fd)
+{
+ struct timeval tv;
+ fd_set r_fds;
+
+ if (fd == -1) {
+ return true;
+ }
+
+ FD_ZERO(&r_fds);
+ FD_SET(fd, &r_fds);
+ ZERO_STRUCT(tv);
+
+ if ((select(fd+1, &r_fds, NULL, NULL, &tv) == -1)
+ || FD_ISSET(fd, &r_fds)) {
+ return true;
+ }
+
+ return false;
+}
+
+struct wb_simple_trans_state {
+ struct tevent_context *ev;
+ int fd;
+ struct winbindd_response *wb_resp;
+};
+
+static void wb_simple_trans_write_done(struct tevent_req *subreq);
+static void wb_simple_trans_read_done(struct tevent_req *subreq);
+
+struct tevent_req *wb_simple_trans_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct tevent_queue *queue, int fd,
+ struct winbindd_request *wb_req)
+{
+ struct tevent_req *req, *subreq;
+ struct wb_simple_trans_state *state;
+
+ req = tevent_req_create(mem_ctx, &state, struct wb_simple_trans_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ if (closed_fd(fd)) {
+ tevent_req_error(req, EPIPE);
+ return tevent_req_post(req, ev);
+ }
+
+ wb_req->length = sizeof(struct winbindd_request);
+
+ state->ev = ev;
+ state->fd = fd;
+
+ subreq = wb_req_write_send(state, ev, queue, fd, wb_req);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, wb_simple_trans_write_done, req);
+
+ return req;
+}
+
+static void wb_simple_trans_write_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct wb_simple_trans_state *state = tevent_req_data(
+ req, struct wb_simple_trans_state);
+ ssize_t ret;
+ int err;
+
+ ret = wb_req_write_recv(subreq, &err);
+ /*
+ * We do not TALLOC_FREE(subreq) here, as this would trigger the next
+ * write of a client. The winbind protocol is purely request/response
+ * without multiplex ID's, so having multiple requeusts on the fly
+ * would confuse sequencing.
+ *
+ * Eventually the "subreq" will be freed, it is a child of "req"
+ */
+ if (ret == -1) {
+ tevent_req_error(req, err);
+ return;
+ }
+ subreq = wb_resp_read_send(state, state->ev, state->fd);
+ if (tevent_req_nomem(subreq, req)) {
+ return;
+ }
+ tevent_req_set_callback(subreq, wb_simple_trans_read_done, req);
+}
+
+static void wb_simple_trans_read_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct wb_simple_trans_state *state = tevent_req_data(
+ req, struct wb_simple_trans_state);
+ ssize_t ret;
+ int err;
+
+ ret = wb_resp_read_recv(subreq, state, &state->wb_resp, &err);
+ if (ret == -1) {
+ tevent_req_error(req, err);
+ return;
+ }
+
+ tevent_req_done(req);
+}
+
+int wb_simple_trans_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ struct winbindd_response **presponse, int *err)
+{
+ struct wb_simple_trans_state *state = tevent_req_data(
+ req, struct wb_simple_trans_state);
+
+ if (tevent_req_is_unix_error(req, err)) {
+ return -1;
+ }
+ *presponse = talloc_move(mem_ctx, &state->wb_resp);
+ return 0;
+}
diff --git a/source3/lib/wbclient.c b/source3/lib/wbclient.c
index abe5b50..891a214 100644
--- a/source3/lib/wbclient.c
+++ b/source3/lib/wbclient.c
@@ -166,27 +166,6 @@ static int make_safe_fd(int fd)
return -1;
}
-static bool winbind_closed_fd(int fd)
-{
- struct timeval tv;
- fd_set r_fds;
-
- if (fd == -1) {
- return true;
- }
-
- FD_ZERO(&r_fds);
- FD_SET(fd, &r_fds);
- ZERO_STRUCT(tv);
-
- if ((select(fd+1, &r_fds, NULL, NULL, &tv) == -1)
- || FD_ISSET(fd, &r_fds)) {
- return true;
- }
-
- return false;
-}
-
struct wb_context *wb_context_init(TALLOC_CTX *mem_ctx)
{
struct wb_context *result;
@@ -275,7 +254,7 @@ static struct tevent_req *wb_connect_send(TALLOC_CTX *mem_ctx,
}
subreq = async_connect_send(mem_ctx, ev, wb_ctx->fd,
- (struct sockaddr *)&sunaddr,
+ (struct sockaddr *)(void *)&sunaddr,
sizeof(sunaddr));
if (subreq == NULL) {
goto nomem;
@@ -316,113 +295,6 @@ static wbcErr wb_connect_recv(struct tevent_req *req)
return tevent_req_simple_recv_wbcerr(req);
}
-struct wb_int_trans_state {
- struct tevent_context *ev;
- int fd;
- struct winbindd_request *wb_req;
- struct winbindd_response *wb_resp;
-};
-
-static void wb_int_trans_write_done(struct tevent_req *subreq);
-static void wb_int_trans_read_done(struct tevent_req *subreq);
-
-static struct tevent_req *wb_int_trans_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct tevent_queue *queue, int fd,
- struct winbindd_request *wb_req)
-{
- struct tevent_req *result, *subreq;
- struct wb_int_trans_state *state;
-
- result = tevent_req_create(mem_ctx, &state,
- struct wb_int_trans_state);
- if (result == NULL) {
- return NULL;
- }
-
- if (winbind_closed_fd(fd)) {
- tevent_req_error(result, WBC_ERR_WINBIND_NOT_AVAILABLE);
- return tevent_req_post(result, ev);
- }
-
- state->ev = ev;
- state->fd = fd;
- state->wb_req = wb_req;
- state->wb_req->length = sizeof(struct winbindd_request);
- state->wb_req->pid = getpid();
-
- subreq = wb_req_write_send(state, state->ev, queue, state->fd,
- state->wb_req);
- if (subreq == NULL) {
- goto fail;
- }
- tevent_req_set_callback(subreq, wb_int_trans_write_done, result);
-
- return result;
-
- fail:
- TALLOC_FREE(result);
- return NULL;
-}
-
-static void wb_int_trans_write_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct wb_int_trans_state *state = tevent_req_data(
- req, struct wb_int_trans_state);
- ssize_t ret;
- int err;
-
- ret = wb_req_write_recv(subreq, &err);
- TALLOC_FREE(subreq);
- if (ret == -1) {
- tevent_req_error(req, map_wbc_err_from_errno(err));
- return;
- }
-
- subreq = wb_resp_read_send(state, state->ev, state->fd);
- if (tevent_req_nomem(subreq, req)) {
- return;
- }
- tevent_req_set_callback(subreq, wb_int_trans_read_done, req);
-}
-
-static void wb_int_trans_read_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct wb_int_trans_state *state = tevent_req_data(
- req, struct wb_int_trans_state);
- ssize_t ret;
- int err;
-
- ret = wb_resp_read_recv(subreq, state, &state->wb_resp, &err);
- TALLOC_FREE(subreq);
- if (ret == -1) {
- tevent_req_error(req, map_wbc_err_from_errno(err));
- return;
- }
-
- tevent_req_done(req);
-}
-
-static wbcErr wb_int_trans_recv(struct tevent_req *req,
- TALLOC_CTX *mem_ctx,
- struct winbindd_response **presponse)
-{
- struct wb_int_trans_state *state = tevent_req_data(
- req, struct wb_int_trans_state);
- wbcErr wbc_err;
-
- if (tevent_req_is_wbcerr(req, &wbc_err)) {
- return wbc_err;
- }
-
- *presponse = talloc_move(mem_ctx, &state->wb_resp);
- return WBC_ERR_SUCCESS;
-}
-
static const char *winbindd_socket_dir(void)
{
#ifdef SOCKET_WRAPPER
@@ -501,9 +373,10 @@ static void wb_open_pipe_connect_nonpriv_done(struct tevent_req *subreq)
ZERO_STRUCT(state->wb_req);
state->wb_req.cmd = WINBINDD_INTERFACE_VERSION;
+ state->wb_req.pid = getpid();
- subreq = wb_int_trans_send(state, state->ev, state->wb_ctx->queue,
- state->wb_ctx->fd, &state->wb_req);
+ subreq = wb_simple_trans_send(state, state->ev, state->wb_ctx->queue,
+ state->wb_ctx->fd, &state->wb_req);
if (tevent_req_nomem(subreq, req)) {
return;
}
@@ -517,12 +390,12 @@ static void wb_open_pipe_ping_done(struct tevent_req *subreq)
struct wb_open_pipe_state *state = tevent_req_data(
req, struct wb_open_pipe_state);
struct winbindd_response *wb_resp;
- wbcErr wbc_err;
+ int ret, err;
- wbc_err = wb_int_trans_recv(subreq, state, &wb_resp);
+ ret = wb_simple_trans_recv(subreq, state, &wb_resp, &err);
TALLOC_FREE(subreq);
- if (!WBC_ERROR_IS_OK(wbc_err)) {
- tevent_req_error(req, wbc_err);
+ if (ret == -1) {
+ tevent_req_error(req, map_wbc_err_from_errno(err));
return;
}
@@ -532,9 +405,10 @@ static void wb_open_pipe_ping_done(struct tevent_req *subreq)
}
state->wb_req.cmd = WINBINDD_PRIV_PIPE_DIR;
+ state->wb_req.pid = getpid();
- subreq = wb_int_trans_send(state, state->ev, state->wb_ctx->queue,
- state->wb_ctx->fd, &state->wb_req);
+ subreq = wb_simple_trans_send(state, state->ev, state->wb_ctx->queue,
+ state->wb_ctx->fd, &state->wb_req);
if (tevent_req_nomem(subreq, req)) {
return;
}
@@ -548,12 +422,12 @@ static void wb_open_pipe_getpriv_done(struct tevent_req *subreq)
struct wb_open_pipe_state *state = tevent_req_data(
req, struct wb_open_pipe_state);
struct winbindd_response *wb_resp = NULL;
- wbcErr wbc_err;
+ int ret, err;
- wbc_err = wb_int_trans_recv(subreq, state, &wb_resp);
+ ret = wb_simple_trans_recv(subreq, state, &wb_resp, &err);
TALLOC_FREE(subreq);
- if (!WBC_ERROR_IS_OK(wbc_err)) {
- tevent_req_error(req, wbc_err);
+ if (ret == -1) {
+ tevent_req_error(req, map_wbc_err_from_errno(err));
return;
}
@@ -633,8 +507,10 @@ struct tevent_req *wb_trans_send(TALLOC_CTX *mem_ctx,
return req;
}
- subreq = wb_int_trans_send(state, ev, wb_ctx->queue, wb_ctx->fd,
- wb_req);
+ state->wb_req->pid = getpid();
+
+ subreq = wb_simple_trans_send(state, ev, wb_ctx->queue, wb_ctx->fd,
+ wb_req);
if (subreq == NULL) {
goto fail;
}
@@ -726,8 +602,8 @@ static void wb_trans_connect_done(struct tevent_req *subreq)
return;
}
- subreq = wb_int_trans_send(state, state->ev, state->wb_ctx->queue,
- state->wb_ctx->fd, state->wb_req);
+ subreq = wb_simple_trans_send(state, state->ev, state->wb_ctx->queue,
+ state->wb_ctx->fd, state->wb_req);
if (tevent_req_nomem(subreq, req)) {
return;
}
@@ -740,12 +616,12 @@ static void wb_trans_done(struct tevent_req *subreq)
subreq, struct tevent_req);
struct wb_trans_state *state = tevent_req_data(
req, struct wb_trans_state);
- wbcErr wbc_err;
+ int ret, err;
- wbc_err = wb_int_trans_recv(subreq, state, &state->wb_resp);
+ ret = wb_simple_trans_recv(subreq, state, &state->wb_resp, &err);
TALLOC_FREE(subreq);
- if (wb_trans_retry(req, state, wbc_err)) {
+ if (wb_trans_retry(req, state, map_wbc_err_from_errno(err))) {
return;
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list