summaryrefslogtreecommitdiff
path: root/source4/winbind/wb_cmd_userdomgroups.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/winbind/wb_cmd_userdomgroups.c')
-rw-r--r--source4/winbind/wb_cmd_userdomgroups.c72
1 files changed, 17 insertions, 55 deletions
diff --git a/source4/winbind/wb_cmd_userdomgroups.c b/source4/winbind/wb_cmd_userdomgroups.c
index ea2db9877f..b69547b3e4 100644
--- a/source4/winbind/wb_cmd_userdomgroups.c
+++ b/source4/winbind/wb_cmd_userdomgroups.c
@@ -29,70 +29,29 @@
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);
}