2008-04-04 15:21:03 +04:00
/*
* Samba Unix / Linux SMB client library
* Distributed SMB / CIFS Server Management Utility
* registry utility functions
*
* 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"
# include "utils/net_registry_util.h"
2009-08-02 12:26:48 +04:00
# include "utils/net.h"
2008-04-04 15:21:03 +04:00
void print_registry_key ( const char * keyname , NTTIME * modtime )
{
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Keyname = %s \n " ) , keyname ) ;
d_printf ( _ ( " Modtime = %s \n " ) ,
2008-04-04 15:21:03 +04:00
modtime
2008-10-12 01:57:44 +04:00
? http_timestring ( talloc_tos ( ) , nt_time_to_unix ( * modtime ) )
2009-08-02 12:26:48 +04:00
: _ ( " None " ) ) ;
2008-04-04 15:21:03 +04:00
d_printf ( " \n " ) ;
}
2008-05-15 14:55:54 +04:00
void print_registry_value ( const struct registry_value * valvalue , bool raw )
2008-04-04 15:21:03 +04:00
{
2008-05-15 14:55:54 +04:00
if ( ! raw ) {
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Type = %s \n " ) ,
2008-05-15 14:55:54 +04:00
reg_type_lookup ( valvalue - > type ) ) ;
}
2008-04-04 15:21:03 +04:00
switch ( valvalue - > type ) {
case REG_DWORD :
2008-05-15 14:55:54 +04:00
if ( ! raw ) {
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Value = " ) ) ;
2008-05-15 14:55:54 +04:00
}
d_printf ( " %d \n " , valvalue - > v . dword ) ;
2008-04-04 15:21:03 +04:00
break ;
case REG_SZ :
case REG_EXPAND_SZ :
2008-05-15 14:55:54 +04:00
if ( ! raw ) {
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Value = \" " ) ) ;
2008-05-15 14:55:54 +04:00
}
d_printf ( " %s " , valvalue - > v . sz . str ) ;
if ( ! raw ) {
d_printf ( " \" " ) ;
}
d_printf ( " \n " ) ;
2008-04-04 15:21:03 +04:00
break ;
case REG_MULTI_SZ : {
uint32 j ;
for ( j = 0 ; j < valvalue - > v . multi_sz . num_strings ; j + + ) {
2008-05-15 14:55:54 +04:00
if ( ! raw ) {
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Value[%3.3d] = \" " ) , j ) ;
2008-05-15 14:55:54 +04:00
}
d_printf ( " %s " , valvalue - > v . multi_sz . strings [ j ] ) ;
if ( ! raw ) {
d_printf ( " \" " ) ;
}
d_printf ( " \n " ) ;
2008-04-04 15:21:03 +04:00
}
break ;
}
case REG_BINARY :
2008-05-15 14:55:54 +04:00
if ( ! raw ) {
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Value = " ) ) ;
2008-05-15 14:55:54 +04:00
}
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " %d bytes \n " ) , ( int ) valvalue - > v . binary . length ) ;
2008-04-04 15:21:03 +04:00
break ;
default :
2008-05-15 14:55:54 +04:00
if ( ! raw ) {
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Value = " ) ) ;
2008-05-15 14:55:54 +04:00
}
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " <unprintable> \n " ) ) ;
2008-04-04 15:21:03 +04:00
break ;
}
2008-04-09 14:29:34 +04:00
}
void print_registry_value_with_name ( const char * valname ,
const struct registry_value * valvalue )
{
2009-08-02 12:26:48 +04:00
d_printf ( _ ( " Valuename = %s \n " ) , valname ) ;
2008-05-15 14:55:54 +04:00
print_registry_value ( valvalue , false ) ;
2008-04-04 15:21:03 +04:00
d_printf ( " \n " ) ;
}
/**
* Split path into hive name and subkeyname
* normalizations performed :
* - convert ' / ' to ' \\ '
* - strip trailing ' \\ ' chars
*/
WERROR split_hive_key ( TALLOC_CTX * ctx , const char * path , char * * hivename ,
2008-04-04 19:24:53 +04:00
char * * subkeyname )
2008-04-04 15:21:03 +04:00
{
char * p ;
2008-04-04 19:24:53 +04:00
const char * tmp_subkeyname ;
2008-04-04 15:21:03 +04:00
if ( ( path = = NULL ) | | ( hivename = = NULL ) | | ( subkeyname = = NULL ) ) {
return WERR_INVALID_PARAM ;
}
if ( strlen ( path ) = = 0 ) {
return WERR_INVALID_PARAM ;
}
* hivename = talloc_string_sub ( ctx , path , " / " , " \\ " ) ;
if ( * hivename = = NULL ) {
return WERR_NOMEM ;
}
/* strip trailing '\\' chars */
p = strrchr ( * hivename , ' \\ ' ) ;
while ( ( p ! = NULL ) & & ( p [ 1 ] = = ' \0 ' ) ) {
* p = ' \0 ' ;
p = strrchr ( * hivename , ' \\ ' ) ;
}
p = strchr ( * hivename , ' \\ ' ) ;
if ( ( p = = NULL ) | | ( * p = = ' \0 ' ) ) {
/* just the hive - no subkey given */
2008-04-04 19:24:53 +04:00
tmp_subkeyname = " " ;
2008-04-04 15:21:03 +04:00
} else {
* p = ' \0 ' ;
2008-04-04 19:24:53 +04:00
tmp_subkeyname = p + 1 ;
}
* subkeyname = talloc_strdup ( ctx , tmp_subkeyname ) ;
if ( * subkeyname = = NULL ) {
return WERR_NOMEM ;
2008-04-04 15:21:03 +04:00
}
return WERR_OK ;
}