wb-ndr: use WINBIND_LOOKUP_LEVEL_EXPANDALIASES instead of WINBINDD_DUAL_GETSIDALIASES
authorStefan Metzmacher <metze@sernet.de>
Tue, 11 Mar 2008 19:54:23 +0000 (20:54 +0100)
committerStefan Metzmacher <metze@sernet.de>
Fri, 2 May 2008 14:13:37 +0000 (16:13 +0200)
metze

source/winbindd/winbindd_async.c

index e5f23f196c2fa2864c540c9f055c1330a24a30d0..599bfa58426d3e54661463b4257e748f2657453b 100644 (file)
@@ -891,77 +891,81 @@ void winbindd_lookup_async(TALLOC_CTX *mem_ctx,
 }
 
 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,
@@ -1068,9 +1072,7 @@ static void gettoken_recvdomgroups(TALLOC_CTX *mem_ctx, bool success,
                                   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,
@@ -1195,8 +1197,7 @@ static void gettoken_recvdomgroups(TALLOC_CTX *mem_ctx, 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;
@@ -1207,9 +1208,9 @@ static void gettoken_recvaliases(void *private_data, bool success,
                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)))
                {