[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