}
static void getsidaliases_recv(TALLOC_CTX *mem_ctx, bool success,
- struct winbindd_response *response,
- void *c, void *private_data)
+ struct winbindd_ndr_call *c,
+ void *_private_data,
+ void *_cont,
+ void *cont_private)
{
void (*cont)(void *priv, bool succ,
- DOM_SID *aliases, size_t num_aliases) =
- (void (*)(void *, bool, DOM_SID *, size_t))c;
- char *aliases_str;
- DOM_SID *sids = NULL;
- size_t num_sids = 0;
+ struct winbind_lookup_sid_info_array *aliases) =
+ (void (*)(void *, bool,
+ struct winbind_lookup_sid_info_array *))_cont;
+ struct winbind_lookup *r =
+ talloc_get_type_abort(_private_data, struct winbind_lookup);
if (!success) {
+ TALLOC_FREE(r);
DEBUG(5, ("Could not trigger getsidaliases\n"));
- cont(private_data, success, NULL, 0);
+ cont(cont_private, success, NULL);
return;
}
- if (response->result != WINBINDD_OK) {
- DEBUG(5, ("getsidaliases returned an error\n"));
- cont(private_data, False, NULL, 0);
- return;
- }
-
- aliases_str = (char *)response->extra_data.data;
-
- if (aliases_str == NULL) {
- DEBUG(10, ("getsidaliases return 0 SIDs\n"));
- cont(private_data, True, NULL, 0);
- return;
- }
-
- if (!parse_sidlist(mem_ctx, aliases_str, &sids, &num_sids)) {
- DEBUG(0, ("Could not parse sids\n"));
- cont(private_data, False, NULL, 0);
+ if (r->out.result != WINBIND_STATUS_OK) {
+ DEBUG(5, ("getsidaliases returned an error: 0x%08X\n",
+ r->out.result));
+ TALLOC_FREE(r);
+ cont(cont_private, false, NULL);
return;
}
- SAFE_FREE(response->extra_data.data);
-
- cont(private_data, True, sids, num_sids);
+ cont(cont_private, true, &r->out.rep->sid_array);
}
-void winbindd_getsidaliases_async(struct winbindd_domain *domain,
- TALLOC_CTX *mem_ctx,
- const DOM_SID *sids, size_t num_sids,
- void (*cont)(void *private_data,
- bool success,
- const DOM_SID *aliases,
- size_t num_aliases),
- void *private_data)
+static void winbindd_getsidaliases_async(struct winbindd_domain *domain,
+ TALLOC_CTX *mem_ctx,
+ const DOM_SID *sids, uint32_t num_sids,
+ void (*cont)(void *private_data,
+ bool success,
+ struct winbind_lookup_sid_info_array *a),
+ void *cont_private)
{
- struct winbindd_request request;
- char *sidstr = NULL;
- ssize_t len;
+ struct winbind_lookup *r = NULL;
+ uint32_t i;
if (num_sids == 0) {
- cont(private_data, True, NULL, 0);
+ cont(cont_private, true, NULL);
return;
}
- if (!print_sidlist(mem_ctx, sids, num_sids, &sidstr, &len)) {
- cont(private_data, False, NULL, 0);
- return;
+ r = TALLOC_P(mem_ctx, struct winbind_lookup);
+ if (!r) goto nomem;
+ r->in.level = TALLOC_P(r, enum winbind_lookup_level);
+ if (!r->in.level) goto nomem;
+
+ *r->in.level = WINBIND_LOOKUP_LEVEL_EXPANDALIASES;
+
+ r->in.req.sid_array.sids = talloc_array(r,
+ struct winbind_lookup_sid_info,
+ num_sids);
+ if (!r->in.req.sid_array.sids) goto nomem;
+
+ for (i=0; i < num_sids; i++) {
+ r->in.req.sid_array.sids[i].sid = sid_dup_talloc(r, &sids[i]);
+ if (!r->in.req.sid_array.sids[i].sid) goto nomem;
+ r->in.req.sid_array.sids[i].type = SID_NAME_UNKNOWN;
}
- ZERO_STRUCT(request);
- request.cmd = WINBINDD_DUAL_GETSIDALIASES;
- request.extra_len = len;
- request.extra_data.data = sidstr;
+ r->in.req.sid_array.num_sids = num_sids;
- do_async_domain(mem_ctx, domain, &request, getsidaliases_recv,
- (void *)cont, private_data);
+ do_async_ndr_domain(mem_ctx, domain,
+ NDR_WINBIND_LOOKUP, r,
+ getsidaliases_recv, r,
+ (void *)cont, cont_private);
+ return;
+nomem:
+ TALLOC_FREE(r);
+ cont(cont_private, false, NULL);
+ return;
}
enum winbindd_result winbindd_dual_getsidaliases(struct winbindd_domain *domain,
void *_cont,
void *cont_private);
static void gettoken_recvaliases(void *private_data, bool success,
- const DOM_SID *aliases,
- size_t num_aliases);
-
+ struct winbind_lookup_sid_info_array *aliases);
void winbindd_gettoken_async(TALLOC_CTX *mem_ctx, const DOM_SID *user_sid,
void (*cont)(void *private_data, bool success,
}
static void gettoken_recvaliases(void *private_data, bool success,
- const DOM_SID *aliases,
- size_t num_aliases)
+ struct winbind_lookup_sid_info_array *aliases)
{
struct gettoken_state *state = (struct gettoken_state *)private_data;
size_t i;
return;
}
- for (i=0; i<num_aliases; i++) {
+ for (i=0; aliases && i < aliases->num_sids; i++) {
if (!NT_STATUS_IS_OK(add_sid_to_array(state->mem_ctx,
- &aliases[i],
+ aliases->sids[i].sid,
&state->sids,
&state->num_sids)))
{