s3: Move parse_sidlist to the only calling file
[sfrench/samba-autobuild/.git] / source3 / winbindd / winbindd_getsidaliases.c
index f01dac9c4ce9cd3ab1f2fd29184577231d12cc7b..ebaaf4d2df71cdf7f2b7597e2efed17c742dd9f1 100644 (file)
@@ -27,6 +27,9 @@ struct winbindd_getsidaliases_state {
        uint32_t *aliases;
 };
 
+static bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr,
+                         struct dom_sid **sids, uint32_t *num_sids);
+
 static void winbindd_getsidaliases_done(struct tevent_req *subreq);
 
 struct tevent_req *winbindd_getsidaliases_send(TALLOC_CTX *mem_ctx,
@@ -152,3 +155,42 @@ NTSTATUS winbindd_getsidaliases_recv(struct tevent_req *req,
        response->data.num_entries = state->num_aliases;
        return NT_STATUS_OK;
 }
+
+static bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr,
+                         struct dom_sid **sids, uint32_t *num_sids)
+{
+       const char *p, *q;
+
+       p = sidstr;
+       if (p == NULL)
+               return False;
+
+       while (p[0] != '\0') {
+               fstring tmp;
+               size_t sidlen;
+               struct dom_sid sid;
+               q = strchr(p, '\n');
+               if (q == NULL) {
+                       DEBUG(0, ("Got invalid sidstr: %s\n", p));
+                       return False;
+               }
+               sidlen = PTR_DIFF(q, p);
+               if (sidlen >= sizeof(tmp)-1) {
+                       return false;
+               }
+               memcpy(tmp, p, sidlen);
+               tmp[sidlen] = '\0';
+               q += 1;
+               if (!string_to_sid(&sid, tmp)) {
+                       DEBUG(0, ("Could not parse sid %s\n", p));
+                       return False;
+               }
+               if (!NT_STATUS_IS_OK(add_sid_to_array(mem_ctx, &sid, sids,
+                                                     num_sids)))
+               {
+                       return False;
+               }
+               p = q;
+       }
+       return True;
+}