return;
}
+static void lookuprids_recv(void *private_data,
+ bool success,
+ struct winbind_lookup *r)
+{
+ uint32_t i;
+ size_t buflen = 0;
+ ssize_t len = 0;
+ char *result = NULL;
+ struct winbindd_cli_state *state =
+ talloc_get_type_abort(private_data, struct winbindd_cli_state);
+
+ if (!success) {
+ request_error(state);
+ return;
+ }
+
+ if (r->in.req.rids.num_rids != r->out.rep->name_array.num_names) {
+ request_error(state);
+ return;
+ }
+
+ for (i=0; i < r->out.rep->name_array.num_names; i++) {
+ sprintf_append(state->mem_ctx, &result, &len, &buflen,
+ "%d %s\n",
+ r->out.rep->name_array.names[i].type,
+ r->out.rep->name_array.names[i].account_name);
+ }
+
+ if (r->out.rep->name_array.num_names > 0) {
+ fstrcpy(state->response.data.domain_name, r->out.rep->name_array.names[0].domain_name);
+ }
+
+ state->response.extra_data.data = SMB_STRDUP(result);
+ if (!state->response.extra_data.data) {
+ request_error(state);
+ return;
+ }
+ state->response.length += len+1;
+
+ request_ok(state);
+}
+
void winbindd_lookuprids(struct winbindd_cli_state *state)
{
struct winbindd_domain *domain;
- DOM_SID domain_sid;
-
+ struct winbind_lookup *r;
+
/* Ensure null termination */
state->request.data.sid[sizeof(state->request.data.sid)-1]='\0';
DEBUG(10, ("lookup_rids: %s\n", state->request.data.sid));
- if (!string_to_sid(&domain_sid, state->request.data.sid)) {
+ r = TALLOC_P(state->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_RIDS2NAMES;
+ r->in.req.rids.domain_sid = talloc_zero(r, struct dom_sid);
+ if (!r->in.req.rids.domain_sid) goto nomem;
+ r->in.req.rids.rids = NULL;
+ r->in.req.rids.num_rids = 0;
+
+ if (!parse_ridlist(state->mem_ctx, state->request.extra_data.data,
+ &r->in.req.rids.rids, &r->in.req.rids.num_rids)) {
+ DEBUG(5, ("Could not parse ridlist\n"));
+ request_error(state);
+ return;
+ }
+
+ if (!string_to_sid(r->in.req.rids.domain_sid, state->request.data.sid)) {
DEBUG(5, ("Could not convert %s to SID\n",
state->request.data.sid));
request_error(state);
return;
}
- domain = find_lookup_domain_from_sid(&domain_sid);
+ domain = find_lookup_domain_from_sid(r->in.req.rids.domain_sid);
if (domain == NULL) {
DEBUG(10, ("Could not find domain for name %s\n",
state->request.domain_name));
return;
}
- sendto_domain(state, domain);
+ winbindd_lookup_async(state->mem_ctx, domain,
+ r, lookuprids_recv, state);
+ return;
+nomem:
+ request_error(state);
+ return;
}
/* Convert a sid to a uid. We assume we only have one rid attached to the