summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2004-10-28 23:06:12 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:04:57 -0500
commit479bf22c813501f040adf7b6267b961748baa63f (patch)
treede1bbae68ca012671b2680ba02c973c4a9f71cc3
parent858f1763229a8da808a7473f565382a4b2924917 (diff)
downloadsamba-479bf22c813501f040adf7b6267b961748baa63f.tar.gz
samba-479bf22c813501f040adf7b6267b961748baa63f.tar.bz2
samba-479bf22c813501f040adf7b6267b961748baa63f.zip
r3340: Various fixes in the registry code. Implement the EnumKey call
in the server. (This used to be commit da65a248c292a90342e1394ee4132ef2c7afd3c8)
-rw-r--r--source4/lib/registry/common/reg_interface.c5
-rw-r--r--source4/lib/registry/reg_backend_ldb/reg_backend_ldb.c5
-rw-r--r--source4/lib/registry/reg_backend_rpc/reg_backend_rpc.c2
-rw-r--r--source4/rpc_server/winreg/rpc_winreg.c10
-rw-r--r--source4/torture/rpc/winreg.c12
5 files changed, 30 insertions, 4 deletions
diff --git a/source4/lib/registry/common/reg_interface.c b/source4/lib/registry/common/reg_interface.c
index 16edadfcbb..6237a788b7 100644
--- a/source4/lib/registry/common/reg_interface.c
+++ b/source4/lib/registry/common/reg_interface.c
@@ -191,7 +191,10 @@ WERROR reg_import_hive(struct registry_context *h, const char *backend, const ch
if(!W_ERROR_IS_OK(werr)) return werr;
- if(!ret->root) return WERR_GENERAL_FAILURE;
+ if(!ret->root) {
+ DEBUG(0, ("Backend %s didn't provide root key!\n", backend));
+ return WERR_GENERAL_FAILURE;
+ }
ret->root->hive = ret;
ret->root->name = NULL;
diff --git a/source4/lib/registry/reg_backend_ldb/reg_backend_ldb.c b/source4/lib/registry/reg_backend_ldb/reg_backend_ldb.c
index faa8a5e62c..b26ee6ec60 100644
--- a/source4/lib/registry/reg_backend_ldb/reg_backend_ldb.c
+++ b/source4/lib/registry/reg_backend_ldb/reg_backend_ldb.c
@@ -146,7 +146,10 @@ static WERROR ldb_open_hive(TALLOC_CTX *mem_ctx, struct registry_hive *hive, str
ldb_set_debug_stderr(c);
hive->backend_data = c;
- return ldb_open_key(mem_ctx, hive, "", k);
+ hive->root = talloc_zero_p(mem_ctx, struct registry_key);
+ hive->root->name = talloc_strdup(mem_ctx, "");
+
+ return WERR_OK;
}
static struct registry_operations reg_backend_ldb = {
diff --git a/source4/lib/registry/reg_backend_rpc/reg_backend_rpc.c b/source4/lib/registry/reg_backend_rpc/reg_backend_rpc.c
index 76c19d01ad..5ed03c062c 100644
--- a/source4/lib/registry/reg_backend_rpc/reg_backend_rpc.c
+++ b/source4/lib/registry/reg_backend_rpc/reg_backend_rpc.c
@@ -85,7 +85,7 @@ struct {
static WERROR rpc_query_key(struct registry_key *k);
-WERROR rpc_list_hives (TALLOC_CTX *mem_ctx, const char *location, const char *credentials, char ***hives)
+static WERROR rpc_list_hives (TALLOC_CTX *mem_ctx, const char *location, const char *credentials, char ***hives)
{
int i = 0;
*hives = talloc_p(mem_ctx, char *);
diff --git a/source4/rpc_server/winreg/rpc_winreg.c b/source4/rpc_server/winreg/rpc_winreg.c
index fc6e426152..6fa42d2bcd 100644
--- a/source4/rpc_server/winreg/rpc_winreg.c
+++ b/source4/rpc_server/winreg/rpc_winreg.c
@@ -177,7 +177,15 @@ static WERROR winreg_EnumKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem
h = dcesrv_handle_fetch(dce_call->conn, r->in.handle, HTYPE_REGKEY);
DCESRV_CHECK_HANDLE(h);
- key = h->data;
+ r->out.result = reg_key_get_subkey_by_index(mem_ctx, (struct registry_key *)h->data, r->in.enum_index, &key);
+
+ if (W_ERROR_IS_OK(r->out.result)) {
+ r->out.key_name_len = strlen(key->name);
+ r->out.out_name = talloc_zero_p(mem_ctx, struct winreg_EnumKeyNameResponse);
+ r->out.out_name->name = key->name;
+ r->out.class = talloc_zero_p(mem_ctx, struct winreg_String);
+ r->out.last_changed_time = talloc_zero_p(mem_ctx, struct winreg_Time);
+ }
return WERR_NOT_SUPPORTED;
}
diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c
index 3fdb546a09..1ca5768622 100644
--- a/source4/torture/rpc/winreg.c
+++ b/source4/torture/rpc/winreg.c
@@ -51,6 +51,11 @@ static BOOL test_GetVersion(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
return False;
}
+ if (!W_ERROR_IS_OK(r.out.result)) {
+ printf("GetVersion failed - %s\n", win_errstr(r.out.result));
+ return False;
+ }
+
return True;
}
@@ -106,6 +111,11 @@ static BOOL test_CloseKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
return False;
}
+ if (!W_ERROR_IS_OK(r.out.result)) {
+ printf("CloseKey failed - %s\n", win_errstr(r.out.result));
+ return False;
+ }
+
return True;
}
@@ -228,6 +238,8 @@ static BOOL test_EnumKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct winreg_Time tm;
NTSTATUS status;
+ printf("Testing EnumKey\n\n");
+
r.in.handle = handle;
r.in.enum_index = 0;
r.in.key_name_len = r.out.key_name_len = 0;