2007-08-26 15:16:40 +00:00
2007-10-06 00:17:44 +00:00
/*
2007-08-26 15:16:40 +00:00
Unix SMB / CIFS implementation .
Registry hive interface
2007-10-06 00:17:44 +00:00
Copyright ( C ) Jelmer Vernooij 2003 - 2007.
2007-08-26 15:16:40 +00:00
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
2008-03-28 01:08:49 -05:00
the Free Software Foundation ; either version 3 of the License , or
2007-08-26 15:16:40 +00:00
( at your option ) any later version .
2007-10-06 00:17:44 +00:00
2007-08-26 15:16:40 +00:00
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 .
2007-10-06 00:17:44 +00:00
2007-08-26 15:16:40 +00:00
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 .
*/
# include "includes.h"
2008-04-02 13:59:48 +02:00
# include "registry.h"
2007-08-26 15:16:40 +00:00
# include "system/filesys.h"
2008-02-21 17:17:37 +01:00
# include "param/param.h"
2007-08-26 15:16:40 +00:00
/** Open a registry file/host/etc */
2007-10-06 00:17:44 +00:00
_PUBLIC_ WERROR reg_open_hive ( TALLOC_CTX * parent_ctx , const char * location ,
struct auth_session_info * session_info ,
struct cli_credentials * credentials ,
2008-12-29 20:24:57 +01:00
struct tevent_context * ev_ctx ,
2007-12-14 00:27:31 +01:00
struct loadparm_context * lp_ctx ,
2007-10-06 00:17:44 +00:00
struct hive_key * * root )
2007-08-26 15:16:40 +00:00
{
int fd , num ;
char peek [ 20 ] ;
/* Check for directory */
if ( directory_exist ( location ) ) {
return reg_open_directory ( parent_ctx , location , root ) ;
}
fd = open ( location , O_RDWR ) ;
if ( fd = = - 1 ) {
2007-08-27 13:13:08 +00:00
if ( errno = = ENOENT )
2008-01-18 03:37:06 +01:00
return WERR_BADFILE ;
2007-08-26 15:16:40 +00:00
return WERR_BADFILE ;
}
num = read ( fd , peek , 20 ) ;
if ( num = = - 1 ) {
return WERR_BADFILE ;
}
if ( ! strncmp ( peek , " regf " , 4 ) ) {
close ( fd ) ;
2008-02-21 17:17:37 +01:00
return reg_open_regf_file ( parent_ctx , location , lp_iconv_convenience ( lp_ctx ) , root ) ;
2007-08-26 15:16:40 +00:00
} else if ( ! strncmp ( peek , " TDB file " , 8 ) ) {
close ( fd ) ;
2007-10-06 00:17:44 +00:00
return reg_open_ldb_file ( parent_ctx , location , session_info ,
2008-04-17 12:23:44 +02:00
credentials , ev_ctx , lp_ctx , root ) ;
2007-08-26 15:16:40 +00:00
}
return WERR_BADFILE ;
}
2007-10-06 00:17:44 +00:00
_PUBLIC_ WERROR hive_key_get_info ( TALLOC_CTX * mem_ctx ,
const struct hive_key * key ,
const char * * classname , uint32_t * num_subkeys ,
uint32_t * num_values ,
2008-01-07 14:11:29 -06:00
NTTIME * last_change_time ,
uint32_t * max_subkeynamelen ,
uint32_t * max_valnamelen ,
uint32_t * max_valbufsize )
2007-08-26 15:16:40 +00:00
{
2007-10-06 00:17:44 +00:00
return key - > ops - > get_key_info ( mem_ctx , key , classname , num_subkeys ,
2008-01-07 14:11:29 -06:00
num_values , last_change_time ,
max_subkeynamelen ,
max_valnamelen , max_valbufsize ) ;
2007-08-26 15:16:40 +00:00
}
2007-10-06 00:17:44 +00:00
_PUBLIC_ WERROR hive_key_add_name ( TALLOC_CTX * ctx ,
const struct hive_key * parent_key ,
const char * name , const char * classname ,
struct security_descriptor * desc ,
struct hive_key * * key )
2007-08-26 15:16:40 +00:00
{
SMB_ASSERT ( strchr ( name , ' \\ ' ) = = NULL ) ;
2007-10-06 00:17:44 +00:00
return parent_key - > ops - > add_key ( ctx , parent_key , name , classname ,
desc , key ) ;
2007-08-26 15:16:40 +00:00
}
_PUBLIC_ WERROR hive_key_del ( const struct hive_key * key , const char * name )
{
return key - > ops - > del_key ( key , name ) ;
}
_PUBLIC_ WERROR hive_get_key_by_name ( TALLOC_CTX * mem_ctx ,
2007-10-06 00:17:44 +00:00
const struct hive_key * key ,
const char * name ,
struct hive_key * * subkey )
2007-08-26 15:16:40 +00:00
{
return key - > ops - > get_key_by_name ( mem_ctx , key , name , subkey ) ;
}
WERROR hive_enum_key ( TALLOC_CTX * mem_ctx ,
2007-10-06 00:17:44 +00:00
const struct hive_key * key , uint32_t idx ,
const char * * name ,
const char * * classname ,
NTTIME * last_mod_time )
2007-08-26 15:16:40 +00:00
{
2007-10-06 00:17:44 +00:00
return key - > ops - > enum_key ( mem_ctx , key , idx , name , classname ,
last_mod_time ) ;
2007-08-26 15:16:40 +00:00
}
2007-12-22 05:03:02 -06:00
WERROR hive_key_set_value ( struct hive_key * key , const char * name , uint32_t type ,
2007-08-26 15:16:40 +00:00
const DATA_BLOB data )
{
if ( key - > ops - > set_value = = NULL )
return WERR_NOT_SUPPORTED ;
return key - > ops - > set_value ( key , name , type , data ) ;
}
2007-10-06 00:17:44 +00:00
WERROR hive_get_value ( TALLOC_CTX * mem_ctx ,
struct hive_key * key , const char * name ,
uint32_t * type , DATA_BLOB * data )
2007-08-26 15:16:40 +00:00
{
if ( key - > ops - > get_value_by_name = = NULL )
return WERR_NOT_SUPPORTED ;
return key - > ops - > get_value_by_name ( mem_ctx , key , name , type , data ) ;
}
2007-10-06 00:17:44 +00:00
WERROR hive_get_value_by_index ( TALLOC_CTX * mem_ctx ,
struct hive_key * key , uint32_t idx ,
const char * * name ,
uint32_t * type , DATA_BLOB * data )
2007-08-26 15:16:40 +00:00
{
if ( key - > ops - > enum_value = = NULL )
return WERR_NOT_SUPPORTED ;
return key - > ops - > enum_value ( mem_ctx , key , idx , name , type , data ) ;
}
2008-04-14 22:52:51 +02:00
WERROR hive_get_sec_desc ( TALLOC_CTX * mem_ctx ,
struct hive_key * key ,
struct security_descriptor * * security )
{
if ( key - > ops - > get_sec_desc = = NULL )
return WERR_NOT_SUPPORTED ;
return key - > ops - > get_sec_desc ( mem_ctx , key , security ) ;
}
WERROR hive_set_sec_desc ( struct hive_key * key ,
const struct security_descriptor * security )
{
if ( key - > ops - > set_sec_desc = = NULL )
return WERR_NOT_SUPPORTED ;
return key - > ops - > set_sec_desc ( key , security ) ;
}
2007-08-26 15:16:40 +00:00
2007-12-22 05:02:57 -06:00
WERROR hive_key_del_value ( struct hive_key * key , const char * name )
2007-08-26 15:16:40 +00:00
{
if ( key - > ops - > delete_value = = NULL )
return WERR_NOT_SUPPORTED ;
return key - > ops - > delete_value ( key , name ) ;
}
WERROR hive_key_flush ( struct hive_key * key )
{
if ( key - > ops - > flush_key = = NULL )
return WERR_OK ;
return key - > ops - > flush_key ( key ) ;
}