svn commit: samba r5576 - in branches/SAMBA_4_0/source/libnet: .

mimir at samba.org mimir at samba.org
Sat Feb 26 11:39:32 GMT 2005


Author: mimir
Date: 2005-02-26 11:39:32 +0000 (Sat, 26 Feb 2005)
New Revision: 5576

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=5576

Log:
Bunch of fixes pointed by tridge. A few more to come...


rafal


Modified:
   branches/SAMBA_4_0/source/libnet/userinfo.c


Changeset:
Modified: branches/SAMBA_4_0/source/libnet/userinfo.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/userinfo.c	2005-02-25 23:57:02 UTC (rev 5575)
+++ branches/SAMBA_4_0/source/libnet/userinfo.c	2005-02-26 11:39:32 UTC (rev 5576)
@@ -43,6 +43,7 @@
 struct userinfo_state {
 	enum userinfo_stage stage;
 	struct dcerpc_pipe *pipe;
+	struct rpc_request *req;
 	struct rpc_composite_userinfo io;
 };
 
@@ -53,7 +54,7 @@
 				  struct rpc_composite_userinfo *io)
 {
 	struct userinfo_state *s = talloc_get_type(c->private, struct userinfo_state);
-	struct rpc_request *req = s->pipe->conn->pending;
+	struct rpc_request *req = s->req;
 	struct samr_OpenUser *rep;
 	struct samr_QueryUserInfo r;
 
@@ -63,18 +64,21 @@
 	rep = (struct samr_OpenUser*)req->ndr.struct_ptr;
 
 	/* prepare parameters for QueryUserInfo call */
-	r.in.user_handle = talloc_zero(c, struct policy_handle);
-	memcpy((void*)r.in.user_handle, (void*)rep->out.user_handle, sizeof(struct policy_handle));
-	r.in.level = io->in.level;
+	r.in.user_handle = rep->out.user_handle;
+	r.in.level       = io->in.level;
 	
 	/* queue rpc call, set event handling and new state */
-	s->pipe->conn->pending = dcerpc_samr_QueryUserInfo_send(s->pipe, c, &r);
+	s->req = dcerpc_samr_QueryUserInfo_send(s->pipe, c, &r);
+	if (s->req == NULL) goto failure;
 	
-	s->pipe->conn->pending->async.callback = userinfo_handler;
-	s->pipe->conn->pending->async.private  = c;
+	s->req->async.callback = userinfo_handler;
+	s->req->async.private  = c;
 	s->stage = USERINFO_GETUSER;
 	
 	return rep->out.result;
+
+failure:
+	return NT_STATUS_UNSUCCESSFUL;
 }
 
 
@@ -92,18 +96,17 @@
 	rep = (struct samr_QueryUserInfo*)req->ndr.struct_ptr;
 	
 	/* prepare arguments for Close call */
-	r.in.handle = talloc_zero(c, struct policy_handle);
-	memcpy((void*)r.in.handle, (void*)rep->in.user_handle, sizeof(struct policy_handle));
+	r.in.handle = rep->in.user_handle;
 	
 	/* queue rpc call, set event handling and new state */
-	s->pipe->conn->pending = dcerpc_samr_Close_send(s->pipe, c, &r);
+	s->req = dcerpc_samr_Close_send(s->pipe, c, &r);
 	
-	s->pipe->conn->pending->async.callback = userinfo_handler;
-	s->pipe->conn->pending->async.private  = c;
+	s->req->async.callback = userinfo_handler;
+	s->req->async.private  = c;
 	s->stage = USERINFO_CLOSEUSER;
 
 	/* copying result of composite call */
-	memcpy((void*)&io->out.info, (void*)rep->out.info, sizeof(union samr_UserInfo));
+	io->out.info = *rep->out.info;
 
 	return rep->out.result;
 }
@@ -146,11 +149,10 @@
 	}
 
 	if (!NT_STATUS_IS_OK(c->status)) {
-		/* this should be some error state instead */
-		c->state = RPC_REQUEST_DONE;
+		c->state = SMBCLI_REQUEST_ERROR;
 	}
 
-	if (c->state >= RPC_REQUEST_DONE &&
+	if (c->state >= SMBCLI_REQUEST_DONE &&
 	    c->async.fn) {
 		c->async.fn(c);
 	}
@@ -173,10 +175,11 @@
 	if (s == NULL) goto failure;
 	
 	/* copying input parameters */
-	memcpy((void*)&s->io.in.domain_handle, (void*)&io->in.domain_handle, sizeof(struct policy_handle));
-	s->io.in.sid     = talloc_strdup(p, io->in.sid);
-	s->io.in.level   = io->in.level;
-	sid              = dom_sid_parse_talloc(c, s->io.in.sid);
+	s->io.in.domain_handle  = io->in.domain_handle;
+	s->io.in.sid            = talloc_strdup(p, io->in.sid);
+	s->io.in.level          = io->in.level;
+	sid                     = dom_sid_parse_talloc(c, s->io.in.sid);
+	if (sid == NULL) goto failure;
 	
 	c->private = s;
 	c->event_ctx = dcerpc_event_context(p);
@@ -188,11 +191,11 @@
 	r->in.rid            = sid->sub_auths[sid->num_auths - 1];
 
 	/* send request */
-	s->pipe->conn->pending = dcerpc_samr_OpenUser_send(p, c, r);
+	s->req = dcerpc_samr_OpenUser_send(p, c, r);
 
 	/* callback handler */
-	s->pipe->conn->pending->async.callback = userinfo_handler;
-	s->pipe->conn->pending->async.private  = c;
+	s->req->async.callback = userinfo_handler;
+	s->req->async.private  = c;
 	s->stage = USERINFO_OPENUSER;
 
 	return c;
@@ -202,16 +205,18 @@
 }
 
 
-NTSTATUS rpc_composite_userinfo_recv(struct composite_context *c, TALLOC_CTX *mem_ctx)
+NTSTATUS rpc_composite_userinfo_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
+				     struct rpc_composite_userinfo *io)
 {
 	NTSTATUS status;
 	struct userinfo_state *s;
 	
 	status = composite_wait(c);
 	
-	if (NT_STATUS_IS_OK(status)) {
+	if (NT_STATUS_IS_OK(status) && io) {
 		s = talloc_get_type(c->private, struct userinfo_state);
 		talloc_steal(mem_ctx, &s->io.out.info);
+		io->out.info = s->io.out.info;
 	}
 
 	talloc_free(c);
@@ -224,5 +229,5 @@
 				struct rpc_composite_userinfo *io)
 {
 	struct composite_context *c = rpc_composite_userinfo_send(pipe, io);
-	return rpc_composite_userinfo_recv(c, mem_ctx);
+	return rpc_composite_userinfo_recv(c, mem_ctx, io);
 }



More information about the samba-cvs mailing list