r11181: Implement wbinfo -s and wbinfo --user-sids. The patch is so large because
[kai/samba.git] / source4 / winbind / wb_cmd_userdomgroups.c
index ea2db9877f925d968b89fd405b496cc55202a96b..b69547b3e46e5d1ed54c141b108f02c663cfbc22 100644 (file)
 
 struct cmd_userdomgroups_state {
        struct composite_context *ctx;
-       struct wbsrv_domain *domain;
+       struct dom_sid *dom_sid;
        uint32_t user_rid;
        int num_rids;
        uint32_t *rids;
 };
 
-static void composite_trigger_now(struct event_context *ev,
-                                 struct timed_event *te,
-                                 struct timeval t, void *ptr)
-{
-       struct composite_context *c =
-               talloc_get_type(ptr, struct composite_context);
-       if (NT_STATUS_IS_OK(c->status)) {
-               c->state = COMPOSITE_STATE_ERROR;
-       } else {
-               c->state = COMPOSITE_STATE_DONE;
-       }
-               
-       if (c->async.fn) {
-               c->async.fn(c);
-       }
-}
-
-
-static struct composite_context *userdomgroups_send_req(void *p);
+static struct composite_context *userdomgroups_send_req(struct wbsrv_domain *domain, void *p);
 static NTSTATUS userdomgroups_recv_req(struct composite_context *ctx, void *p);
 
-struct composite_context *wb_cmd_userdomgroups_send(struct wbsrv_call *call,
+struct composite_context *wb_cmd_userdomgroups_send(struct wbsrv_service *service,
                                                    const struct dom_sid *sid)
 {
        struct cmd_userdomgroups_state *state;
-       struct wbsrv_service *service = call->wbconn->listen_socket->service;
 
        state = talloc(NULL, struct cmd_userdomgroups_state);
-       state->domain = service->domains;
-
-       if (dom_sid_in_domain(state->domain->sid, sid)) {
-               state->user_rid = sid->sub_auths[sid->num_auths-1];
-               state->ctx = wb_queue_domain_send(state, state->domain,
-                                                 call->event_ctx,
-                                                 call->wbconn->conn->msg_ctx,
-                                                 userdomgroups_send_req,
-                                                 userdomgroups_recv_req,
-                                                 state);
-               if (state->ctx == NULL) goto failed;
-               state->ctx->private_data = state;
-               return state->ctx;
-       }
 
-       state->ctx = talloc(state, struct composite_context);
+       state->user_rid = sid->sub_auths[sid->num_auths-1];
+       state->ctx = wb_domain_request_send(state, service, sid,
+                                           userdomgroups_send_req,
+                                           userdomgroups_recv_req,
+                                           state);
        if (state->ctx == NULL) goto failed;
-       state->ctx->state = COMPOSITE_STATE_IN_PROGRESS;
-       state->ctx->async.fn = NULL;
-       state->ctx->event_ctx = call->event_ctx;
-       state->ctx->status = NT_STATUS_NO_SUCH_USER;
        state->ctx->private_data = state;
-
-       /* Using composite_trigger_error here causes problems with the client
-        * socket. Linux 2.6.8 gives me a ECONNRESET on the next read after
-        * writing the reply when I don't wait the 100 milliseconds. */
-       
-       event_add_timed(state->ctx->event_ctx, state->ctx,
-                       timeval_current_ofs(0, 100000),
-                       composite_trigger_now, state->ctx);
        return state->ctx;
 
  failed:
@@ -100,13 +59,16 @@ struct composite_context *wb_cmd_userdomgroups_send(struct wbsrv_call *call,
        return NULL;
 }
 
-static struct composite_context *userdomgroups_send_req(void *p)
+static struct composite_context *userdomgroups_send_req(struct wbsrv_domain *domain,
+                                                       void *p)
 {
        struct cmd_userdomgroups_state *state =
                talloc_get_type(p, struct cmd_userdomgroups_state);
 
-       return wb_samr_userdomgroups_send(state->domain->samr_pipe,
-                                         state->domain->domain_handle,
+       state->dom_sid = talloc_reference(state, domain->sid);
+       if (state->dom_sid == NULL) return NULL;
+       return wb_samr_userdomgroups_send(domain->samr_pipe,
+                                         domain->domain_handle,
                                          state->user_rid);
 }
 
@@ -140,7 +102,7 @@ NTSTATUS wb_cmd_userdomgroups_recv(struct composite_context *c,
        }
 
        for (i=0; i<state->num_rids; i++) {
-               (*sids)[i] = dom_sid_add_rid((*sids), state->domain->sid,
+               (*sids)[i] = dom_sid_add_rid((*sids), state->dom_sid,
                                             state->rids[i]);
                if ((*sids)[i] == NULL) {
                        status = NT_STATUS_NO_MEMORY;
@@ -153,12 +115,12 @@ done:
        return status;
 }
 
-NTSTATUS wb_cmd_userdomgroups(struct wbsrv_call *call,
+NTSTATUS wb_cmd_userdomgroups(struct wbsrv_service *service,
                              const struct dom_sid *sid,
                              TALLOC_CTX *mem_ctx, int *num_sids,
                              struct dom_sid ***sids)
 {
        struct composite_context *c =
-               wb_cmd_userdomgroups_send(call, sid);
+               wb_cmd_userdomgroups_send(service, sid);
        return wb_cmd_userdomgroups_recv(c, mem_ctx, num_sids, sids);
 }