From 54abd2aa66069e6baf7769c496f46d9dba18db39 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 30 Sep 2005 17:13:37 +0000 Subject: r10656: BIG merge from trunk. Features not copied over * \PIPE\unixinfo * winbindd's {group,alias}membership new functions * winbindd's lookupsids() functionality * swat (trunk changes to be reverted as per discussion with Deryck) (This used to be commit 939c3cb5d78e3a2236209b296aa8aba8bdce32d3) --- source3/registry/reg_eventlog.c | 375 ++++++++++++++-------------------------- 1 file changed, 128 insertions(+), 247 deletions(-) (limited to 'source3/registry/reg_eventlog.c') diff --git a/source3/registry/reg_eventlog.c b/source3/registry/reg_eventlog.c index b20eb046db..bed9e1d59a 100644 --- a/source3/registry/reg_eventlog.c +++ b/source3/registry/reg_eventlog.c @@ -1,7 +1,8 @@ /* * Unix SMB/CIFS implementation. * Virtual Windows Registry Layer - * Copyright (C) Marcin Krzysztof Porwit 2005. + * Copyright (C) Marcin Krzysztof Porwit 2005, + * Copyright (C) Gerald (Jerry) Carter 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 @@ -20,288 +21,168 @@ #include "includes.h" + /********************************************************************** - handle enumeration of values AT KEY_EVENTLOG - *********************************************************************/ - -static int eventlog_topkey_values( char *key, REGVAL_CTR *val ) + Enumerate registry subkey names given a registry path. +*********************************************************************/ + +static int elog_fetch_keys( const char *key, REGSUBKEY_CTR *subkeys ) { - 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... - */ + const char **elogs = lp_eventlog_list(); + char *path; + int i; - if ( key ) - { - key2 = SMB_STRDUP( key ); - keystr = key2; - reg_split_path( keystr, &base, &new_path ); + path = reg_remaining_path( key + strlen(KEY_EVENTLOG) ); - 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; - } - } + DEBUG(10,("elog_fetch_keys: entire key => [%s], subkey => [%s]\n", + key, path)); - SAFE_FREE( key2 ); - return num_values; -} + if ( !path ) { + + if ( !elogs || !*elogs ) + return 0; -/********************************************************************** - handle enumeration of values below KEY_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 ); + DEBUG(10,("elog_fetch_keys: Adding eventlog subkeys from smb.conf\n")); + + for ( i=0; elogs[i]; i++ ) + regsubkey_ctr_addkey( subkeys, elogs[i] ); + + return regsubkey_ctr_numkeys( subkeys ); + } - num_values = 0; - } - - SAFE_FREE( key2 ); - return num_values; -} + /* if we get / then we don't add anymore */ + if ( strchr( path, '\\' ) ) { + DEBUG(10,("elog_fetch_keys: Not adding subkey to %s\n",path)); + return 0; + } -/********************************************************************** - 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. - **********************************************************************/ + /* add in a subkey with the same name as the eventlog... */ -static char* trim_eventlog_reg_path( const char *path ) -{ - const 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( const 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; - } + DEBUG(10,("elog_fetch_keys: Looking to add eventlog subkey to %s\n",path)); - - if ( top_level ) - { - /* todo - get the eventlog subkey values from the smb.conf file - for ( num_subkeys=0; num_subkeys[%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++; + /* look for a match */ + + if ( !elogs ) + return -1; + + for ( i=0; elogs[i]; i++ ) { + /* just verify that the keyname is a valid log name */ + if ( strequal( path, elogs[i] ) ) + return 0; } - if (0==num_subkeys) - DEBUG(10,("eventlog_subkey_info: No match on SUBkey=>[%s]\n", path)); - } - - SAFE_FREE( path ); - return num_subkeys; + return -1; } /********************************************************************** Enumerate registry values given a registry path. Caller is responsible for freeing memory - *********************************************************************/ +*********************************************************************/ -static int eventlog_value_info( const char *key, REGVAL_CTR *val ) +static int elog_fetch_values( const char *key, REGVAL_CTR *values ) { - char *path; - BOOL top_level = False; - int num_values = 0; + char *path; + uint32 uiDisplayNameId, uiMaxSize, uiRetention; + char *base, *new_path; + UNISTR2 data; - DEBUG(10,("eventlog_value_info: key=>[%s]\n", key)); + DEBUG(10,("elog_fetch_values: key=>[%s]\n", key)); - path = trim_eventlog_reg_path( key ); + path = reg_remaining_path( key + strlen(KEY_EVENTLOG) ); /* 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; + if ( !path ) + return regdb_fetch_values( KEY_EVENTLOG, values ); + + /* deal with a log name */ + + reg_split_path( path, &base, &new_path ); + + /* MaxSize is limited to 0xFFFF0000 (UINT_MAX - USHRT_MAX) as per MSDN documentation */ + + + if ( !new_path ) { + + /* try to fetch from the registry */ + + regdb_fetch_values( key, values ); + + /* just verify one of the important keys. If this + fails, then assume the values have not been initialized */ + + if ( regval_ctr_getvalue( values, "Retention" ) ) + return regval_ctr_numvals( values ); + + /* hard code some initial values */ + + uiDisplayNameId = 0x00000100; + uiMaxSize = 0x00080000; + uiRetention = 0x93A80; + + regval_ctr_addvalue( values, "MaxSize", REG_DWORD, (char*)&uiMaxSize, sizeof(uint32)); + regval_ctr_addvalue( values, "Retention", REG_DWORD, (char *)&uiRetention, sizeof(uint32)); + + init_unistr2( &data, base, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "PrimaryModule", REG_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); + + init_unistr2( &data, base, UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "Sources", REG_MULTI_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); + + /* store them for later updates. Complain if this fails but continue on */ + + if ( !regdb_store_values( key, values ) ) { + DEBUG(0,("elog_fetch_values: Failed to store initial values for log [%s]\n", + base )); + } + + return regval_ctr_numvals( values ); + } + +#if 0 + /* hmmm....what to do here? A subkey underneath the log name ? */ + + uiDisplayNameId = 0x07; + regval_ctr_addvalue( values, "CategoryCount", REG_DWORD, (char*)&uiDisplayNameId, sizeof(uint32) ); + + init_unistr2( &data, "%SystemRoot%\\system32\\eventlog.dll", UNI_STR_TERMINATE); + regval_ctr_addvalue( values, "CategoryMessageFile", REG_EXPAND_SZ, (char*)data.buffer, data.uni_str_len*sizeof(uint16) ); +#endif + + return regval_ctr_numvals( 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( const char *key, REGSUBKEY_CTR *subkeys ) +*********************************************************************/ + +static BOOL elog_store_keys( const char *key, REGSUBKEY_CTR *subkeys ) { + /* cannot create any subkeys here */ + 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( const char *key, REGVAL_CTR *val ) + Allow storing of particular values related to eventlog operation. +*********************************************************************/ + +static BOOL elog_store_value( const char *key, REGVAL_CTR *values ) { - return False; + /* the client had to have a valid handle to get here + so just hand off to the registry tdb */ + + return regdb_store_values( key, values ); } -/* - * Table of function pointers for accessing eventlog data - */ +/******************************************************************** + Table of function pointers for accessing eventlog data + *******************************************************************/ + REGISTRY_OPS eventlog_ops = { - eventlog_subkey_info, - eventlog_value_info, - eventlog_store_subkey, - eventlog_store_value, + elog_fetch_keys, + elog_fetch_values, + elog_store_keys, + elog_store_value, NULL }; -- cgit