Author: obnox
Date: 2007-06-12 10:02:08 +0000 (Tue, 12 Jun 2007)
New Revision: 23428

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23428

Log:
Merge r19828 from 3_0: Add registry_fetch_values.

Michael


Modified:
   branches/SAMBA_3_0_26/source/registry/reg_frontend.c


Changeset:
Modified: branches/SAMBA_3_0_26/source/registry/reg_frontend.c
===================================================================
--- branches/SAMBA_3_0_26/source/registry/reg_frontend.c        2007-06-12 
09:12:29 UTC (rev 23427)
+++ branches/SAMBA_3_0_26/source/registry/reg_frontend.c        2007-06-12 
10:02:08 UTC (rev 23428)
@@ -263,7 +263,63 @@
        return result;
 }
 
+NTSTATUS registry_fetch_values(TALLOC_CTX *mem_ctx, REGISTRY_KEY *key,
+                              uint32 *pnum_values, char ***pnames,
+                              struct registry_value ***pvalues)
+{
+       REGVAL_CTR *ctr;
+       char **names;
+       struct registry_value **values;
+       uint32 i;
 
+       if (!(ctr = TALLOC_ZERO_P(mem_ctx, REGVAL_CTR))) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       if (fetch_reg_values(key, ctr) == -1) {
+               TALLOC_FREE(ctr);
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       if (ctr->num_values == 0) {
+               *pnum_values = 0;
+               TALLOC_FREE(ctr);
+               return NT_STATUS_OK;
+       }
+
+       if ((!(names = TALLOC_ARRAY(ctr, char *, ctr->num_values))) ||
+           (!(values = TALLOC_ARRAY(ctr, struct registry_value *,
+                                    ctr->num_values)))) {
+               TALLOC_FREE(ctr);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       for (i=0; i<ctr->num_values; i++) {
+               REGISTRY_VALUE *val = ctr->values[i];
+               NTSTATUS status;
+
+               if (!(names[i] = talloc_strdup(names, val->valuename))) {
+                       TALLOC_FREE(ctr);
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               status = registry_pull_value(values, &values[i],
+                                            val->type, val->data_p,
+                                            val->size, val->size);
+               if (!NT_STATUS_IS_OK(status)) {
+                       TALLOC_FREE(ctr);
+                       return status;
+               }
+       }
+
+       *pnum_values = ctr->num_values;
+       *pnames = talloc_move(mem_ctx, &names);
+       *pvalues = talloc_move(mem_ctx, &values);
+
+       TALLOC_FREE(ctr);
+       return NT_STATUS_OK;
+}
+
 /***********************************************************************
  retreive a specific subkey specified by index.  Caller is 
  responsible for freeing memory

Reply via email to