summaryrefslogtreecommitdiff
path: root/source3/lib/util_reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/util_reg.c')
-rw-r--r--source3/lib/util_reg.c95
1 files changed, 72 insertions, 23 deletions
diff --git a/source3/lib/util_reg.c b/source3/lib/util_reg.c
index 1e1bcfeb10..ca46f86f69 100644
--- a/source3/lib/util_reg.c
+++ b/source3/lib/util_reg.c
@@ -18,6 +18,7 @@
*/
#include "includes.h"
+#include "../librpc/gen_ndr/ndr_winreg.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_REGISTRY
@@ -75,38 +76,86 @@ const char *reg_type_lookup(enum winreg_Type type)
WERROR reg_pull_multi_sz(TALLOC_CTX *mem_ctx, const void *buf, size_t len,
uint32 *num_values, char ***values)
{
- const smb_ucs2_t *p = (const smb_ucs2_t *)buf;
- *num_values = 0;
+ DATA_BLOB blob;
+ const char **vals;
+ int i;
- /*
- * Make sure that a talloc context for the strings retrieved exists
- */
+ blob = data_blob_const((uint8_t *)buf, len);
- if (!(*values = TALLOC_ARRAY(mem_ctx, char *, 1))) {
+ if (!pull_reg_multi_sz(mem_ctx, &blob, &vals)) {
return WERR_NOMEM;
}
- len /= 2; /* buf is a set of UCS2 strings */
+ for (i=0; vals[i]; i++) {
+ ;;
+ }
- while (len > 0) {
- char *val;
- size_t dstlen, thislen;
+ *num_values = i;
+ *values = (char **)vals;
- thislen = strnlen_w(p, len) + 1;
- if (!convert_string_talloc(*values, CH_UTF16LE, CH_UNIX,
- p, thislen*2, (void *)&val, &dstlen, true)) {
- TALLOC_FREE(*values);
- return WERR_NOMEM;
- }
+ return WERR_OK;
+}
- ADD_TO_ARRAY(*values, char *, val, values, num_values);
- if (*values == NULL) {
- return WERR_NOMEM;
- }
+/*******************************************************************
+ push a string in unix charset into a REG_SZ UCS2 null terminated blob
+ ********************************************************************/
- p += thislen;
- len -= thislen;
+bool push_reg_sz(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, const char *s)
+{
+ union winreg_Data data;
+ enum ndr_err_code ndr_err;
+ data.string = s;
+ ndr_err = ndr_push_union_blob(blob, mem_ctx, NULL, &data, REG_SZ,
+ (ndr_push_flags_fn_t)ndr_push_winreg_Data);
+ return NDR_ERR_CODE_IS_SUCCESS(ndr_err);
+}
+
+/*******************************************************************
+ push a string_array in unix charset into a REG_MULTI_SZ UCS2 double-null
+ terminated blob
+ ********************************************************************/
+
+bool push_reg_multi_sz(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, const char **a)
+{
+ union winreg_Data data;
+ enum ndr_err_code ndr_err;
+ data.string_array = a;
+ ndr_err = ndr_push_union_blob(blob, mem_ctx, NULL, &data, REG_MULTI_SZ,
+ (ndr_push_flags_fn_t)ndr_push_winreg_Data);
+ return NDR_ERR_CODE_IS_SUCCESS(ndr_err);
+}
+
+/*******************************************************************
+ pull a string in unix charset out of a REG_SZ UCS2 null terminated blob
+ ********************************************************************/
+
+bool pull_reg_sz(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, const char **s)
+{
+ union winreg_Data data;
+ enum ndr_err_code ndr_err;
+ ndr_err = ndr_pull_union_blob(blob, mem_ctx, NULL, &data, REG_SZ,
+ (ndr_pull_flags_fn_t)ndr_pull_winreg_Data);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ return false;
}
+ *s = data.string;
+ return true;
+}
- return WERR_OK;
+/*******************************************************************
+ pull a string_array in unix charset out of a REG_MULTI_SZ UCS2 double-null
+ terminated blob
+ ********************************************************************/
+
+bool pull_reg_multi_sz(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, const char ***a)
+{
+ union winreg_Data data;
+ enum ndr_err_code ndr_err;
+ ndr_err = ndr_pull_union_blob(blob, mem_ctx, NULL, &data, REG_MULTI_SZ,
+ (ndr_pull_flags_fn_t)ndr_pull_winreg_Data);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ return false;
+ }
+ *a = data.string_array;
+ return true;
}