summaryrefslogtreecommitdiff
path: root/source4/lib/registry/reg_backend_dir/reg_backend_dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/registry/reg_backend_dir/reg_backend_dir.c')
-rw-r--r--source4/lib/registry/reg_backend_dir/reg_backend_dir.c63
1 files changed, 26 insertions, 37 deletions
diff --git a/source4/lib/registry/reg_backend_dir/reg_backend_dir.c b/source4/lib/registry/reg_backend_dir/reg_backend_dir.c
index baed39b4eb..5fec782e95 100644
--- a/source4/lib/registry/reg_backend_dir/reg_backend_dir.c
+++ b/source4/lib/registry/reg_backend_dir/reg_backend_dir.c
@@ -21,27 +21,11 @@
#include "includes.h"
#include "lib/registry/common/registry.h"
-static DIR *reg_dir_dir(REG_HANDLE *h, const char *base, const char *name)
-{
- char *path = NULL;
- DIR *d;
- asprintf(&path, "%s/%s/%s", h->location, base, name);
- path = reg_path_win2unix(path);
-
- d = opendir(path);
- if(!d) {
- printf("Unable to open '%s'\n", path);
- return NULL;
- }
- SAFE_FREE(path);
- return d;
-}
-
static BOOL reg_dir_add_key(REG_KEY *parent, const char *name)
{
char *path;
int ret;
- asprintf(&path, "%s/%s/%s", parent->handle->location, reg_key_get_path(parent), name);
+ asprintf(&path, "%s%s\\%s", parent->handle->location, reg_key_get_path(parent), name);
path = reg_path_win2unix(path);
ret = mkdir(path, 0700);
free(path);
@@ -50,13 +34,7 @@ static BOOL reg_dir_add_key(REG_KEY *parent, const char *name)
static BOOL reg_dir_del_key(REG_KEY *k)
{
- char *path;
- int ret;
- asprintf(&path, "%s/%s", k->handle->location, reg_key_get_path(k));
- path = reg_path_win2unix(path);
- ret = rmdir(path);
- free(path);
- return (ret == 0);
+ return (rmdir((char *)k->backend_data) == 0);
}
static REG_KEY *reg_dir_open_key(REG_HANDLE *h, const char *name)
@@ -67,32 +45,41 @@ static REG_KEY *reg_dir_open_key(REG_HANDLE *h, const char *name)
DEBUG(0, ("NULL pointer passed as directory name!"));
return NULL;
}
- fullpath = reg_path_win2unix(strdup(name));
- d = reg_dir_dir(h, "", fullpath);
- free(fullpath);
+ asprintf(&fullpath, "%s%s", h->location, name);
+ fullpath = reg_path_win2unix(fullpath);
- if(d) return reg_key_new_abs(name, h, d);
- return NULL;
+ d = opendir(fullpath);
+ if(!d) {
+ DEBUG(3,("Unable to open '%s': %s\n", fullpath, strerror(errno)));
+ SAFE_FREE(fullpath);
+ return NULL;
+ }
+ closedir(d);
+
+ return reg_key_new_abs(name, h, fullpath);
}
static BOOL reg_dir_fetch_subkeys(REG_KEY *k, int *count, REG_KEY ***r)
{
- DIR *d = (DIR *)k->backend_data;
struct dirent *e;
int max = 200;
+ char *fullpath = k->backend_data;
REG_KEY **ar;
- if(!d) return False;
- rewinddir(d);
+ DIR *d;
(*count) = 0;
ar = malloc(sizeof(REG_KEY *) * max);
+
+ d = opendir(fullpath);
+
+ if(!d) return False;
while((e = readdir(d))) {
if(e->d_type == DT_DIR &&
strcmp(e->d_name, ".") &&
strcmp(e->d_name, "..")) {
- char *fullpath = reg_path_win2unix(strdup(k->path));
- ar[(*count)] = reg_key_new_rel(e->d_name, k, reg_dir_dir(k->handle, fullpath, e->d_name));
- free(fullpath);
+ char *newfullpath;
+ asprintf(&newfullpath, "%s/%s", fullpath, e->d_name);
+ ar[(*count)] = reg_key_new_rel(e->d_name, k, newfullpath);
if(ar[(*count)])(*count)++;
if((*count) == max) {
@@ -101,6 +88,8 @@ static BOOL reg_dir_fetch_subkeys(REG_KEY *k, int *count, REG_KEY ***r)
}
}
}
+
+ closedir(d);
*r = ar;
return True;
@@ -113,7 +102,7 @@ static BOOL reg_dir_open(REG_HANDLE *h, const char *loc, BOOL try) {
static void dir_free(REG_KEY *k)
{
- closedir((DIR *)k->backend_data);
+ free(k->backend_data);
}
static REG_VAL *reg_dir_add_value(REG_KEY *p, const char *name, int type, void *data, int len)
@@ -132,7 +121,7 @@ static REG_VAL *reg_dir_add_value(REG_KEY *p, const char *name, int type, void *
static BOOL reg_dir_del_value(REG_VAL *v)
{
- char *fullpath = reg_path_win2unix(strdup(reg_val_get_path(v)));
+ /* FIXME*/
return False;
}