r11123: * patches from Brian Moran for creating new eventlog
authorGerald Carter <jerry@samba.org>
Mon, 17 Oct 2005 15:53:12 +0000 (15:53 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:05:00 +0000 (11:05 -0500)
  source keys
* my patches to get registry utility functions linking
  with eventlogadm tool
(This used to be commit 24e7663086f5d15c7e3fd8069667169b91d1acda)

source3/.indent.pro [new file with mode: 0644]
source3/Makefile.in
source3/registry/reg_eventlog.c
source3/registry/reg_util.c
source3/utils/eventlogadm.c

diff --git a/source3/.indent.pro b/source3/.indent.pro
new file mode 100644 (file)
index 0000000..3b1981e
--- /dev/null
@@ -0,0 +1,15 @@
+-bad
+-bap
+-bbb
+-br
+-ce
+-ut
+-ts8
+-i8
+-di1
+-brs
+-npsl
+-npcs
+-prs
+-bbo
+-hnl
index c10f7c3856559bd1b04d7ffc9ca6b2cc507612f0..2ecc0a9deebb05116457887bc6e52b27b89a88be 100644 (file)
@@ -614,8 +614,12 @@ SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
                $(LIBMSRPC_OBJ) $(SECRETS_OBJ) $(POPT_LIB_OBJ) \
                $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ)
 
-WR_EVENTLOG_OBJ        = utils/eventlogadm.o rpc_server/srv_eventlog_lib.o \
-               $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) 
+EVTLOGADM_OBJ0 = utils/eventlogadm.o 
+
+EVTLOGADM_OBJ  = $(EVTLOGADM_OBJ0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(REGOBJS_OBJ) \
+               $(ERRORMAP_OBJ) $(RPC_PARSE_OBJ0) $(LIBSAMBA_OBJ) $(DOSERR_OBJ) \
+               registry/reg_eventlog.o rpc_server/srv_eventlog_lib.o registry/reg_util.o \
+               registry/reg_db.o 
 
 TALLOCTORT_OBJ = lib/talloctort.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) libsmb/nterr.o
 
@@ -977,9 +981,9 @@ bin/smbcquotas@EXEEXT@: $(SMBCQUOTAS_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
        @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(SMBCQUOTAS_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAP_LIBS)
 
-bin/eventlogadm@EXEEXT@: $(WR_EVENTLOG_OBJ) @BUILD_POPT@ bin/.dummy
+bin/eventlogadm@EXEEXT@: $(EVTLOGADM_OBJ) @BUILD_POPT@ bin/.dummy
        @echo Linking $@
-       @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(WR_EVENTLOG_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS) @POPTLIBS@ 
+       @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(EVTLOGADM_OBJ) $(DYNEXP) $(LDFLAGS) $(LIBS) @POPTLIBS@ 
 
 bin/locktest@EXEEXT@: $(LOCKTEST_OBJ) bin/.dummy
        @echo Linking $@
index 204c4c6e1c21ef3a8da5722fc79c84b282fd51a9..bf843e55181e5e5b2d1a0216cfa44800db47decd 100644 (file)
@@ -1,3 +1,4 @@
+
 /* 
  *  Unix SMB/CIFS implementation.
  *  Virtual Windows Registry Layer
@@ -84,6 +85,7 @@ BOOL eventlog_init_keys( void )
                regdb_fetch_values( evtlogpath, values );
 
                if ( !regval_ctr_key_exists( values, "MaxSize" ) ) {
+
                        /* assume we have none, add them all */
 
                        /* hard code some initial values */
@@ -149,5 +151,195 @@ BOOL eventlog_init_keys( void )
                TALLOC_FREE( values );
                elogs++;
        }
+
+       return True;
+}
+
+/*********************************************************************
+ for an eventlog, add in a source name. If the eventlog doesn't 
+ exist (not in the list) do nothing.   If a source for the log 
+ already exists, change the information (remove, replace)
+*********************************************************************/
+
+BOOL eventlog_add_source( const char *eventlog, const char *sourcename,
+                         const char *messagefile )
+{
+       /* Find all of the eventlogs, add keys for each of them */
+       /* need to add to the value KEY_EVENTLOG/<eventlog>/Sources string (Creating if necessary)
+          need to add KEY of source to KEY_EVENTLOG/<eventlog>/<source> */
+
+       const char **elogs = lp_eventlog_list(  );
+       char **wrklist, **wp;
+       pstring evtlogpath;
+       REGSUBKEY_CTR *subkeys;
+       REGVAL_CTR *values;
+       REGISTRY_VALUE *rval;
+       UNISTR2 data;
+       uint16 *msz_wp;
+       int mbytes, ii;
+       BOOL already_in;
+       int i;
+       int numsources;
+
+       for ( i=0; elogs[i]; i++ ) {
+               if ( strequal( elogs[i], eventlog ) )
+                       break;
+       }
+
+       if ( !elogs[i] ) {
+               DEBUG( 0,
+                      ( "Eventlog [%s] not found in list of valid event logs\n",
+                        eventlog ) );
+               return False;   /* invalid named passed in */
+       }
+
+       /* have to assume that the evenlog key itself exists at this point */
+       /* add in a key of [sourcename] under the eventlog key */
+
+       /* todo add to Sources */
+
+       if ( !( values = TALLOC_ZERO_P( NULL, REGVAL_CTR ) ) ) {
+               DEBUG( 0, ( "talloc() failure!\n" ) );
+               return False;
+       }
+
+       pstr_sprintf( evtlogpath, "%s\\%s", KEY_EVENTLOG, eventlog );
+
+       regdb_fetch_values( evtlogpath, values );
+
+       if ( !( rval = regval_ctr_getvalue( values, "Sources" ) ) ) {
+               DEBUG( 0, ( "No Sources value for [%s]!\n", eventlog ) );
+               return False;
+       }
+
+       /* perhaps this adding a new string to a multi_sz should be a fn? */
+       /* check to see if it's there already */
+
+       if ( rval->type != REG_MULTI_SZ ) {
+               DEBUG( 0,
+                      ( "Wrong type for Sources, should be REG_MULTI_SZ\n" ) );
+               return False;
+       }
+
+       /* convert to a 'regulah' chars to do some comparisons */
+
+       DEBUG( 0, ( "Rval size is %d\n", rval->size ) );
+
+       already_in = False;
+       wrklist = NULL;
+       dump_data( 1, rval->data_p, rval->size );
+       if ( ( numsources =
+              regval_convert_multi_sz( ( uint16 * ) rval->data_p, rval->size,
+                                       &wrklist ) ) > 0 ) {
+
+               DEBUG( 10, ( "numsources is %d\n", numsources ) );
+               ii = numsources;
+               /* see if it's in there already */
+               wp = wrklist;
+               while ( ii && wp && *wp ) {
+                       DEBUG( 5,
+                              ( "Comparing [%s] to [%s]\n", sourcename,
+                                *wp ) );
+                       if ( strequal( *wp, sourcename ) ) {
+                               DEBUG( 5,
+                                      ( "Source name %s already exists, \n",
+                                        sourcename ) );
+                               already_in = True;
+                               break;
+                       }
+                       wp++;
+                       ii--;
+               }
+       } else {
+               if ( numsources < 0 ) {
+                       DEBUG( 3, ( "problem in getting the sources\n" ) );
+                       return False;
+               }
+               DEBUG( 3,
+                      ( "Nothing in the sources list, this might be a problem\n" ) );
+       }
+
+       wp = wrklist;
+
+       if ( !already_in ) {
+               /* make a new list with an additional entry; copy values, add another */
+               wp = TALLOC_ARRAY( NULL, char *, numsources + 2 );
+
+               if ( !wp ) {
+                       DEBUG( 0, ( "talloc() failed \n" ) );
+                       return False;
+               }
+               DEBUG( 0, ( "Number of sources [%d]\n", numsources ) );
+               memcpy( wp, wrklist, sizeof( char * ) * numsources );
+               *( wp + numsources ) = ( char * ) sourcename;
+               *( wp + numsources + 1 ) = NULL;
+               mbytes = regval_build_multi_sz( wp, &msz_wp );
+               DEBUG( 0, ( "Number of mbytes [%d]\n", mbytes ) );
+               dump_data( 1, (char*)msz_wp, mbytes );
+               regval_ctr_addvalue( values, "Sources", REG_MULTI_SZ,
+                                    ( char * ) msz_wp, mbytes );
+               regdb_store_values( evtlogpath, values );
+               TALLOC_FREE( msz_wp );
+       } else {
+               DEBUG( 0,
+                      ( "Source name [%s] found in existing list of sources\n",
+                        sourcename ) );
+       }
+       TALLOC_FREE( values );
+
+       DEBUG( 5,
+              ( "Added source to sources string, now adding subkeys\n" ) );
+
+       if ( !( subkeys = TALLOC_ZERO_P( NULL, REGSUBKEY_CTR ) ) ) {
+               DEBUG( 0, ( "talloc() failure!\n" ) );
+               return False;
+       }
+       pstr_sprintf( evtlogpath, "%s\\%s", KEY_EVENTLOG, eventlog );
+
+       regdb_fetch_keys( evtlogpath, subkeys );
+
+       if ( !regsubkey_ctr_key_exists( subkeys, sourcename ) ) {
+               DEBUG( 5,
+                      ( " Source name [%s] for eventlog [%s] didn't exist, adding \n",
+                        sourcename, eventlog ) );
+               regsubkey_ctr_addkey( subkeys, sourcename );
+               if ( !regdb_store_keys( evtlogpath, subkeys ) )
+                       return False;
+       }
+       TALLOC_FREE( subkeys );
+
+       /* at this point KEY_EVENTLOG/<eventlog>/<sourcename> key is in there. Now need to add EventLogMessageFile */
+
+       /* now allocate room for the source's subkeys */
+
+       if ( !( subkeys = TALLOC_ZERO_P( NULL, REGSUBKEY_CTR ) ) ) {
+               DEBUG( 0, ( "talloc() failure!\n" ) );
+               return False;
+       }
+       slprintf( evtlogpath, sizeof( evtlogpath ) - 1, "%s\\%s\\%s",
+                 KEY_EVENTLOG, eventlog, sourcename );
+
+       regdb_fetch_keys( evtlogpath, subkeys );
+
+       /* now add the values to the KEY_EVENTLOG/Application form key */
+       if ( !( values = TALLOC_ZERO_P( NULL, REGVAL_CTR ) ) ) {
+               DEBUG( 0, ( "talloc() failure!\n" ) );
+               return False;
+       }
+       DEBUG( 5,
+              ( "Storing EventLogMessageFile [%s] to eventlog path of [%s]\n",
+                messagefile, evtlogpath ) );
+
+       regdb_fetch_values( evtlogpath, values );
+
+       init_unistr2( &data, messagefile, UNI_STR_TERMINATE );
+
+       regval_ctr_addvalue( values, "EventLogMessageFile", REG_EXPAND_SZ,
+                            ( char * ) data.buffer,
+                            data.uni_str_len * sizeof( uint16 ) );
+       regdb_store_values( evtlogpath, values );
+
+       TALLOC_FREE( values );
+
        return True;
 }
index 511e9b43354537ce5ee02d05cd8d894b5d8ab1d2..9fd9dba27d74d320cdda00989e352099544de294 100644 (file)
@@ -138,12 +138,12 @@ int regval_convert_multi_sz( uint16 *multi_string, size_t multi_len, char ***val
        
        *values = NULL;
 
-       if ( !multi_string || !*values )
+       if ( !multi_string || !values )
                return 0;
 
        /* just count the NULLs */
        
-       for ( i=0; (i<multi_len-1) && !(multi_string[i]==0x0 && multi_string[i+1]==0x0); i++ ) {
+       for ( i=0; (i<multi_len-1) && !(multi_string[i]==0x0 && multi_string[i+1]==0x0); i+=2 ) {
                if ( multi_string[i] == 0x0 )
                        num_strings++;
        }
@@ -187,7 +187,7 @@ size_t regval_build_multi_sz( char **values, uint16 **buffer )
        uint16 *buf, *b;
        UNISTR2 sz;
 
-       if ( !values || !*buffer )
+       if ( !values || !buffer )
                return 0;
        
        /* go ahead and alloc some space */
@@ -199,7 +199,7 @@ size_t regval_build_multi_sz( char **values, uint16 **buffer )
        
        for ( i=0; values[i]; i++ ) {
                ZERO_STRUCT( sz );
-               
+               /* DEBUG(0,("regval_build_multi_sz: building [%s]\n",values[i])); */
                init_unistr2( &sz, values[i], UNI_STR_TERMINATE );
                
                /* Alloc some more memory.  Always add one one to account for the 
@@ -214,8 +214,8 @@ size_t regval_build_multi_sz( char **values, uint16 **buffer )
                buf = b;
 
                /* copy the unistring2 buffer and increment the size */ 
-               
-               memcpy( buf+buf_size, sz.buffer, sz.uni_str_len );
+               /* dump_data(1,sz.buffer,sz.uni_str_len*2); */
+               memcpy( buf+buf_size, sz.buffer, sz.uni_str_len*2 );
                buf_size += sz.uni_str_len;
                
                /* cleanup rather than leaving memory hanging around */
@@ -231,7 +231,3 @@ size_t regval_build_multi_sz( char **values, uint16 **buffer )
 }
 
 
-
-
-
-
index bb3c1bc9bbc79737edac7c12cb89cb5822e95969..172f2b9cd240c348f4c62ed538cf789fe75aa0a0 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Samba Unix/Linux SMB client utility 
- * Write Eventlog records to a tdb
+ * Write Eventlog records to a tdb, perform other eventlog related functions
+ *
  *
  * Copyright (C) Brian Moran                2005.
  *
@@ -74,6 +75,10 @@ int main( int argc, char *argv[] )
 
        exename = argv[0];
 
+#if 1  /* TESTING CODE */
+       eventlog_add_source("System","TestSourceX","SomeTestPathX");
+#endif
+
        while ( ( opt = getopt( argc, argv, "dh" ) ) != -1 ) {
                switch ( opt ) {
                case 'h':