use WINBIND_LOOKUP_LEVEL_RIDS2NAMES for winbindd_lookuprids
authorStefan Metzmacher <metze@sernet.de>
Mon, 28 Jan 2008 14:51:18 +0000 (15:51 +0100)
committerStefan Metzmacher <metze@sernet.de>
Fri, 2 May 2008 14:13:22 +0000 (16:13 +0200)
metze

source/winbindd/winbindd_sid.c

index a97172eca261d0ffcf371038db636e2b60bf94ac..ff6aaf4a3a680f9c94f67e316840fd5ea80f9d46 100644 (file)
@@ -124,24 +124,84 @@ static void lookupname_recv(void *private_data, bool success,
        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));
@@ -149,7 +209,12 @@ void winbindd_lookuprids(struct winbindd_cli_state *state)
                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