2005-05-23 20:25:31 +04:00
/*
* Unix SMB / CIFS implementation .
* Virtual Windows Registry Layer ( utility functions )
* Copyright ( C ) Gerald Carter 2002 - 2005
*
* 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
2007-07-09 23:25:36 +04:00
* the Free Software Foundation ; either version 3 of the License , or
2005-05-23 20:25:31 +04:00
* ( 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
2007-07-10 09:23:25 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2005-05-23 20:25:31 +04:00
*/
/* Implementation of registry frontend view functions. */
# include "includes.h"
# undef DBGC_CLASS
2007-09-29 03:05:52 +04:00
# define DBGC_CLASS DBGC_REGISTRY
2005-05-23 20:25:31 +04:00
/***********************************************************************
Utility function for splitting the base path of a registry path off
by setting base and new_path to the apprapriate offsets withing the
path .
WARNING ! ! Does modify the original string !
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool reg_split_path ( char * path , char * * base , char * * new_path )
2005-05-23 20:25:31 +04:00
{
char * p ;
* new_path = * base = NULL ;
if ( ! path )
return False ;
* base = path ;
p = strchr ( path , ' \\ ' ) ;
if ( p ) {
* p = ' \0 ' ;
* new_path = p + 1 ;
}
return True ;
}
/***********************************************************************
Utility function for splitting the base path of a registry path off
by setting base and new_path to the appropriate offsets withing the
path .
WARNING ! ! Does modify the original string !
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-10-19 04:40:25 +04:00
bool reg_split_key ( char * path , char * * base , char * * key )
2005-05-23 20:25:31 +04:00
{
char * p ;
* key = * base = NULL ;
if ( ! path )
return False ;
* base = path ;
p = strrchr ( path , ' \\ ' ) ;
if ( p ) {
* p = ' \0 ' ;
* key = p + 1 ;
}
return True ;
}
2005-06-27 07:40:03 +04:00
/**********************************************************************
The full path to the registry key is used as database after the
\ ' s are converted to / ' s . Key string is also normalized to UPPER
case .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void normalize_reg_path ( pstring keyname )
{
pstring_sub ( keyname , " \\ " , " / " ) ;
strupper_m ( keyname ) ;
}
2005-05-23 20:25:31 +04:00
2005-09-30 21:13:37 +04:00
/**********************************************************************
move to next non - delimter character
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char * reg_remaining_path ( const char * key )
{
2007-09-04 14:15:04 +04:00
pstring new_path ;
2005-09-30 21:13:37 +04:00
char * p ;
if ( ! key | | ! * key )
return NULL ;
pstrcpy ( new_path , key ) ;
/* normalize_reg_path( new_path ); */
if ( ! ( p = strchr ( new_path , ' \\ ' ) ) )
{
if ( ! ( p = strchr ( new_path , ' / ' ) ) )
p = new_path ;
else
p + + ;
}
else
p + + ;
2007-09-04 14:15:04 +04:00
return talloc_strdup ( talloc_tos ( ) , p ) ;
2005-09-30 21:13:37 +04:00
}
2005-10-15 01:43:13 +04:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-10-18 07:21:59 +04:00
int regval_convert_multi_sz ( uint16 * multi_string , size_t byte_len , char * * * values )
2005-10-15 01:43:13 +04:00
{
char * * sz ;
int i ;
int num_strings = 0 ;
fstring buffer ;
uint16 * wp ;
2005-10-18 07:21:59 +04:00
size_t multi_len = byte_len / 2 ;
2005-10-15 01:43:13 +04:00
2005-10-17 19:53:12 +04:00
if ( ! multi_string | | ! values )
2005-10-15 01:46:32 +04:00
return 0 ;
2005-10-18 07:21:59 +04:00
* values = NULL ;
2005-10-15 01:43:13 +04:00
/* just count the NULLs */
2005-10-18 07:21:59 +04:00
for ( i = 0 ; ( i < multi_len - 1 ) & & ! ( multi_string [ i ] = = 0x0 & & multi_string [ i + 1 ] = = 0x0 ) ; i + + ) {
/* peek ahead */
if ( multi_string [ i + 1 ] = = 0x0 )
2005-10-15 01:43:13 +04:00
num_strings + + ;
}
2005-10-18 07:21:59 +04:00
2005-10-15 01:43:13 +04:00
if ( num_strings = = 0 )
return 0 ;
if ( ! ( sz = TALLOC_ARRAY ( NULL , char * , num_strings + 1 ) ) ) {
DEBUG ( 0 , ( " reg_convert_multi_sz: talloc() failed! \n " ) ) ;
return - 1 ;
}
wp = multi_string ;
for ( i = 0 ; i < num_strings ; i + + ) {
rpcstr_pull ( buffer , wp , sizeof ( buffer ) , - 1 , STR_TERMINATE ) ;
sz [ i ] = talloc_strdup ( sz , buffer ) ;
/* skip to the next string NULL and then one more */
while ( * wp )
wp + + ;
wp + + ;
}
/* tag the array off with an empty string */
sz [ i ] = ' \0 ' ;
* values = sz ;
return num_strings ;
}
/**********************************************************************
Returns number of bytes , not number of unicode characters
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
size_t regval_build_multi_sz ( char * * values , uint16 * * buffer )
{
int i ;
size_t buf_size = 0 ;
uint16 * buf , * b ;
UNISTR2 sz ;
2005-10-15 01:46:32 +04:00
2005-10-17 19:53:12 +04:00
if ( ! values | | ! buffer )
2005-10-15 01:46:32 +04:00
return 0 ;
2005-10-15 01:43:13 +04:00
/* go ahead and alloc some space */
if ( ! ( buf = TALLOC_ARRAY ( NULL , uint16 , 2 ) ) ) {
DEBUG ( 0 , ( " regval_build_multi_sz: talloc() failed! \n " ) ) ;
return 0 ;
}
for ( i = 0 ; values [ i ] ; i + + ) {
ZERO_STRUCT ( sz ) ;
2005-10-17 19:53:12 +04:00
/* DEBUG(0,("regval_build_multi_sz: building [%s]\n",values[i])); */
2005-10-15 01:43:13 +04:00
init_unistr2 ( & sz , values [ i ] , UNI_STR_TERMINATE ) ;
/* Alloc some more memory. Always add one one to account for the
double NULL termination */
b = TALLOC_REALLOC_ARRAY ( NULL , buf , uint16 , buf_size + sz . uni_str_len + 1 ) ;
if ( ! b ) {
DEBUG ( 0 , ( " regval_build_multi_sz: talloc() reallocation error! \n " ) ) ;
TALLOC_FREE ( buffer ) ;
return 0 ;
}
buf = b ;
/* copy the unistring2 buffer and increment the size */
2005-10-17 19:53:12 +04:00
/* dump_data(1,sz.buffer,sz.uni_str_len*2); */
memcpy ( buf + buf_size , sz . buffer , sz . uni_str_len * 2 ) ;
2005-10-15 01:43:13 +04:00
buf_size + = sz . uni_str_len ;
/* cleanup rather than leaving memory hanging around */
TALLOC_FREE ( sz . buffer ) ;
}
buf [ buf_size + + ] = 0x0 ;
* buffer = buf ;
/* return number of bytes */
return buf_size * 2 ;
}