r10012: fix build breakage caused by forgotten commit in local tree
[nivanova/samba-autobuild/.git] / source3 / registry / reg_cachehook.c
index daf2f241800b4a67c76b96f389de9f8365745e20..32885be8e2ecffe62121f84b2ccae04a6b350493 100644 (file)
@@ -1,6 +1,6 @@
 /* 
  *  Unix SMB/CIFS implementation.
- *  RPC Pipe client / server routines
+ *  Virtual Windows Registry Layer
  *  Copyright (C) Gerald Carter                     2002.
  *
  *  This program is free software; you can redistribute it and/or modify
 /* Implementation of registry hook cache tree */
 
 #include "includes.h"
+#include "adt_tree.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
 
 static SORTED_TREE *cache_tree;
+extern REGISTRY_OPS regdb_ops;         /* these are the default */
+static REGISTRY_HOOK default_hook = { KEY_TREE_ROOT, &regdb_ops };
 
 /**********************************************************************
  Initialize the cache tree
@@ -33,7 +36,7 @@ static SORTED_TREE *cache_tree;
 
 BOOL reghook_cache_init( void )
 {
-       cache_tree = sorted_tree_init( NULL, NULL );
+       cache_tree = pathtree_init( &default_hook, NULL );
 
        return ( cache_tree == NULL );
 }
@@ -57,31 +60,45 @@ BOOL reghook_cache_add( REGISTRY_HOOK *hook )
 
        DEBUG(10,("reghook_cache_add: Adding key [%s]\n", key));
                
-       return sorted_tree_add( cache_tree, key, hook );
+       return pathtree_add( cache_tree, key, hook );
 }
 
 /**********************************************************************
  Initialize the cache tree
  *********************************************************************/
 
-REGISTRY_HOOK* reghook_cache_find( char *keyname )
+REGISTRY_HOOK* reghook_cache_find( const char *keyname )
 {
        char *key;
+       int len;
+       REGISTRY_HOOK *hook;
        
        if ( !keyname )
                return NULL;
-               
-       if ( (key = strdup( keyname )) == NULL ) {
-               DEBUG(0,("reghook_cache_find: strdup() failed for string [%s] !?!?!\n",
+       
+       /* prepend the string with a '\' character */
+       
+       len = strlen( keyname );
+       if ( !(key = SMB_MALLOC( len + 2 )) ) {
+               DEBUG(0,("reghook_cache_find: malloc failed for string [%s] !?!?!\n",
                        keyname));
                return NULL;
        }
+
+       *key = '\\';
+       strncpy( key+1, keyname, len+1);
        
+       /* swap to a form understood by the SORTED_TREE */
+
        string_sub( key, "\\", "/", 0 );
                
        DEBUG(10,("reghook_cache_find: Searching for keyname [%s]\n", key));
        
-       return sorted_tree_find( cache_tree, key ) ;
+       hook = pathtree_find( cache_tree, key ) ;
+       
+       SAFE_FREE( key );
+       
+       return hook;
 }
 
 /**********************************************************************
@@ -92,5 +109,5 @@ void reghook_dump_cache( int debuglevel )
 {
        DEBUG(debuglevel,("reghook_dump_cache: Starting cache dump now...\n"));
        
-       sorted_tree_print_keys( cache_tree, debuglevel );
+       pathtree_print_keys( cache_tree, debuglevel );
 }