diff options
author | Michael Adam <obnox@samba.org> | 2008-04-08 17:44:40 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2008-04-10 01:18:10 +0200 |
commit | 2ca280d551e5e99ccfd8d68449b0b6e1117c2be1 (patch) | |
tree | c32fca455dbb2a58e4242821118b4dfd68da935c /source3/lib/util_reg_api.c | |
parent | 199eb31cc99904b5a45cb1042dc14283b24cdb61 (diff) | |
download | samba-2ca280d551e5e99ccfd8d68449b0b6e1117c2be1.tar.gz samba-2ca280d551e5e99ccfd8d68449b0b6e1117c2be1.tar.xz 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/util_reg_api.c')
-rw-r--r-- | source3/lib/util_reg_api.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/source3/lib/util_reg_api.c b/source3/lib/util_reg_api.c index fccc38ebc01..60031d97d30 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, |