]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
registry: add support for REG_MULTI_SZ to registry_push_value().
authorMichael Adam <obnox@samba.org>
Tue, 8 Apr 2008 15:44:40 +0000 (17:44 +0200)
committerMichael Adam <obnox@samba.org>
Wed, 9 Apr 2008 23:18:10 +0000 (01:18 +0200)
This enables us to fetch multi_sz values from registry...

Michael

source/lib/util_reg_api.c

index fccc38ebc01903fdd5be1c34a8d45b87a4c8e731..60031d97d30a1d2077a7887cd7dde48bb6cb622e 100644 (file)
@@ -152,6 +152,62 @@ WERROR registry_push_value(TALLOC_CTX *mem_ctx,
                }
                break;
        }
+       case REG_MULTI_SZ: {
+               uint32_t count;
+               size_t len = 0;
+               char **strings;
+               size_t *string_lengths;
+               uint32_t ofs;
+               TALLOC_CTX *tmp_ctx = talloc_stackframe();
+
+               strings = TALLOC_ARRAY(tmp_ctx, char *,
+                                      value->v.multi_sz.num_strings);
+               if (strings == NULL) {
+                       return WERR_NOMEM;
+               }
+
+               string_lengths = TALLOC_ARRAY(tmp_ctx, size_t,
+                                             value->v.multi_sz.num_strings);
+               if (string_lengths == NULL) {
+                       TALLOC_FREE(tmp_ctx);
+                       return WERR_NOMEM;
+               }
+
+               /* convert the single strings */
+               for (count = 0; count < value->v.multi_sz.num_strings; count++)
+               {
+                       string_lengths[count] = convert_string_talloc(
+                               strings, CH_UNIX, CH_UTF16LE,
+                               value->v.multi_sz.strings[count],
+                               strlen(value->v.multi_sz.strings[count])+1,
+                               (void *)&strings[count], false);
+                       if (string_lengths[count] == (size_t)-1) {
+                               TALLOC_FREE(tmp_ctx);
+                               return WERR_NOMEM;
+                       }
+                       len += string_lengths[count];
+               }
+
+               /* now concatenate all into the data blob */
+               presult->data = TALLOC_ARRAY(mem_ctx, uint8_t, len);
+               if (presult->data == NULL) {
+                       TALLOC_FREE(tmp_ctx);
+                       return WERR_NOMEM;
+               }
+               for (count = 0, ofs = 0;
+                    count < value->v.multi_sz.num_strings;
+                    count++)
+               {
+                       memcpy(presult->data + ofs, strings[count],
+                              string_lengths[count]);
+                       ofs += string_lengths[count];
+               }
+               presult->length = len;
+
+               TALLOC_FREE(tmp_ctx);
+
+               break;
+       }
        case REG_BINARY:
                *presult = data_blob_talloc(mem_ctx,
                                            value->v.binary.data,