r8904: Split off the query stage as a separate function.
authorRafal Szczesniak <mimir@samba.org>
Tue, 2 Aug 2005 01:12:58 +0000 (01:12 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:30:17 +0000 (13:30 -0500)
rafal
(This used to be commit bbe7e726af8c61108a7bca1e10e9340bbe37f3ef)

source4/libnet/userman.c

index f57b5c55f929023d1a793bca33fa8eb545e53743..59cb804ae98fc2cc3412e2dfe76066d45f6785a4 100644 (file)
@@ -591,10 +591,6 @@ static NTSTATUS usermod_open(struct composite_context *c,
        c->status = dcerpc_ndr_request_recv(s->req);
        NT_STATUS_NOT_OK_RETURN(c->status);
 
-       if (s->stage == USERMOD_QUERY) {
-               s->info = *s->queryuser.out.info;
-       }
-
        /* Prepare UserInfo level and data based on bitmask field */
        s->change.fields = usermod_setfields(s, &level, i);
 
@@ -619,6 +615,35 @@ static NTSTATUS usermod_open(struct composite_context *c,
 }
 
 
+/**
+ * Stage 2a (optional): Query the user information
+ */
+static NTSTATUS usermod_query(struct composite_context *c,
+                             struct usermod_state *s)
+{
+       union samr_UserInfo *i = &s->info;
+       uint16_t level;
+
+       c->status = dcerpc_ndr_request_recv(s->req);
+       NT_STATUS_NOT_OK_RETURN(c->status);
+
+       s->info = *s->queryuser.out.info;
+
+       s->change.fields = usermod_setfields(s, &level, i);
+
+       s->setuser.in.user_handle  = &s->user_handle;
+       s->setuser.in.level        = level;
+       s->setuser.in.info         = i;
+       
+       s->req = dcerpc_samr_SetUserInfo_send(s->pipe, c, &s->setuser);
+
+       s->req->async.callback = usermod_handler;
+       s->req->async.private  = c;
+
+       return NT_STATUS_OK;
+}
+
+
 /**
  * Stage 3: Set new user account data
  */
@@ -653,10 +678,13 @@ static void usermod_handler(struct rpc_request *req)
                break;
 
        case USERMOD_OPEN:
-       case USERMOD_QUERY:
                c->status = usermod_open(c, s);
                break;
 
+       case USERMOD_QUERY:
+               c->status = usermod_query(c, s);
+               break;
+
        case USERMOD_MODIFY:
                c->status = usermod_modify(c, s);
                break;