1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00
samba-mirror/source/registry/reg_eventlog.c

308 lines
9.4 KiB
C

/*
* Unix SMB/CIFS implementation.
* Virtual Windows Registry Layer
* Copyright (C) Marcin Krzysztof Porwit 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
* 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 02139, USA.
*/
#include "includes.h"
/**********************************************************************
handle enumeration of values AT KEY_EVENTLOG
*********************************************************************/
static int eventlog_topkey_values( char *key, REGVAL_CTR *val )
{
int num_values = 0;
char *keystr, *key2 = NULL;
char *base, *new_path;
fstring evtlogname;
UNISTR2 data;
int iDisplayNameId;
int iMaxSize;
/*
* TODO - callout to get these values...
*/
if ( key )
{
key2 = SMB_STRDUP( key );
keystr = key2;
reg_split_path( keystr, &base, &new_path );
iDisplayNameId = 0x00000100;
iMaxSize= 0x00080000;
fstrcpy( evtlogname, base );
DEBUG(10,("eventlog_topkey_values: subkey root=> [%s] subkey path=>[%s]\n", base,new_path));
if ( !new_path )
{
iDisplayNameId = 0x01;
regval_ctr_addvalue( val, "ErrorControl", REG_DWORD, (char*)&iDisplayNameId, sizeof(int) );
init_unistr2( &data, "EventLog", UNI_STR_TERMINATE);
regval_ctr_addvalue( val, "DisplayName", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
num_values = regval_ctr_numvals( val );
num_values = 0;
}
}
SAFE_FREE( key2 );
return num_values;
}
/**********************************************************************
handle enumeration of values below KEY_EVENTLOG\<Eventlog>
*********************************************************************/
static int eventlog_subkey_values( char *key, REGVAL_CTR *val )
{
int num_values = 0;
char *keystr, *key2 = NULL;
char *base, *new_path;
fstring evtlogname;
UNISTR2 data;
int iDisplayNameId;
int iMaxSize;
int iRetention;
/*
* TODO - callout to get these values...
*/
if ( !key )
return num_values;
key2 = SMB_STRDUP( key );
keystr = key2;
reg_split_path( keystr, &base, &new_path );
iDisplayNameId = 0x00000100;
/* MaxSize is limited to 0xFFFF0000 (UINT_MAX - USHRT_MAX) as per MSDN documentation */
iMaxSize= 0xFFFF0000;
/* records in the samba log are not overwritten */
iRetention = 0xFFFFFFFF;
fstrcpy( evtlogname, base );
DEBUG(10,("eventlog_subpath_values_printer: eventlogname [%s]\n", base));
DEBUG(10,("eventlog_subpath_values_printer: new_path [%s]\n", new_path));
if ( !new_path )
{
#if 0
regval_ctr_addvalue( val, "DisplayNameId", REG_DWORD, (char*)&iDisplayNameId, sizeof(int) );
init_unistr2( &data, "%SystemRoot%\\system32\\els.dll", UNI_STR_TERMINATE);
regval_ctr_addvalue( val, "DisplayNameFile", REG_EXPAND_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
#endif
regval_ctr_addvalue( val, "MaxSize", REG_DWORD, (char*)&iMaxSize, sizeof(int));
regval_ctr_addvalue( val, "Retention", REG_DWORD, (char *)&iRetention, sizeof(int));
#if 0
init_unistr2( &data, lp_logfile(), UNI_STR_TERMINATE);
regval_ctr_addvalue( val, "File", REG_EXPAND_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
#endif
init_unistr2( &data, base, UNI_STR_TERMINATE);
regval_ctr_addvalue( val, "PrimaryModule", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
init_unistr2( &data, base, UNI_STR_TERMINATE);
regval_ctr_addvalue( val, "Sources", REG_MULTI_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
num_values = regval_ctr_numvals( val );
}
else
{
iDisplayNameId = 0x07;
regval_ctr_addvalue( val, "CategoryCount", REG_DWORD, (char*)&iDisplayNameId, sizeof(int) );
init_unistr2( &data, "%SystemRoot%\\system32\\eventlog.dll", UNI_STR_TERMINATE);
regval_ctr_addvalue( val, "CategoryMessageFile", REG_EXPAND_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) );
num_values = regval_ctr_numvals( val );
num_values = 0;
}
SAFE_FREE( key2 );
return num_values;
}
/**********************************************************************
It is safe to assume that every registry path passed into on of
the exported functions here begins with KEY_EVENTLOG else
these functions would have never been called. This is a small utility
function to strip the beginning of the path and make a copy that the
caller can modify. Note that the caller is responsible for releasing
the memory allocated here.
**********************************************************************/
static char* trim_eventlog_reg_path( char *path )
{
char *p;
uint16 key_len = strlen(KEY_EVENTLOG);
/*
* sanity check...this really should never be True.
* It is only here to prevent us from accessing outside
* the path buffer in the extreme case.
*/
if ( strlen(path) < key_len ) {
DEBUG(0,("trim_reg_path: Registry path too short! [%s]\n", path));
DEBUG(0,("trim_reg_path: KEY_EVENTLOG => [%s]!\n", KEY_EVENTLOG));
return NULL;
}
p = path + strlen( KEY_EVENTLOG );
if ( *p == '\\' )
p++;
if ( *p )
return SMB_STRDUP(p);
else
return NULL;
}
/**********************************************************************
Enumerate registry subkey names given a registry path.
Caller is responsible for freeing memory to **subkeys
*********************************************************************/
static int eventlog_subkey_info( char *key, REGSUBKEY_CTR *subkey_ctr )
{
char *path;
BOOL top_level = False;
int num_subkeys = 0;
const char **evtlog_list;
path = trim_eventlog_reg_path( key );
DEBUG(10,("eventlog_subkey_info: entire key=>[%s] SUBkey=>[%s]\n", key,path));
/* check to see if we are dealing with the top level key */
num_subkeys = 0;
if ( !path )
top_level = True;
num_subkeys = 0;
if ( !(evtlog_list = lp_eventlog_list()) ) {
SAFE_FREE(path);
return num_subkeys;
}
if ( top_level )
{
/* todo - get the eventlog subkey values from the smb.conf file
for ( num_subkeys=0; num_subkeys<MAX_TOP_LEVEL_KEYS; num_subkeys++ )
regsubkey_ctr_addkey( subkey_ctr, top_level_keys[num_subkeys] ); */
DEBUG(10,("eventlog_subkey_info: Adding eventlog subkeys from globals\n"));
/* TODO - make this from the globals.szEventLogs list */
while (*evtlog_list)
{
DEBUG(10,("eventlog_subkey_info: Adding subkey =>[%s]\n",*evtlog_list));
regsubkey_ctr_addkey( subkey_ctr, *evtlog_list);
evtlog_list++;
num_subkeys++;
}
}
else
{
while (*evtlog_list && (0==num_subkeys) )
{
if (0 == StrCaseCmp(path,*evtlog_list))
{
DEBUG(10,("eventlog_subkey_info: Adding subkey [%s] for key =>[%s]\n",path,*evtlog_list));
regsubkey_ctr_addkey( subkey_ctr, *evtlog_list);
num_subkeys = 1;
}
evtlog_list++;
}
if (0==num_subkeys)
DEBUG(10,("eventlog_subkey_info: No match on SUBkey=>[%s]\n", path));
}
SAFE_FREE( path );
return num_subkeys;
}
/**********************************************************************
Enumerate registry values given a registry path.
Caller is responsible for freeing memory
*********************************************************************/
static int eventlog_value_info( char *key, REGVAL_CTR *val )
{
char *path;
BOOL top_level = False;
int num_values = 0;
DEBUG(10,("eventlog_value_info: key=>[%s]\n", key));
path = trim_eventlog_reg_path( key );
/* check to see if we are dealing with the top level key */
if ( !path )
top_level = True;
if ( top_level )
num_values = eventlog_topkey_values(path,val);
else
{
DEBUG(10,("eventlog_value_info: SUBkey=>[%s]\n", path));
num_values = eventlog_subkey_values(path,val);
}
return num_values;
}
/**********************************************************************
Stub function which always returns failure since we don't want
people storing eventlog information directly via registry calls
(for now at least)
*********************************************************************/
static BOOL eventlog_store_subkey( char *key, REGSUBKEY_CTR *subkeys )
{
return False;
}
/**********************************************************************
Stub function which always returns failure since we don't want
people storing eventlog information directly via registry calls
(for now at least)
*********************************************************************/
static BOOL eventlog_store_value( char *key, REGVAL_CTR *val )
{
return False;
}
/*
* Table of function pointers for accessing eventlog data
*/
REGISTRY_OPS eventlog_ops = {
eventlog_subkey_info,
eventlog_value_info,
eventlog_store_subkey,
eventlog_store_value,
NULL
};