summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2008-04-08 17:44:40 +0200
committerMichael Adam <obnox@samba.org>2008-04-10 01:18:10 +0200
commit2ca280d551e5e99ccfd8d68449b0b6e1117c2be1 (patch)
treec32fca455dbb2a58e4242821118b4dfd68da935c /source3/lib
parent199eb31cc99904b5a45cb1042dc14283b24cdb61 (diff)
downloadsamba-2ca280d551e5e99ccfd8d68449b0b6e1117c2be1.tar.gz
samba-2ca280d551e5e99ccfd8d68449b0b6e1117c2be1.tar.bz2
samba-2ca280d551e5e99ccfd8d68449b0b6e1117c2be1.zip
registry: add support for REG_MULTI_SZ to registry_push_value().
This enables us to fetch multi_sz values from registry... Michael (This used to be commit a8cedfef27a0400c6aa05ddb5e51308ce0b789bd)
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/util_reg_api.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/source3/lib/util_reg_api.c b/source3/lib/util_reg_api.c
index fccc38ebc0..60031d97d3 100644
--- a/source3/lib/util_reg_api.c
+++ b/source3/lib/util_reg_api.c
@@ -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,