2008-03-21 18:26:50 +03:00
/*
* Unix SMB / CIFS implementation .
* libsmbconf - Samba configuration library , registry backend
* Copyright ( C ) Michael Adam 2008
*
* 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 3 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 , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
2009-01-21 20:25:47 +03:00
# include "lib/smbconf/smbconf_private.h"
2009-10-02 02:17:06 +04:00
# include "registry.h"
2010-09-21 10:11:18 +04:00
# include "registry/reg_api.h"
2010-05-25 00:42:00 +04:00
# include "registry/reg_backend_db.h"
2010-05-25 01:37:09 +04:00
# include "registry/reg_util_token.h"
2010-09-20 04:42:10 +04:00
# include "registry/reg_api_util.h"
2010-09-21 10:50:54 +04:00
# include "registry/reg_init_smbconf.h"
2010-05-18 04:27:34 +04:00
# include "lib/smbconf/smbconf_init.h"
# include "lib/smbconf/smbconf_reg.h"
2011-02-26 02:28:15 +03:00
# include "../libcli/registry/util_reg.h"
2008-03-21 18:26:50 +03:00
2008-04-08 19:46:36 +04:00
# define INCLUDES_VALNAME "includes"
2008-03-22 00:52:27 +03:00
struct reg_private_data {
2009-02-21 20:00:42 +03:00
struct registry_key * base_key ;
2008-03-22 01:39:01 +03:00
bool open ; /* did _we_ open the registry? */
2008-03-22 00:52:27 +03:00
} ;
2008-03-21 18:26:50 +03:00
/**********************************************************************
*
* helper functions
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-03-22 00:55:20 +03:00
/**
* a convenience helper to cast the private data structure
*/
2008-03-22 00:52:27 +03:00
static struct reg_private_data * rpd ( struct smbconf_ctx * ctx )
{
return ( struct reg_private_data * ) ( ctx - > data ) ;
}
2008-04-09 00:51:02 +04:00
/*
* check whether a given value name is forbidden in registry ( smbconf )
*/
2008-04-09 00:57:48 +04:00
static bool smbconf_reg_valname_forbidden ( const char * valname )
2008-04-09 00:51:02 +04:00
{
/* hard code the list of forbidden names here for now */
const char * forbidden_valnames [ ] = {
" lock directory " ,
" lock dir " ,
" config backend " ,
2008-04-09 03:19:50 +04:00
" include " ,
2008-06-23 13:11:08 +04:00
" includes " , /* this has a special meaning internally */
2008-04-09 00:51:02 +04:00
NULL
} ;
const char * * forbidden = NULL ;
for ( forbidden = forbidden_valnames ; * forbidden ! = NULL ; forbidden + + ) {
if ( strwicmp ( valname , * forbidden ) = = 0 ) {
return true ;
}
}
return false ;
}
2008-04-09 02:05:45 +04:00
static bool smbconf_reg_valname_valid ( const char * valname )
{
2008-06-23 13:09:38 +04:00
return ( ! smbconf_reg_valname_forbidden ( valname ) & &
lp_parameter_is_valid ( valname ) ) ;
2008-04-09 02:05:45 +04:00
}
2008-03-21 18:26:50 +03:00
/**
2008-03-21 19:55:31 +03:00
* Open a subkey of the base key ( i . e a service )
2008-03-21 18:26:50 +03:00
*/
2011-04-08 19:20:35 +04:00
static sbcErr smbconf_reg_open_service_key ( TALLOC_CTX * mem_ctx ,
2008-03-21 18:26:50 +03:00
struct smbconf_ctx * ctx ,
const char * servicename ,
uint32 desired_access ,
struct registry_key * * key )
{
2009-03-05 00:02:07 +03:00
WERROR werr ;
2008-03-21 18:26:50 +03:00
if ( servicename = = NULL ) {
2009-02-21 20:00:42 +03:00
* key = rpd ( ctx ) - > base_key ;
2011-04-08 19:20:35 +04:00
return SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
}
2009-03-05 00:02:07 +03:00
werr = reg_openkey ( mem_ctx , rpd ( ctx ) - > base_key , servicename ,
2009-02-21 20:00:42 +03:00
desired_access , key ) ;
2009-03-05 00:02:07 +03:00
if ( W_ERROR_EQUAL ( werr , WERR_BADFILE ) ) {
2011-04-08 19:20:35 +04:00
return SBC_ERR_NO_SUCH_SERVICE ;
}
if ( ! W_ERROR_IS_OK ( werr ) ) {
return SBC_ERR_NOMEM ;
2009-03-05 00:02:07 +03:00
}
2011-04-08 19:20:35 +04:00
return SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
}
/**
* check if a value exists in a given registry key
*/
static bool smbconf_value_exists ( struct registry_key * key , const char * param )
{
bool ret = false ;
WERROR werr = WERR_OK ;
TALLOC_CTX * ctx = talloc_stackframe ( ) ;
struct registry_value * value = NULL ;
werr = reg_queryvalue ( ctx , key , param , & value ) ;
if ( W_ERROR_IS_OK ( werr ) ) {
ret = true ;
}
2009-01-21 19:16:37 +03:00
talloc_free ( ctx ) ;
2008-03-21 18:26:50 +03:00
return ret ;
}
/**
2008-03-21 19:55:31 +03:00
* create a subkey of the base key ( i . e . a service . . . )
2008-03-21 18:26:50 +03:00
*/
2011-04-08 17:48:01 +04:00
static sbcErr smbconf_reg_create_service_key ( TALLOC_CTX * mem_ctx ,
2008-03-21 18:26:50 +03:00
struct smbconf_ctx * ctx ,
const char * subkeyname ,
struct registry_key * * newkey )
{
2011-04-08 17:48:01 +04:00
WERROR werr ;
sbcErr err = SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
TALLOC_CTX * create_ctx ;
enum winreg_CreateAction action = REG_ACTION_NONE ;
/* create a new talloc ctx for creation. it will hold
* the intermediate parent key ( SMBCONF ) for creation
* and will be destroyed when leaving this function . . . */
2008-04-23 03:48:26 +04:00
create_ctx = talloc_stackframe ( ) ;
2008-03-21 18:26:50 +03:00
2009-02-21 20:00:42 +03:00
werr = reg_createkey ( mem_ctx , rpd ( ctx ) - > base_key , subkeyname ,
2008-03-21 18:26:50 +03:00
REG_KEY_WRITE , newkey , & action ) ;
if ( W_ERROR_IS_OK ( werr ) & & ( action ! = REG_CREATED_NEW_KEY ) ) {
DEBUG ( 10 , ( " Key '%s' already exists. \n " , subkeyname ) ) ;
2011-04-08 17:48:01 +04:00
err = SBC_ERR_FILE_EXISTS ;
2008-03-21 18:26:50 +03:00
}
if ( ! W_ERROR_IS_OK ( werr ) ) {
DEBUG ( 5 , ( " Error creating key %s: %s \n " ,
2008-11-01 19:19:26 +03:00
subkeyname , win_errstr ( werr ) ) ) ;
2011-04-08 17:48:01 +04:00
err = SBC_ERR_UNKNOWN_FAILURE ;
2008-03-21 18:26:50 +03:00
}
2009-01-21 19:16:37 +03:00
talloc_free ( create_ctx ) ;
2011-04-08 17:48:01 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
/**
* add a value to a key .
*/
static WERROR smbconf_reg_set_value ( struct registry_key * key ,
const char * valname ,
const char * valstr )
{
struct registry_value val ;
WERROR werr = WERR_OK ;
char * subkeyname ;
const char * canon_valname ;
const char * canon_valstr ;
if ( ! lp_canonicalize_parameter_with_value ( valname , valstr ,
& canon_valname ,
& canon_valstr ) )
{
if ( canon_valname = = NULL ) {
DEBUG ( 5 , ( " invalid parameter '%s' given \n " ,
valname ) ) ;
} else {
DEBUG ( 5 , ( " invalid value '%s' given for "
" parameter '%s' \n " , valstr , valname ) ) ;
}
werr = WERR_INVALID_PARAM ;
goto done ;
}
2008-04-09 00:57:48 +04:00
if ( smbconf_reg_valname_forbidden ( canon_valname ) ) {
2008-03-21 18:26:50 +03:00
DEBUG ( 5 , ( " Parameter '%s' not allowed in registry. \n " ,
canon_valname ) ) ;
werr = WERR_INVALID_PARAM ;
goto done ;
}
subkeyname = strrchr_m ( key - > key - > name , ' \\ ' ) ;
if ( ( subkeyname = = NULL ) | | ( * ( subkeyname + 1 ) = = ' \0 ' ) ) {
DEBUG ( 5 , ( " Invalid registry key '%s' given as "
" smbconf section. \n " , key - > key - > name ) ) ;
werr = WERR_INVALID_PARAM ;
goto done ;
}
subkeyname + + ;
if ( ! strequal ( subkeyname , GLOBAL_NAME ) & &
lp_parameter_is_global ( valname ) )
{
2009-04-07 21:58:14 +04:00
DEBUG ( 5 , ( " Global parameter '%s' not allowed in "
2008-03-21 18:26:50 +03:00
" service definition ('%s'). \n " , canon_valname ,
subkeyname ) ) ;
werr = WERR_INVALID_PARAM ;
goto done ;
}
2008-04-03 17:16:01 +04:00
ZERO_STRUCT ( val ) ;
val . type = REG_SZ ;
2010-06-29 18:13:15 +04:00
if ( ! push_reg_sz ( talloc_tos ( ) , & val . data , canon_valstr ) ) {
werr = WERR_NOMEM ;
goto done ;
}
2008-04-03 17:16:01 +04:00
2008-03-21 18:26:50 +03:00
werr = reg_setvalue ( key , canon_valname , & val ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
DEBUG ( 5 , ( " Error adding value '%s' to "
" key '%s': %s \n " ,
2008-11-01 19:19:26 +03:00
canon_valname , key - > key - > name , win_errstr ( werr ) ) ) ;
2008-03-21 18:26:50 +03:00
}
done :
return werr ;
}
2008-04-08 19:46:36 +04:00
static WERROR smbconf_reg_set_multi_sz_value ( struct registry_key * key ,
const char * valname ,
const uint32_t num_strings ,
const char * * strings )
{
WERROR werr ;
struct registry_value * value ;
uint32_t count ;
TALLOC_CTX * tmp_ctx = talloc_stackframe ( ) ;
2010-06-29 18:13:15 +04:00
const char * * array ;
2008-04-08 19:46:36 +04:00
if ( strings = = NULL ) {
werr = WERR_INVALID_PARAM ;
goto done ;
}
2010-06-29 18:13:15 +04:00
array = talloc_zero_array ( tmp_ctx , const char * , num_strings + 1 ) ;
if ( array = = NULL ) {
werr = WERR_NOMEM ;
goto done ;
}
2008-04-08 19:46:36 +04:00
2010-06-29 18:13:15 +04:00
value = TALLOC_ZERO_P ( tmp_ctx , struct registry_value ) ;
if ( value = = NULL ) {
2008-04-08 19:46:36 +04:00
werr = WERR_NOMEM ;
goto done ;
}
2010-06-29 18:13:15 +04:00
value - > type = REG_MULTI_SZ ;
2008-04-08 19:46:36 +04:00
for ( count = 0 ; count < num_strings ; count + + ) {
2010-06-29 18:13:15 +04:00
array [ count ] = talloc_strdup ( value , strings [ count ] ) ;
if ( array [ count ] = = NULL ) {
2008-04-08 19:46:36 +04:00
werr = WERR_NOMEM ;
goto done ;
}
}
2010-06-29 18:13:15 +04:00
if ( ! push_reg_multi_sz ( value , & value - > data , array ) ) {
werr = WERR_NOMEM ;
goto done ;
}
2008-04-08 19:46:36 +04:00
werr = reg_setvalue ( key , valname , value ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
DEBUG ( 5 , ( " Error adding value '%s' to key '%s': %s \n " ,
2008-11-01 19:19:26 +03:00
valname , key - > key - > name , win_errstr ( werr ) ) ) ;
2008-04-08 19:46:36 +04:00
}
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2008-04-08 19:46:36 +04:00
return werr ;
}
2008-03-21 18:26:50 +03:00
/**
* format a registry_value into a string .
*
* This is intended to be used for smbconf registry values ,
* which are ar stored as REG_SZ values , so the incomplete
* handling should be ok .
*/
static char * smbconf_format_registry_value ( TALLOC_CTX * mem_ctx ,
struct registry_value * value )
{
char * result = NULL ;
/* alternatively, create a new talloc context? */
if ( mem_ctx = = NULL ) {
return result ;
}
switch ( value - > type ) {
case REG_DWORD :
2010-06-29 18:13:15 +04:00
if ( value - > data . length > = 4 ) {
uint32_t v = IVAL ( value - > data . data , 0 ) ;
result = talloc_asprintf ( mem_ctx , " %d " , v ) ;
}
2008-03-21 18:26:50 +03:00
break ;
case REG_SZ :
2010-06-29 18:13:15 +04:00
case REG_EXPAND_SZ : {
const char * s ;
if ( ! pull_reg_sz ( mem_ctx , & value - > data , & s ) ) {
break ;
}
result = talloc_strdup ( mem_ctx , s ) ;
2008-03-21 18:26:50 +03:00
break ;
2010-06-29 18:13:15 +04:00
}
2008-03-21 18:26:50 +03:00
case REG_MULTI_SZ : {
2008-04-07 17:29:11 +04:00
uint32 j ;
2010-06-29 18:13:15 +04:00
const char * * a = NULL ;
if ( ! pull_reg_multi_sz ( mem_ctx , & value - > data , & a ) ) {
break ;
}
for ( j = 0 ; a [ j ] ! = NULL ; j + + ) {
2008-04-09 00:23:57 +04:00
result = talloc_asprintf ( mem_ctx , " %s \" %s \" " ,
result ? result : " " ,
2010-06-29 18:13:15 +04:00
a [ j ] ) ;
2008-03-21 18:26:50 +03:00
if ( result = = NULL ) {
break ;
}
2008-04-07 17:29:11 +04:00
}
break ;
}
2008-03-21 18:26:50 +03:00
case REG_BINARY :
2008-04-07 17:29:11 +04:00
result = talloc_asprintf ( mem_ctx , " binary (%d bytes) " ,
2010-06-29 18:13:15 +04:00
( int ) value - > data . length ) ;
2008-04-07 17:29:11 +04:00
break ;
default :
result = talloc_asprintf ( mem_ctx , " <unprintable> " ) ;
break ;
}
2008-03-21 18:26:50 +03:00
return result ;
}
2011-04-08 19:20:35 +04:00
static sbcErr smbconf_reg_get_includes_internal ( TALLOC_CTX * mem_ctx ,
2008-04-09 01:58:56 +04:00
struct registry_key * key ,
uint32_t * num_includes ,
char * * * includes )
{
WERROR werr ;
2011-04-08 16:19:15 +04:00
sbcErr err ;
2008-04-09 01:58:56 +04:00
uint32_t count ;
struct registry_value * value = NULL ;
char * * tmp_includes = NULL ;
2010-06-29 18:13:15 +04:00
const char * * array = NULL ;
2008-04-09 01:58:56 +04:00
TALLOC_CTX * tmp_ctx = talloc_stackframe ( ) ;
if ( ! smbconf_value_exists ( key , INCLUDES_VALNAME ) ) {
/* no includes */
2008-04-10 00:22:20 +04:00
* num_includes = 0 ;
* includes = NULL ;
2011-04-08 19:20:35 +04:00
err = SBC_ERR_OK ;
2008-04-09 01:58:56 +04:00
goto done ;
}
werr = reg_queryvalue ( tmp_ctx , key , INCLUDES_VALNAME , & value ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
2011-04-08 19:20:35 +04:00
err = SBC_ERR_ACCESS_DENIED ;
2008-04-09 01:58:56 +04:00
goto done ;
}
if ( value - > type ! = REG_MULTI_SZ ) {
2009-04-27 15:25:07 +04:00
/* wrong type -- ignore */
2011-04-08 19:20:35 +04:00
err = SBC_ERR_OK ;
2008-04-09 01:58:56 +04:00
goto done ;
}
2010-06-29 18:13:15 +04:00
if ( ! pull_reg_multi_sz ( tmp_ctx , & value - > data , & array ) ) {
2011-04-08 19:20:35 +04:00
err = SBC_ERR_NOMEM ;
2010-06-29 18:13:15 +04:00
goto done ;
}
for ( count = 0 ; array [ count ] ! = NULL ; count + + ) {
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx ,
2008-04-09 01:58:56 +04:00
& tmp_includes ,
count ,
2010-06-29 18:13:15 +04:00
array [ count ] ) ;
2011-04-08 16:19:15 +04:00
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-04-09 01:58:56 +04:00
goto done ;
}
}
if ( count > 0 ) {
* includes = talloc_move ( mem_ctx , & tmp_includes ) ;
if ( * includes = = NULL ) {
2011-04-08 19:20:35 +04:00
err = SBC_ERR_NOMEM ;
2008-04-09 01:58:56 +04:00
goto done ;
}
* num_includes = count ;
} else {
* num_includes = 0 ;
* includes = NULL ;
}
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2011-04-08 19:20:35 +04:00
return err ;
2008-04-09 01:58:56 +04:00
}
2008-03-21 18:26:50 +03:00
/**
* Get the values of a key as a list of value names
* and a list of value strings ( ordered )
*/
2011-04-08 19:20:35 +04:00
static sbcErr smbconf_reg_get_values ( TALLOC_CTX * mem_ctx ,
2008-03-21 18:26:50 +03:00
struct registry_key * key ,
uint32_t * num_values ,
char * * * value_names ,
char * * * value_strings )
{
TALLOC_CTX * tmp_ctx = NULL ;
WERROR werr = WERR_OK ;
2011-04-08 16:19:15 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
uint32_t count ;
struct registry_value * valvalue = NULL ;
char * valname = NULL ;
2008-04-09 02:05:45 +04:00
uint32_t tmp_num_values = 0 ;
2008-03-21 18:26:50 +03:00
char * * tmp_valnames = NULL ;
char * * tmp_valstrings = NULL ;
2008-04-09 02:47:27 +04:00
uint32_t num_includes = 0 ;
char * * includes = NULL ;
2008-03-21 18:26:50 +03:00
if ( ( num_values = = NULL ) | | ( value_names = = NULL ) | |
( value_strings = = NULL ) )
{
2011-04-08 19:20:35 +04:00
err = SBC_ERR_INVALID_PARAM ;
2008-03-21 18:26:50 +03:00
goto done ;
}
tmp_ctx = talloc_stackframe ( ) ;
for ( count = 0 ;
2008-04-07 17:15:57 +04:00
werr = reg_enumvalue ( tmp_ctx , key , count , & valname , & valvalue ) ,
W_ERROR_IS_OK ( werr ) ;
2008-03-21 18:26:50 +03:00
count + + )
{
char * valstring ;
2008-04-09 02:05:45 +04:00
if ( ! smbconf_reg_valname_valid ( valname ) ) {
continue ;
}
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx ,
& tmp_valnames ,
tmp_num_values , valname ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-03-21 18:26:50 +03:00
goto done ;
}
valstring = smbconf_format_registry_value ( tmp_ctx , valvalue ) ;
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx , & tmp_valstrings ,
tmp_num_values , valstring ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-03-21 18:26:50 +03:00
goto done ;
}
2008-04-09 02:05:45 +04:00
tmp_num_values + + ;
2008-03-21 18:26:50 +03:00
}
if ( ! W_ERROR_EQUAL ( WERR_NO_MORE_ITEMS , werr ) ) {
2011-04-08 19:20:35 +04:00
err = SBC_ERR_NOMEM ;
2008-03-21 18:26:50 +03:00
goto done ;
}
2008-04-09 02:47:27 +04:00
/* now add the includes at the end */
2011-04-08 19:20:35 +04:00
err = smbconf_reg_get_includes_internal ( tmp_ctx , key , & num_includes ,
2008-04-09 02:47:27 +04:00
& includes ) ;
2011-04-08 19:20:35 +04:00
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-04-09 02:47:27 +04:00
goto done ;
}
2011-04-08 19:20:35 +04:00
2008-04-09 02:47:27 +04:00
for ( count = 0 ; count < num_includes ; count + + ) {
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx , & tmp_valnames ,
tmp_num_values , " include " ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-04-09 02:47:27 +04:00
goto done ;
}
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx , & tmp_valstrings ,
tmp_num_values ,
includes [ count ] ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-04-09 02:47:27 +04:00
goto done ;
}
tmp_num_values + + ;
}
2008-03-21 18:26:50 +03:00
2008-04-09 02:05:45 +04:00
* num_values = tmp_num_values ;
if ( tmp_num_values > 0 ) {
2008-03-21 18:26:50 +03:00
* value_names = talloc_move ( mem_ctx , & tmp_valnames ) ;
* value_strings = talloc_move ( mem_ctx , & tmp_valstrings ) ;
} else {
* value_names = NULL ;
* value_strings = NULL ;
}
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2011-04-08 19:20:35 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
2008-04-15 19:39:01 +04:00
static bool smbconf_reg_key_has_values ( struct registry_key * key )
{
WERROR werr ;
uint32_t num_subkeys ;
uint32_t max_subkeylen ;
uint32_t max_subkeysize ;
uint32_t num_values ;
uint32_t max_valnamelen ;
uint32_t max_valbufsize ;
uint32_t secdescsize ;
NTTIME last_changed_time ;
werr = reg_queryinfokey ( key , & num_subkeys , & max_subkeylen ,
& max_subkeysize , & num_values , & max_valnamelen ,
& max_valbufsize , & secdescsize ,
& last_changed_time ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
return false ;
}
return ( num_values ! = 0 ) ;
}
/**
* delete all values from a key
*/
static WERROR smbconf_reg_delete_values ( struct registry_key * key )
{
WERROR werr ;
char * valname ;
struct registry_value * valvalue ;
uint32_t count ;
TALLOC_CTX * mem_ctx = talloc_stackframe ( ) ;
for ( count = 0 ;
werr = reg_enumvalue ( mem_ctx , key , count , & valname , & valvalue ) ,
W_ERROR_IS_OK ( werr ) ;
count + + )
{
werr = reg_deletevalue ( key , valname ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
goto done ;
}
}
if ( ! W_ERROR_EQUAL ( WERR_NO_MORE_ITEMS , werr ) ) {
DEBUG ( 1 , ( " smbconf_reg_delete_values: "
" Error enumerating values of %s: %s \n " ,
key - > key - > name ,
2008-11-01 19:19:26 +03:00
win_errstr ( werr ) ) ) ;
2008-04-15 19:39:01 +04:00
goto done ;
}
werr = WERR_OK ;
done :
2009-01-21 19:16:37 +03:00
talloc_free ( mem_ctx ) ;
2008-04-15 19:39:01 +04:00
return werr ;
}
2008-03-21 18:26:50 +03:00
/**********************************************************************
*
* smbconf operations : registry implementations
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* initialize the registry smbconf backend
*/
2011-04-08 12:28:17 +04:00
static sbcErr smbconf_reg_init ( struct smbconf_ctx * ctx , const char * path )
2008-03-21 18:26:50 +03:00
{
WERROR werr = WERR_OK ;
2011-04-08 12:28:17 +04:00
sbcErr err ;
2010-08-26 14:04:11 +04:00
struct security_token * token ;
2008-03-21 18:26:50 +03:00
2008-03-21 19:55:31 +03:00
if ( path = = NULL ) {
path = KEY_SMBCONF ;
}
ctx - > path = talloc_strdup ( ctx , path ) ;
if ( ctx - > path = = NULL ) {
werr = WERR_NOMEM ;
goto done ;
}
2008-03-22 00:52:27 +03:00
ctx - > data = TALLOC_ZERO_P ( ctx , struct reg_private_data ) ;
2008-03-21 18:26:50 +03:00
2009-02-21 20:00:42 +03:00
werr = ntstatus_to_werror ( registry_create_admin_token ( ctx , & token ) ) ;
2008-03-21 18:26:50 +03:00
if ( ! W_ERROR_IS_OK ( werr ) ) {
DEBUG ( 1 , ( " Error creating admin token \n " ) ) ;
2011-04-08 12:28:17 +04:00
err = SBC_ERR_UNKNOWN_FAILURE ;
2008-03-21 18:26:50 +03:00
goto done ;
}
2008-03-22 01:39:01 +03:00
rpd ( ctx ) - > open = false ;
2008-03-21 18:26:50 +03:00
2008-04-13 17:25:47 +04:00
werr = registry_init_smbconf ( path ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
2011-04-08 12:28:17 +04:00
err = SBC_ERR_BADFILE ;
2008-03-22 00:52:27 +03:00
goto done ;
}
2011-04-08 12:28:17 +04:00
err = ctx - > ops - > open_conf ( ctx ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2009-02-21 20:00:42 +03:00
DEBUG ( 1 , ( " Error opening the registry. \n " ) ) ;
goto done ;
}
werr = reg_open_path ( ctx , ctx - > path ,
2009-04-15 03:30:12 +04:00
KEY_ENUMERATE_SUB_KEYS | REG_KEY_WRITE ,
2009-02-21 20:00:42 +03:00
token , & rpd ( ctx ) - > base_key ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
2011-04-08 12:28:17 +04:00
err = SBC_ERR_UNKNOWN_FAILURE ;
2009-02-21 20:00:42 +03:00
goto done ;
}
2008-03-21 18:26:50 +03:00
done :
2011-04-08 12:28:17 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
static int smbconf_reg_shutdown ( struct smbconf_ctx * ctx )
{
2008-03-22 01:39:01 +03:00
return ctx - > ops - > close_conf ( ctx ) ;
2008-03-21 18:26:50 +03:00
}
2008-10-21 01:52:02 +04:00
static bool smbconf_reg_requires_messaging ( struct smbconf_ctx * ctx )
{
# ifdef CLUSTER_SUPPORT
if ( lp_clustering ( ) & & lp_parm_bool ( - 1 , " ctdb " , " registry.tdb " , true ) ) {
return true ;
}
# endif
return false ;
}
2008-10-23 13:16:50 +04:00
static bool smbconf_reg_is_writeable ( struct smbconf_ctx * ctx )
{
/*
* The backend has write support .
*
* TODO : add access checks whether the concrete
* config source is really writeable by the calling user .
*/
return true ;
}
2011-04-08 12:28:17 +04:00
static sbcErr smbconf_reg_open ( struct smbconf_ctx * ctx )
2008-03-21 18:26:50 +03:00
{
2008-03-22 01:39:01 +03:00
WERROR werr ;
if ( rpd ( ctx ) - > open ) {
2011-04-08 12:28:17 +04:00
return SBC_ERR_OK ;
2008-03-22 01:39:01 +03:00
}
werr = regdb_open ( ) ;
2011-04-08 12:28:17 +04:00
if ( ! W_ERROR_IS_OK ( werr ) ) {
return SBC_ERR_BADFILE ;
2008-03-22 01:39:01 +03:00
}
2011-04-08 12:28:17 +04:00
rpd ( ctx ) - > open = true ;
return SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
}
static int smbconf_reg_close ( struct smbconf_ctx * ctx )
{
2008-03-22 01:39:01 +03:00
int ret ;
if ( ! rpd ( ctx ) - > open ) {
return 0 ;
}
ret = regdb_close ( ) ;
if ( ret = = 0 ) {
rpd ( ctx ) - > open = false ;
}
return ret ;
2008-03-21 18:26:50 +03:00
}
/**
* Get the change sequence number of the given service / parameter .
* service and parameter strings may be NULL .
*/
static void smbconf_reg_get_csn ( struct smbconf_ctx * ctx ,
struct smbconf_csn * csn ,
const char * service , const char * param )
{
if ( csn = = NULL ) {
return ;
}
2008-03-22 01:39:01 +03:00
2011-04-08 12:28:17 +04:00
if ( ! SBC_ERROR_IS_OK ( ctx - > ops - > open_conf ( ctx ) ) ) {
2008-03-22 01:39:01 +03:00
return ;
}
2008-03-21 18:26:50 +03:00
csn - > csn = ( uint64_t ) regdb_get_seqnum ( ) ;
}
/**
* Drop the whole configuration ( restarting empty ) - registry version
*/
2011-04-08 12:40:02 +04:00
static sbcErr smbconf_reg_drop ( struct smbconf_ctx * ctx )
2008-03-21 18:26:50 +03:00
{
char * path , * p ;
WERROR werr = WERR_OK ;
2011-04-08 12:40:02 +04:00
sbcErr err = SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
struct registry_key * parent_key = NULL ;
struct registry_key * new_key = NULL ;
TALLOC_CTX * mem_ctx = talloc_stackframe ( ) ;
enum winreg_CreateAction action ;
2010-08-26 14:04:11 +04:00
struct security_token * token ;
2009-02-21 20:00:42 +03:00
werr = ntstatus_to_werror ( registry_create_admin_token ( ctx , & token ) ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
DEBUG ( 1 , ( " Error creating admin token \n " ) ) ;
2011-04-08 12:40:02 +04:00
err = SBC_ERR_UNKNOWN_FAILURE ;
2009-02-21 20:00:42 +03:00
goto done ;
}
2008-03-21 18:26:50 +03:00
2008-03-21 19:55:31 +03:00
path = talloc_strdup ( mem_ctx , ctx - > path ) ;
2008-03-21 18:26:50 +03:00
if ( path = = NULL ) {
2011-04-08 12:40:02 +04:00
err = SBC_ERR_NOMEM ;
2008-03-21 18:26:50 +03:00
goto done ;
}
p = strrchr ( path , ' \\ ' ) ;
2011-04-22 00:09:27 +04:00
if ( p = = NULL ) {
2011-04-08 12:40:02 +04:00
err = SBC_ERR_INVALID_PARAM ;
2011-04-22 00:09:27 +04:00
goto done ;
}
2008-03-21 18:26:50 +03:00
* p = ' \0 ' ;
2009-02-21 20:00:42 +03:00
werr = reg_open_path ( mem_ctx , path , REG_KEY_WRITE , token ,
& parent_key ) ;
2008-03-21 18:26:50 +03:00
if ( ! W_ERROR_IS_OK ( werr ) ) {
2011-04-08 12:40:02 +04:00
err = SBC_ERR_IO_FAILURE ;
2008-03-21 18:26:50 +03:00
goto done ;
}
2010-09-22 08:21:38 +04:00
werr = reg_deletekey_recursive ( parent_key , p + 1 ) ;
2008-03-21 18:26:50 +03:00
if ( ! W_ERROR_IS_OK ( werr ) ) {
2011-04-08 12:40:02 +04:00
err = SBC_ERR_IO_FAILURE ;
2008-03-21 18:26:50 +03:00
goto done ;
}
werr = reg_createkey ( mem_ctx , parent_key , p + 1 , REG_KEY_WRITE ,
& new_key , & action ) ;
2011-04-08 12:40:02 +04:00
if ( ! W_ERROR_IS_OK ( werr ) ) {
err = SBC_ERR_IO_FAILURE ;
goto done ;
}
2008-03-21 18:26:50 +03:00
done :
2009-01-21 19:16:37 +03:00
talloc_free ( mem_ctx ) ;
2011-04-08 12:40:02 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
/**
* get the list of share names defined in the configuration .
* registry version .
*/
2011-04-08 16:19:15 +04:00
static sbcErr smbconf_reg_get_share_names ( struct smbconf_ctx * ctx ,
2008-03-21 18:26:50 +03:00
TALLOC_CTX * mem_ctx ,
uint32_t * num_shares ,
char * * * share_names )
{
uint32_t count ;
uint32_t added_count = 0 ;
TALLOC_CTX * tmp_ctx = NULL ;
2011-04-08 16:19:15 +04:00
WERROR werr ;
sbcErr err = SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
char * subkey_name = NULL ;
char * * tmp_share_names = NULL ;
if ( ( num_shares = = NULL ) | | ( share_names = = NULL ) ) {
2011-04-08 16:19:15 +04:00
return SBC_ERR_INVALID_PARAM ;
2008-03-21 18:26:50 +03:00
}
tmp_ctx = talloc_stackframe ( ) ;
2008-04-15 19:39:01 +04:00
/* if there are values in the base key, return NULL as share name */
2009-02-21 20:00:42 +03:00
if ( smbconf_reg_key_has_values ( rpd ( ctx ) - > base_key ) ) {
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx , & tmp_share_names ,
2008-04-15 19:39:01 +04:00
0 , NULL ) ;
2011-04-08 16:19:15 +04:00
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-03-21 18:26:50 +03:00
goto done ;
}
added_count + + ;
}
2008-04-15 19:39:01 +04:00
/* make sure "global" is always listed first */
if ( smbconf_share_exists ( ctx , GLOBAL_NAME ) ) {
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx , & tmp_share_names ,
added_count , GLOBAL_NAME ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-04-15 19:39:01 +04:00
goto done ;
}
added_count + + ;
2008-03-21 18:26:50 +03:00
}
for ( count = 0 ;
2009-02-21 20:00:42 +03:00
werr = reg_enumkey ( tmp_ctx , rpd ( ctx ) - > base_key , count ,
& subkey_name , NULL ) ,
2008-04-07 17:15:57 +04:00
W_ERROR_IS_OK ( werr ) ;
2008-03-21 18:26:50 +03:00
count + + )
{
if ( strequal ( subkey_name , GLOBAL_NAME ) ) {
continue ;
}
2011-04-08 16:19:15 +04:00
err = smbconf_add_string_to_array ( tmp_ctx ,
2008-03-21 18:26:50 +03:00
& tmp_share_names ,
added_count ,
subkey_name ) ;
2011-04-08 16:19:15 +04:00
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-03-21 18:26:50 +03:00
goto done ;
}
added_count + + ;
}
if ( ! W_ERROR_EQUAL ( WERR_NO_MORE_ITEMS , werr ) ) {
2011-04-08 16:19:15 +04:00
err = SBC_ERR_NO_MORE_ITEMS ;
2008-03-21 18:26:50 +03:00
goto done ;
}
2011-04-08 16:19:15 +04:00
err = SBC_ERR_OK ;
2008-03-21 18:26:50 +03:00
* num_shares = added_count ;
if ( added_count > 0 ) {
* share_names = talloc_move ( mem_ctx , & tmp_share_names ) ;
} else {
* share_names = NULL ;
}
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2011-04-08 16:19:15 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
/**
* check if a share / service of a given name exists - registry version
*/
static bool smbconf_reg_share_exists ( struct smbconf_ctx * ctx ,
const char * servicename )
{
bool ret = false ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
TALLOC_CTX * mem_ctx = talloc_stackframe ( ) ;
struct registry_key * key = NULL ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( mem_ctx , ctx , servicename ,
REG_KEY_READ , & key ) ;
if ( SBC_ERROR_IS_OK ( err ) ) {
2008-03-21 18:26:50 +03:00
ret = true ;
}
2009-01-21 19:16:37 +03:00
talloc_free ( mem_ctx ) ;
2008-03-21 18:26:50 +03:00
return ret ;
}
/**
* Add a service if it does not already exist - registry version
*/
2011-04-08 17:48:01 +04:00
static sbcErr smbconf_reg_create_share ( struct smbconf_ctx * ctx ,
2008-03-21 18:26:50 +03:00
const char * servicename )
{
2011-04-08 17:48:01 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
struct registry_key * key = NULL ;
2008-04-15 19:39:01 +04:00
if ( servicename = = NULL ) {
2011-04-08 17:48:01 +04:00
return SBC_ERR_OK ;
2008-04-15 19:39:01 +04:00
}
2008-03-21 18:26:50 +03:00
2011-04-08 17:48:01 +04:00
err = smbconf_reg_create_service_key ( talloc_tos ( ) , ctx ,
servicename , & key ) ;
2009-02-21 20:00:42 +03:00
talloc_free ( key ) ;
2011-04-08 17:48:01 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
/**
* get a definition of a share ( service ) from configuration .
*/
2011-04-08 19:20:35 +04:00
static sbcErr smbconf_reg_get_share ( struct smbconf_ctx * ctx ,
2008-03-21 18:26:50 +03:00
TALLOC_CTX * mem_ctx ,
const char * servicename ,
2008-04-22 18:31:16 +04:00
struct smbconf_service * * service )
2008-03-21 18:26:50 +03:00
{
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
struct registry_key * key = NULL ;
2008-04-22 18:31:16 +04:00
struct smbconf_service * tmp_service = NULL ;
TALLOC_CTX * tmp_ctx = talloc_stackframe ( ) ;
2008-03-21 18:26:50 +03:00
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( tmp_ctx , ctx , servicename ,
REG_KEY_READ , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
2008-03-21 18:26:50 +03:00
goto done ;
}
2008-04-22 18:31:16 +04:00
tmp_service = TALLOC_ZERO_P ( tmp_ctx , struct smbconf_service ) ;
if ( tmp_service = = NULL ) {
2011-04-08 19:20:35 +04:00
err = SBC_ERR_NOMEM ;
2008-04-22 18:31:16 +04:00
goto done ;
}
if ( servicename ! = NULL ) {
tmp_service - > name = talloc_strdup ( tmp_service , servicename ) ;
if ( tmp_service - > name = = NULL ) {
2011-04-08 19:20:35 +04:00
err = SBC_ERR_NOMEM ;
2008-04-22 18:31:16 +04:00
goto done ;
}
}
2011-04-08 19:20:35 +04:00
err = smbconf_reg_get_values ( tmp_service , key ,
& ( tmp_service - > num_params ) ,
& ( tmp_service - > param_names ) ,
& ( tmp_service - > param_values ) ) ;
if ( SBC_ERROR_IS_OK ( err ) ) {
2008-04-22 18:31:16 +04:00
* service = talloc_move ( mem_ctx , & tmp_service ) ;
}
2008-03-21 18:26:50 +03:00
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2011-04-08 19:20:35 +04:00
return err ;
2008-03-21 18:26:50 +03:00
}
/**
* delete a service from configuration
*/
static WERROR smbconf_reg_delete_share ( struct smbconf_ctx * ctx ,
const char * servicename )
{
WERROR werr = WERR_OK ;
TALLOC_CTX * mem_ctx = talloc_stackframe ( ) ;
2008-04-15 19:39:01 +04:00
if ( servicename ! = NULL ) {
2010-09-22 08:21:38 +04:00
werr = reg_deletekey_recursive ( rpd ( ctx ) - > base_key , servicename ) ;
2008-04-15 19:39:01 +04:00
} else {
2009-02-21 20:00:42 +03:00
werr = smbconf_reg_delete_values ( rpd ( ctx ) - > base_key ) ;
2008-04-15 19:39:01 +04:00
}
2008-03-21 18:26:50 +03:00
2009-01-21 19:16:37 +03:00
talloc_free ( mem_ctx ) ;
2008-03-21 18:26:50 +03:00
return werr ;
}
/**
* set a configuration parameter to the value provided .
*/
static WERROR smbconf_reg_set_parameter ( struct smbconf_ctx * ctx ,
const char * service ,
const char * param ,
const char * valstr )
{
WERROR werr ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
struct registry_key * key = NULL ;
TALLOC_CTX * mem_ctx = talloc_stackframe ( ) ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( mem_ctx , ctx , service ,
REG_KEY_WRITE , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-03-21 18:26:50 +03:00
goto done ;
}
werr = smbconf_reg_set_value ( key , param , valstr ) ;
done :
2009-01-21 19:16:37 +03:00
talloc_free ( mem_ctx ) ;
2008-03-21 18:26:50 +03:00
return werr ;
}
/**
* get the value of a configuration parameter as a string
*/
static WERROR smbconf_reg_get_parameter ( struct smbconf_ctx * ctx ,
TALLOC_CTX * mem_ctx ,
const char * service ,
const char * param ,
char * * valstr )
{
WERROR werr = WERR_OK ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
struct registry_key * key = NULL ;
struct registry_value * value = NULL ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( mem_ctx , ctx , service ,
REG_KEY_READ , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-03-21 18:26:50 +03:00
goto done ;
}
2008-04-09 11:54:17 +04:00
if ( ! smbconf_reg_valname_valid ( param ) ) {
werr = WERR_INVALID_PARAM ;
goto done ;
}
2008-03-21 18:26:50 +03:00
if ( ! smbconf_value_exists ( key , param ) ) {
werr = WERR_INVALID_PARAM ;
goto done ;
}
werr = reg_queryvalue ( mem_ctx , key , param , & value ) ;
if ( ! W_ERROR_IS_OK ( werr ) ) {
goto done ;
}
* valstr = smbconf_format_registry_value ( mem_ctx , value ) ;
if ( * valstr = = NULL ) {
werr = WERR_NOMEM ;
}
done :
2009-01-21 19:16:37 +03:00
talloc_free ( key ) ;
talloc_free ( value ) ;
2008-03-21 18:26:50 +03:00
return werr ;
}
/**
* delete a parameter from configuration
*/
static WERROR smbconf_reg_delete_parameter ( struct smbconf_ctx * ctx ,
const char * service ,
const char * param )
{
struct registry_key * key = NULL ;
WERROR werr = WERR_OK ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-03-21 18:26:50 +03:00
TALLOC_CTX * mem_ctx = talloc_stackframe ( ) ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( mem_ctx , ctx , service ,
REG_KEY_ALL , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-03-21 18:26:50 +03:00
goto done ;
}
2008-04-09 11:54:17 +04:00
if ( ! smbconf_reg_valname_valid ( param ) ) {
werr = WERR_INVALID_PARAM ;
goto done ;
}
2008-03-21 18:26:50 +03:00
if ( ! smbconf_value_exists ( key , param ) ) {
werr = WERR_INVALID_PARAM ;
goto done ;
}
werr = reg_deletevalue ( key , param ) ;
done :
2009-01-21 19:16:37 +03:00
talloc_free ( mem_ctx ) ;
2008-03-21 18:26:50 +03:00
return werr ;
}
2008-04-08 03:56:32 +04:00
static WERROR smbconf_reg_get_includes ( struct smbconf_ctx * ctx ,
2008-04-08 12:16:03 +04:00
TALLOC_CTX * mem_ctx ,
2008-04-08 03:56:32 +04:00
const char * service ,
uint32_t * num_includes ,
char * * * includes )
{
2008-04-08 19:46:36 +04:00
WERROR werr ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-04-08 19:46:36 +04:00
struct registry_key * key = NULL ;
TALLOC_CTX * tmp_ctx = talloc_stackframe ( ) ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( tmp_ctx , ctx , service ,
REG_KEY_READ , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-04-08 19:46:36 +04:00
goto done ;
}
2011-04-08 19:20:35 +04:00
err = smbconf_reg_get_includes_internal ( mem_ctx , key , num_includes ,
2008-04-09 01:58:56 +04:00
includes ) ;
2011-04-08 19:20:35 +04:00
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
goto done ;
}
2008-04-08 19:46:36 +04:00
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2008-04-08 19:46:36 +04:00
return werr ;
2008-04-08 03:56:32 +04:00
}
static WERROR smbconf_reg_set_includes ( struct smbconf_ctx * ctx ,
const char * service ,
uint32_t num_includes ,
const char * * includes )
{
2008-04-08 19:46:36 +04:00
WERROR werr = WERR_OK ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-04-08 19:46:36 +04:00
struct registry_key * key = NULL ;
TALLOC_CTX * tmp_ctx = talloc_stackframe ( ) ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( tmp_ctx , ctx , service ,
REG_KEY_ALL , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-04-08 19:46:36 +04:00
goto done ;
}
2008-04-09 20:46:02 +04:00
if ( num_includes = = 0 ) {
if ( ! smbconf_value_exists ( key , INCLUDES_VALNAME ) ) {
goto done ;
}
werr = reg_deletevalue ( key , INCLUDES_VALNAME ) ;
} else {
werr = smbconf_reg_set_multi_sz_value ( key , INCLUDES_VALNAME ,
num_includes , includes ) ;
}
2008-04-08 19:46:36 +04:00
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2008-04-08 19:46:36 +04:00
return werr ;
2008-04-08 03:56:32 +04:00
}
2008-04-10 00:21:15 +04:00
static WERROR smbconf_reg_delete_includes ( struct smbconf_ctx * ctx ,
const char * service )
{
WERROR werr = WERR_OK ;
2011-04-08 19:20:35 +04:00
sbcErr err ;
2008-04-10 00:21:15 +04:00
struct registry_key * key = NULL ;
TALLOC_CTX * tmp_ctx = talloc_stackframe ( ) ;
2011-04-08 19:20:35 +04:00
err = smbconf_reg_open_service_key ( tmp_ctx , ctx , service ,
REG_KEY_ALL , & key ) ;
if ( ! SBC_ERROR_IS_OK ( err ) ) {
werr = WERR_NOMEM ;
2008-04-10 00:21:15 +04:00
goto done ;
}
if ( ! smbconf_value_exists ( key , INCLUDES_VALNAME ) ) {
goto done ;
}
werr = reg_deletevalue ( key , INCLUDES_VALNAME ) ;
done :
2009-01-21 19:16:37 +03:00
talloc_free ( tmp_ctx ) ;
2008-04-10 00:21:15 +04:00
return werr ;
}
2008-04-08 03:56:32 +04:00
2009-02-24 12:52:30 +03:00
static WERROR smbconf_reg_transaction_start ( struct smbconf_ctx * ctx )
{
return regdb_transaction_start ( ) ;
}
static WERROR smbconf_reg_transaction_commit ( struct smbconf_ctx * ctx )
{
return regdb_transaction_commit ( ) ;
}
static WERROR smbconf_reg_transaction_cancel ( struct smbconf_ctx * ctx )
{
return regdb_transaction_cancel ( ) ;
}
2008-03-21 18:26:50 +03:00
struct smbconf_ops smbconf_ops_reg = {
. init = smbconf_reg_init ,
. shutdown = smbconf_reg_shutdown ,
2008-10-21 01:52:02 +04:00
. requires_messaging = smbconf_reg_requires_messaging ,
2008-10-23 13:16:50 +04:00
. is_writeable = smbconf_reg_is_writeable ,
2008-03-21 18:26:50 +03:00
. open_conf = smbconf_reg_open ,
. close_conf = smbconf_reg_close ,
. get_csn = smbconf_reg_get_csn ,
. drop = smbconf_reg_drop ,
. get_share_names = smbconf_reg_get_share_names ,
. share_exists = smbconf_reg_share_exists ,
. create_share = smbconf_reg_create_share ,
. get_share = smbconf_reg_get_share ,
. delete_share = smbconf_reg_delete_share ,
. set_parameter = smbconf_reg_set_parameter ,
. get_parameter = smbconf_reg_get_parameter ,
2008-04-08 03:56:32 +04:00
. delete_parameter = smbconf_reg_delete_parameter ,
. get_includes = smbconf_reg_get_includes ,
. set_includes = smbconf_reg_set_includes ,
2008-04-10 00:21:15 +04:00
. delete_includes = smbconf_reg_delete_includes ,
2009-02-24 12:52:30 +03:00
. transaction_start = smbconf_reg_transaction_start ,
. transaction_commit = smbconf_reg_transaction_commit ,
. transaction_cancel = smbconf_reg_transaction_cancel ,
2008-03-21 18:26:50 +03:00
} ;
2008-03-21 18:35:52 +03:00
/**
* initialize the smbconf registry backend
* the only function that is exported from this module
*/
2011-04-07 19:19:03 +04:00
sbcErr smbconf_init_reg ( TALLOC_CTX * mem_ctx , struct smbconf_ctx * * conf_ctx ,
2008-03-21 19:55:31 +03:00
const char * path )
2008-03-21 18:26:50 +03:00
{
2008-04-13 18:26:14 +04:00
return smbconf_init_internal ( mem_ctx , conf_ctx , path , & smbconf_ops_reg ) ;
2008-03-21 18:26:50 +03:00
}