2002-07-19 03:00:24 +04:00
/*
* Unix SMB / CIFS implementation .
* RPC Pipe client / server routines
* Copyright ( C ) Gerald Carter 2002.
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/* Implementation of internal registry database functions. */
# include "includes.h"
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_RPC_SRV
static TDB_CONTEXT * tdb_reg ;
/***********************************************************************
Open the registry data in the tdb
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static BOOL init_registry_data ( void )
{
2002-07-19 22:49:44 +04:00
pstring keyname ;
REGSUBKEY_CTR subkeys ;
ZERO_STRUCTP ( & subkeys ) ;
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
/* HKEY_LOCAL_MACHINE */
2002-07-20 02:16:03 +04:00
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_addkey ( & subkeys , " SYSTEM " ) ;
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_destroy ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
2002-07-20 02:16:03 +04:00
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM " ) ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_addkey ( & subkeys , " CurrentControlSet " ) ;
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_destroy ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
2002-07-20 02:16:03 +04:00
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM/CurrentControlSet " ) ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_addkey ( & subkeys , " Control " ) ;
regsubkey_ctr_addkey ( & subkeys , " services " ) ;
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_destroy ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
2002-07-20 02:16:03 +04:00
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM/CurrentControlSet/Control " ) ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_addkey ( & subkeys , " Print " ) ;
regsubkey_ctr_addkey ( & subkeys , " ProductOptions " ) ;
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_destroy ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM/CurrentControlSet/Control/ProductOptions " ) ;
2002-07-19 22:49:44 +04:00
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-20 02:16:03 +04:00
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM/CurrentControlSet/services " ) ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_addkey ( & subkeys , " Netlogon " ) ;
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_destroy ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
2002-07-20 02:16:03 +04:00
regsubkey_ctr_init ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM/CurrentControlSet/services/Netlogon " ) ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_addkey ( & subkeys , " parameters " ) ;
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
2002-07-19 22:49:44 +04:00
regsubkey_ctr_destroy ( & subkeys ) ;
2002-07-19 03:00:24 +04:00
pstrcpy ( keyname , KEY_HKLM ) ;
pstrcat ( keyname , " /SYSTEM/CurrentControlSet/services/Netlogon/parameters " ) ;
2002-07-19 22:49:44 +04:00
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
/* HKEY_USER */
pstrcpy ( keyname , KEY_HKU ) ;
2002-07-19 22:49:44 +04:00
if ( ! regdb_store_reg_keys ( keyname , & subkeys ) )
2002-07-19 03:00:24 +04:00
return False ;
return True ;
}
/***********************************************************************
Open the registry database
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BOOL init_registry_db ( void )
{
static pid_t local_pid ;
if ( tdb_reg & & local_pid = = sys_getpid ( ) )
return True ;
/*
* try to open first without creating so we can determine
* if we need to init the data in the registry
*/
tdb_reg = tdb_open_log ( lock_path ( " registry.tdb " ) , 0 , TDB_DEFAULT , O_RDWR , 0600 ) ;
if ( ! tdb_reg )
{
tdb_reg = tdb_open_log ( lock_path ( " registry.tdb " ) , 0 , TDB_DEFAULT , O_RDWR | O_CREAT , 0600 ) ;
if ( ! tdb_reg ) {
DEBUG ( 0 , ( " init_registry: Failed to open registry %s (%s) \n " ,
lock_path ( " registry.tdb " ) , strerror ( errno ) ) ) ;
return False ;
}
DEBUG ( 10 , ( " init_registry: Successfully created registry tdb \n " ) ) ;
/* create the registry here */
if ( ! init_registry_data ( ) ) {
DEBUG ( 0 , ( " init_registry: Failed to initiailize data in registry! \n " ) ) ;
return False ;
}
}
local_pid = sys_getpid ( ) ;
return True ;
}
/***********************************************************************
Add subkey strings to the registry tdb under a defined key
fmt is the same format as tdb_pack except this function only supports
fstrings
The full path to the registry key is used as database after the
\ ' s are converted to / ' s .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
BOOL regdb_store_reg_keys ( char * keyname , REGSUBKEY_CTR * ctr )
2002-07-19 03:00:24 +04:00
{
TDB_DATA kbuf , dbuf ;
char * buffer , * tmpbuf ;
int i = 0 ;
uint32 len , buflen ;
BOOL ret = True ;
2002-07-19 22:49:44 +04:00
uint32 num_subkeys = regsubkey_ctr_numkeys ( ctr ) ;
2002-07-19 03:00:24 +04:00
if ( ! keyname )
return False ;
/* allocate some initial memory */
buffer = malloc ( sizeof ( pstring ) ) ;
buflen = sizeof ( pstring ) ;
len = 0 ;
/* store the number of subkeys */
2002-07-19 22:49:44 +04:00
len + = tdb_pack ( buffer + len , buflen - len , " d " , num_subkeys ) ;
2002-07-19 03:00:24 +04:00
/* pack all the strings */
for ( i = 0 ; i < num_subkeys ; i + + ) {
2002-07-19 22:49:44 +04:00
len + = tdb_pack ( buffer + len , buflen - len , " f " , regsubkey_ctr_specific_key ( ctr , i ) ) ;
2002-07-19 03:00:24 +04:00
if ( len > buflen ) {
/* allocate some extra space */
if ( ( tmpbuf = Realloc ( buffer , len * 2 ) ) = = NULL ) {
2002-07-19 22:49:44 +04:00
DEBUG ( 0 , ( " regdb_store_reg_keys: Failed to realloc memory of size [%d] \n " , len * 2 ) ) ;
2002-07-19 03:00:24 +04:00
ret = False ;
goto done ;
}
buffer = tmpbuf ;
buflen = len * 2 ;
2002-07-19 22:49:44 +04:00
len = tdb_pack ( buffer + len , buflen - len , " f " , regsubkey_ctr_specific_key ( ctr , i ) ) ;
2002-07-19 03:00:24 +04:00
}
}
/* finally write out the data */
kbuf . dptr = keyname ;
kbuf . dsize = strlen ( keyname ) + 1 ;
dbuf . dptr = buffer ;
dbuf . dsize = len ;
if ( tdb_store ( tdb_reg , kbuf , dbuf , TDB_REPLACE ) = = - 1 ) {
ret = False ;
goto done ;
}
done :
SAFE_FREE ( buffer ) ;
return ret ;
}
/***********************************************************************
Retrieve an array of strings containing subkeys . Memory should be
released by the caller . The subkeys are stored in a catenated string
of null terminated character strings
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
int regdb_fetch_reg_keys ( char * key , REGSUBKEY_CTR * ctr )
2002-07-19 03:00:24 +04:00
{
pstring path ;
uint32 num_items ;
TDB_DATA dbuf ;
char * buf ;
uint32 buflen , len ;
int i ;
2002-07-19 22:49:44 +04:00
fstring subkeyname ;
2002-07-19 03:00:24 +04:00
pstrcpy ( path , key ) ;
/* convert to key format */
pstring_sub ( path , " \\ " , " / " ) ;
dbuf = tdb_fetch_by_string ( tdb_reg , path ) ;
buf = dbuf . dptr ;
buflen = dbuf . dsize ;
if ( ! buf ) {
2002-07-19 22:49:44 +04:00
DEBUG ( 5 , ( " regdb_fetch_reg_keys: Failed to fetch any subkeys for [%s] \n " , key ) ) ;
2002-07-19 03:00:24 +04:00
return 0 ;
}
len = tdb_unpack ( buf , buflen , " d " , & num_items ) ;
for ( i = 0 ; i < num_items ; i + + ) {
2002-07-19 22:49:44 +04:00
len + = tdb_unpack ( buf + len , buflen - len , " f " , subkeyname ) ;
regsubkey_ctr_addkey ( ctr , subkeyname ) ;
2002-07-19 03:00:24 +04:00
}
SAFE_FREE ( dbuf . dptr ) ;
return num_items ;
}
2002-07-19 22:49:44 +04:00
2002-07-19 03:00:24 +04:00
/***********************************************************************
2002-07-19 22:49:44 +04:00
Retrieve an array of strings containing subkeys . Memory should be
released by the caller . The subkeys are stored in a catenated string
of null terminated character strings
2002-07-19 03:00:24 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
int regdb_fetch_reg_values ( char * key , REGVAL_CTR * val )
2002-07-19 03:00:24 +04:00
{
2002-07-19 22:49:44 +04:00
return 0 ;
2002-07-19 03:00:24 +04:00
}
/***********************************************************************
2002-07-19 22:49:44 +04:00
Stub function since we do not currently support storing registry
values in the registry . tdb
2002-07-19 03:00:24 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-07-19 22:49:44 +04:00
BOOL regdb_store_reg_values ( char * key , REGVAL_CTR * val )
2002-07-19 03:00:24 +04:00
{
2002-07-19 22:49:44 +04:00
return False ;
2002-07-19 03:00:24 +04:00
}
2002-07-19 22:49:44 +04:00
/*
* Table of function pointers for default access
*/
REGISTRY_OPS regdb_ops = {
regdb_fetch_reg_keys ,
regdb_fetch_reg_values ,
regdb_store_reg_keys ,
regdb_store_reg_values
} ;