[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-1209-g5bab95b

Volker Lendecke vlendec at samba.org
Wed Feb 25 12:04:57 GMT 2009


The branch, master has been updated
       via  5bab95b58366ff001b4967bdb0674f42dc990a77 (commit)
       via  06b018767b6e6f3ee0221c3aee142cb2b4836fc9 (commit)
       via  423c1d88fcd0f128bceaf8b0c371281aa4a41003 (commit)
       via  be4913fbe6f6bb2fefbeeb1559692e04a15758f9 (commit)
       via  00ad0c4a4317db810bf2197503006ae5a6bb8bce (commit)
       via  d1c7bbd893c27ebff28571b4ea611bd3e35148c1 (commit)
      from  258ae4cec596631b758fb17c170c4494e4db8a8e (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 5bab95b58366ff001b4967bdb0674f42dc990a77
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 25 13:03:03 2009 +0100

    Fix a missing prototype

commit 06b018767b6e6f3ee0221c3aee142cb2b4836fc9
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 25 12:55:47 2009 +0100

    Fix an incompatible pointer passed to winbind_get_groups
    
    This is the same bug that was fixed in other places of the code a few times
    already:
    
    A C compiler ONLY does automatic type conversions during an assignment.
    
    Passing down a pointer to type A to a function taking type B as an
    argument does NOT do any automatic type conversions.
    
    If required, I can dig up the relevant portions of the C standard.

commit 423c1d88fcd0f128bceaf8b0c371281aa4a41003
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 25 12:45:39 2009 +0100

    Remove async_req based async_send

commit be4913fbe6f6bb2fefbeeb1559692e04a15758f9
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 25 12:44:26 2009 +0100

    Convert rpc_sock_write to use tevent_req base async_send

commit 00ad0c4a4317db810bf2197503006ae5a6bb8bce
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 25 12:38:32 2009 +0100

    Remove async_req based async_recv

commit d1c7bbd893c27ebff28571b4ea611bd3e35148c1
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Feb 25 12:35:48 2009 +0100

    Convert rpc_sock_read to use tevent_req base async_read

-----------------------------------------------------------------------

Summary of changes:
 lib/async_req/async_sock.c              |  300 -------------------------------
 lib/async_req/async_sock.h              |   11 --
 source3/include/proto.h                 |    4 +
 source3/passdb/pdb_wbc_sam.c            |    4 +-
 source3/rpc_client/rpc_transport_sock.c |  110 ++++++++++--
 5 files changed, 100 insertions(+), 329 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c
index 3563421..40e7bca 100644
--- a/lib/async_req/async_sock.c
+++ b/lib/async_req/async_sock.c
@@ -30,45 +30,6 @@
 #endif
 
 /**
- * Discriminator for async_syscall_state
- */
-enum async_syscall_type {
-	ASYNC_SYSCALL_SEND,
-	ASYNC_SYSCALL_RECV,
-};
-
-/**
- * Holder for syscall arguments and the result
- */
-
-struct async_syscall_state {
-	enum async_syscall_type syscall_type;
-	struct tevent_fd *fde;
-
-	union {
-		struct param_send {
-			int fd;
-			const void *buffer;
-			size_t length;
-			int flags;
-		} param_send;
-		struct param_recv {
-			int fd;
-			void *buffer;
-			size_t length;
-			int flags;
-		} param_recv;
-	} param;
-
-	union {
-		ssize_t result_ssize_t;
-		size_t result_size_t;
-		int result_int;
-	} result;
-	int sys_errno;
-};
-
-/**
  * @brief Map async_req states to unix-style errnos
  * @param[in]  req	The async req to get the state from
  * @param[out] err	Pointer to take the unix-style errno
@@ -117,267 +78,6 @@ int async_req_simple_recv_errno(struct async_req *req)
 	return 0;
 }
 
-/**
- * @brief Create a new async syscall req
- * @param[in] mem_ctx	The memory context to hang the result off
- * @param[in] ev	The event context to work from
- * @param[in] type	Which syscall will this be
- * @param[in] pstate	Where to put the newly created private_data state
- * @retval The new request
- *
- * This is a helper function to prepare a new struct async_req with an
- * associated struct async_syscall_state. The async_syscall_state will be put
- * into the async_req as private_data.
- */
-
-static struct async_req *async_syscall_new(TALLOC_CTX *mem_ctx,
-					   struct tevent_context *ev,
-					   enum async_syscall_type type,
-					   struct async_syscall_state **pstate)
-{
-	struct async_req *result;
-	struct async_syscall_state *state;
-
-	if (!async_req_setup(mem_ctx, &result, &state,
-			     struct async_syscall_state)) {
-		return NULL;
-	}
-	state->syscall_type = type;
-
-	result->private_data = state;
-
-	*pstate = state;
-
-	return result;
-}
-
-/**
- * @brief Create a new async syscall req based on a fd
- * @param[in] mem_ctx	The memory context to hang the result off
- * @param[in] ev	The event context to work from
- * @param[in] type	Which syscall will this be
- * @param[in] fd	The file descriptor we work on
- * @param[in] fde_flags TEVENT_FD_READ/WRITE -- what are we interested in?
- * @param[in] fde_cb	The callback function for the file descriptor event
- * @param[in] pstate	Where to put the newly created private_data state
- * @retval The new request
- *
- * This is a helper function to prepare a new struct async_req with an
- * associated struct async_syscall_state and an associated file descriptor
- * event.
- */
-
-static struct async_req *async_fde_syscall_new(
-	TALLOC_CTX *mem_ctx,
-	struct tevent_context *ev,
-	enum async_syscall_type type,
-	int fd,
-	uint16_t fde_flags,
-	void (*fde_cb)(struct tevent_context *ev,
-		       struct tevent_fd *fde, uint16_t flags,
-		       void *priv),
-	struct async_syscall_state **pstate)
-{
-	struct async_req *result;
-	struct async_syscall_state *state;
-
-	result = async_syscall_new(mem_ctx, ev, type, &state);
-	if (result == NULL) {
-		return NULL;
-	}
-
-	state->fde = tevent_add_fd(ev, state, fd, fde_flags, fde_cb, result);
-	if (state->fde == NULL) {
-		TALLOC_FREE(result);
-		return NULL;
-	}
-	*pstate = state;
-	return result;
-}
-
-/**
- * Retrieve a ssize_t typed result from an async syscall
- * @param[in] req	The syscall that has just finished
- * @param[out] perrno	Where to put the syscall's errno
- * @retval The return value from the asynchronously called syscall
- */
-
-ssize_t async_syscall_result_ssize_t(struct async_req *req, int *perrno)
-{
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-
-	*perrno = state->sys_errno;
-	return state->result.result_ssize_t;
-}
-
-/**
- * Retrieve a size_t typed result from an async syscall
- * @param[in] req	The syscall that has just finished
- * @param[out] perrno	Where to put the syscall's errno
- * @retval The return value from the asynchronously called syscall
- */
-
-size_t async_syscall_result_size_t(struct async_req *req, int *perrno)
-{
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-
-	*perrno = state->sys_errno;
-	return state->result.result_size_t;
-}
-
-/**
- * Retrieve a int typed result from an async syscall
- * @param[in] req	The syscall that has just finished
- * @param[out] perrno	Where to put the syscall's errno
- * @retval The return value from the asynchronously called syscall
- */
-
-int async_syscall_result_int(struct async_req *req, int *perrno)
-{
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-
-	*perrno = state->sys_errno;
-	return state->result.result_int;
-}
-
-/**
- * fde event handler for the "send" syscall
- * @param[in] ev	The event context that sent us here
- * @param[in] fde	The file descriptor event associated with the send
- * @param[in] flags	Can only be TEVENT_FD_WRITE here
- * @param[in] priv	private data, "struct async_req *" in this case
- */
-
-static void async_send_callback(struct tevent_context *ev,
-				struct tevent_fd *fde, uint16_t flags,
-				void *priv)
-{
-	struct async_req *req = talloc_get_type_abort(
-		priv, struct async_req);
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-	struct param_send *p = &state->param.param_send;
-
-	if (state->syscall_type != ASYNC_SYSCALL_SEND) {
-		async_req_error(req, EIO);
-		return;
-	}
-
-	state->result.result_ssize_t = send(p->fd, p->buffer, p->length,
-					    p->flags);
-	state->sys_errno = errno;
-
-	TALLOC_FREE(state->fde);
-
-	async_req_done(req);
-}
-
-/**
- * Async version of send(2)
- * @param[in] mem_ctx	The memory context to hang the result off
- * @param[in] ev	The event context to work from
- * @param[in] fd	The socket to send to
- * @param[in] buffer	The buffer to send
- * @param[in] length	How many bytes to send
- * @param[in] flags	flags passed to send(2)
- *
- * This function is a direct counterpart of send(2)
- */
-
-struct async_req *async_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
-			     int fd, const void *buffer, size_t length,
-			     int flags)
-{
-	struct async_req *result;
-	struct async_syscall_state *state;
-
-	result = async_fde_syscall_new(
-		mem_ctx, ev, ASYNC_SYSCALL_SEND,
-		fd, TEVENT_FD_WRITE, async_send_callback,
-		&state);
-	if (result == NULL) {
-		return NULL;
-	}
-
-	state->param.param_send.fd = fd;
-	state->param.param_send.buffer = buffer;
-	state->param.param_send.length = length;
-	state->param.param_send.flags = flags;
-
-	return result;
-}
-
-/**
- * fde event handler for the "recv" syscall
- * @param[in] ev	The event context that sent us here
- * @param[in] fde	The file descriptor event associated with the recv
- * @param[in] flags	Can only be TEVENT_FD_READ here
- * @param[in] priv	private data, "struct async_req *" in this case
- */
-
-static void async_recv_callback(struct tevent_context *ev,
-				struct tevent_fd *fde, uint16_t flags,
-				void *priv)
-{
-	struct async_req *req = talloc_get_type_abort(
-		priv, struct async_req);
-	struct async_syscall_state *state = talloc_get_type_abort(
-		req->private_data, struct async_syscall_state);
-	struct param_recv *p = &state->param.param_recv;
-
-	if (state->syscall_type != ASYNC_SYSCALL_RECV) {
-		async_req_error(req, EIO);
-		return;
-	}
-
-	state->result.result_ssize_t = recv(p->fd, p->buffer, p->length,
-					    p->flags);
-	state->sys_errno = errno;
-
-	TALLOC_FREE(state->fde);
-
-	async_req_done(req);
-}
-
-/**
- * Async version of recv(2)
- * @param[in] mem_ctx	The memory context to hang the result off
- * @param[in] ev	The event context to work from
- * @param[in] fd	The socket to recv from
- * @param[in] buffer	The buffer to recv into
- * @param[in] length	How many bytes to recv
- * @param[in] flags	flags passed to recv(2)
- *
- * This function is a direct counterpart of recv(2)
- */
-
-struct async_req *async_recv(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
-			     int fd, void *buffer, size_t length,
-			     int flags)
-{
-	struct async_req *result;
-	struct async_syscall_state *state;
-
-	result = async_fde_syscall_new(
-		mem_ctx, ev, ASYNC_SYSCALL_RECV,
-		fd, TEVENT_FD_READ, async_recv_callback,
-		&state);
-
-	if (result == NULL) {
-		return NULL;
-	}
-
-	state->param.param_recv.fd = fd;
-	state->param.param_recv.buffer = buffer;
-	state->param.param_recv.length = length;
-	state->param.param_recv.flags = flags;
-
-	return result;
-}
-
 struct async_send_state {
 	int fd;
 	const void *buf;
diff --git a/lib/async_req/async_sock.h b/lib/async_req/async_sock.h
index bfc4346..e001709 100644
--- a/lib/async_req/async_sock.h
+++ b/lib/async_req/async_sock.h
@@ -25,17 +25,6 @@
 bool async_req_is_errno(struct async_req *req, int *err);
 int async_req_simple_recv_errno(struct async_req *req);
 
-ssize_t async_syscall_result_ssize_t(struct async_req *req, int *perrno);
-size_t async_syscall_result_size_t(struct async_req *req, int *perrno);
-int async_syscall_result_int(struct async_req *req, int *perrno);
-
-struct async_req *async_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
-			     int fd, const void *buffer, size_t length,
-			     int flags);
-struct async_req *async_recv(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
-			     int fd, void *buffer, size_t length,
-			     int flags);
-
 struct tevent_req *async_send_send(TALLOC_CTX *mem_ctx,
 				   struct tevent_context *ev,
 				   int fd, const void *buf, size_t len,
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8084111..2d92b0f 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4693,6 +4693,10 @@ NTSTATUS pdb_nds_init(void);
 
 NTSTATUS pdb_smbpasswd_init(void) ;
 
+/* The following definitions come from passdb/pdb_wbc_sam.c  */
+
+NTSTATUS pdb_wbc_sam_init(void);
+
 /* The following definitions come from passdb/pdb_tdb.c  */
 
 bool init_sam_from_buffer_v2(struct samu *sampass, uint8 *buf, uint32 buflen);
diff --git a/source3/passdb/pdb_wbc_sam.c b/source3/passdb/pdb_wbc_sam.c
index 33dc03f..d2c7fda 100644
--- a/source3/passdb/pdb_wbc_sam.c
+++ b/source3/passdb/pdb_wbc_sam.c
@@ -115,10 +115,12 @@ static NTSTATUS pdb_wbc_sam_enum_group_memberships(struct pdb_methods *methods,
 {
 	size_t i;
 	const char *username = pdb_get_username(user);
+	uint32_t num_groups;
 
-	if (!winbind_get_groups(mem_ctx, username, p_num_groups, pp_gids)) {
+	if (!winbind_get_groups(mem_ctx, username, &num_groups, pp_gids)) {
 		return NT_STATUS_NO_SUCH_USER;
 	}
+	*p_num_groups = num_groups;
 
 	if (*p_num_groups == 0) {
 		smb_panic("primary group missing");
diff --git a/source3/rpc_client/rpc_transport_sock.c b/source3/rpc_client/rpc_transport_sock.c
index c0fa41b..658ffe3 100644
--- a/source3/rpc_client/rpc_transport_sock.c
+++ b/source3/rpc_client/rpc_transport_sock.c
@@ -35,6 +35,12 @@ static int rpc_transport_sock_state_destructor(struct rpc_transport_sock_state *
 	return 0;
 }
 
+struct rpc_sock_read_state {
+	ssize_t received;
+};
+
+static void rpc_sock_read_done(struct tevent_req *subreq);
+
 static struct async_req *rpc_sock_read_send(TALLOC_CTX *mem_ctx,
 					    struct event_context *ev,
 					    uint8_t *data, size_t size,
@@ -42,25 +48,62 @@ static struct async_req *rpc_sock_read_send(TALLOC_CTX *mem_ctx,
 {
 	struct rpc_transport_sock_state *sock_transp = talloc_get_type_abort(
 		priv, struct rpc_transport_sock_state);
-	return async_recv(mem_ctx, ev, sock_transp->fd, data, size, 0);
+	struct async_req *result;
+	struct tevent_req *subreq;
+	struct rpc_sock_read_state *state;
+
+	if (!async_req_setup(mem_ctx, &result, &state,
+			     struct rpc_sock_read_state)) {
+		return NULL;
+	}
+
+	subreq = async_recv_send(state, ev, sock_transp->fd, data, size, 0);
+	if (subreq == NULL) {
+		goto fail;
+	}
+	subreq->async.fn = rpc_sock_read_done;
+	subreq->async.private_data = result;
+	return result;
+ fail:
+	TALLOC_FREE(result);
+	return NULL;
 }
 
-static NTSTATUS rpc_sock_read_recv(struct async_req *req, ssize_t *preceived)
+static void rpc_sock_read_done(struct tevent_req *subreq)
 {
-	ssize_t received;
-	int sys_errno;
+	struct async_req *req = talloc_get_type_abort(
+		subreq->async.private_data, struct async_req);
+	struct rpc_sock_read_state *state = talloc_get_type_abort(
+		req->private_data, struct rpc_sock_read_state);
+	int err;
 
-	received = async_syscall_result_ssize_t(req, &sys_errno);
-	if (received == -1) {
-		return map_nt_error_from_unix(sys_errno);
+	state->received = async_recv_recv(subreq, &err);
+	if (state->received == -1) {
+		async_req_nterror(req, map_nt_error_from_unix(err));
+		return;
 	}
-	if (received == 0) {
-		return NT_STATUS_END_OF_FILE;
+	async_req_done(req);
+}
+
+static NTSTATUS rpc_sock_read_recv(struct async_req *req, ssize_t *preceived)
+{
+	struct rpc_sock_read_state *state = talloc_get_type_abort(
+		req->private_data, struct rpc_sock_read_state);
+	NTSTATUS status;
+
+	if (async_req_is_nterror(req, &status)) {
+		return status;
 	}
-	*preceived = received;
+	*preceived = state->received;
 	return NT_STATUS_OK;
 }
 
+struct rpc_sock_write_state {
+	ssize_t sent;
+};
+
+static void rpc_sock_write_done(struct tevent_req *subreq);
+
 static struct async_req *rpc_sock_write_send(TALLOC_CTX *mem_ctx,
 					     struct event_context *ev,
 					     const uint8_t *data, size_t size,
@@ -68,19 +111,52 @@ static struct async_req *rpc_sock_write_send(TALLOC_CTX *mem_ctx,
 {
 	struct rpc_transport_sock_state *sock_transp = talloc_get_type_abort(
 		priv, struct rpc_transport_sock_state);
-	return async_send(mem_ctx, ev, sock_transp->fd, data, size, 0);
+	struct async_req *result;
+	struct tevent_req *subreq;
+	struct rpc_sock_write_state *state;
+
+	if (!async_req_setup(mem_ctx, &result, &state,
+			     struct rpc_sock_write_state)) {
+		return NULL;
+	}
+	subreq = async_send_send(state, ev, sock_transp->fd, data, size, 0);
+	if (subreq == NULL) {
+		goto fail;
+	}
+	subreq->async.fn = rpc_sock_write_done;
+	subreq->async.private_data = result;
+	return result;
+ fail:
+	TALLOC_FREE(result);
+	return NULL;
+}
+
+static void rpc_sock_write_done(struct tevent_req *subreq)
+{
+	struct async_req *req = talloc_get_type_abort(
+		subreq->async.private_data, struct async_req);
+	struct rpc_sock_write_state *state = talloc_get_type_abort(
+		req->private_data, struct rpc_sock_write_state);
+	int err;
+
+	state->sent = async_send_recv(subreq, &err);
+	if (state->sent == -1) {
+		async_req_nterror(req, map_nt_error_from_unix(err));
+		return;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list