/* * syslogd.h - syslogd implementation for windows, common definitions * * Created by Alexander Yaworsky * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ extern int verbosity_level; extern void display_message( FILE* fd, char* file, int line, const char* func, char* fmt, ... ); #ifdef HAVE_DEBUG # define DO_TRACE( verbosity, fmt... ) \ do { \ if( verbosity <= verbosity_level ) \ display_message( stderr, __FILE__, __LINE__, __FUNCTION__, fmt ); \ } while(0) # define TRACE_2( fmt... ) DO_TRACE( 2, fmt ) # define TRACE( fmt... ) DO_TRACE( 1, fmt ) #else # define TRACE_2( fmt... ) # define TRACE( fmt... ) #endif #define TRACE_ENTER TRACE_2 #define TRACE_LEAVE TRACE_2 #define ERR( fmt... ) display_message( stderr, __FILE__, __LINE__, __FUNCTION__, fmt ) extern HANDLE service_stop_event; extern char local_hostname[]; extern char *str_month[]; extern void syslogd_main(); /* options and their default values */ extern gboolean use_dns; extern gchar *source_encoding; extern gchar *destination_encoding; extern int mark_interval; extern gchar *mark_message; extern int hold; extern gchar *logdir; /* listener */ enum listener_status { LSNR_ERROR, LSNR_SHUTDOWN, LSNR_GOT_MESSAGE }; struct raw_message { gchar *msg; struct sockaddr_in sender_addr; struct source *source; }; extern gboolean init_listener(); extern void fini_listener(); extern enum listener_status listener( struct raw_message** msg ); extern void log_internal( int pri, char* fmt, ... ); /* message */ struct message { LONG refcount; struct source *source; gchar *sender; int facility; int priority; gchar *timestamp; gchar *hostname; gchar *program; gchar *message; }; extern void reference_message( struct message* msg ); extern void release_message( struct message* msg ); /* sources, destinations, filters and logpaths */ enum source_type { ST_UNDEFINED, ST_INTERNAL, ST_UDP }; struct source { gchar *name; enum source_type type; struct sockaddr_in udp; }; enum destination_type { DT_UNDEFINED, DT_FILE }; enum rotation_period { RP_UNDEFINED = 0, RP_INVALID, RP_DAILY, RP_WEEKLY, RP_MONTHLY }; struct destination_file { gchar *name_pattern; enum rotation_period rotate; int size; int backlogs; gboolean ifempty; gchar *olddir; gchar *compresscmd; gchar *compressoptions; }; struct destination; typedef void (*dest_put)( struct destination* destination, struct message* message ); typedef void (*dest_finalize)( struct destination* destination ); struct destination { gchar *name; enum destination_type type; union { struct destination_file file; } u; void *extra; /* methods */ dest_put put; dest_finalize fini; }; struct filter { gchar *name; gboolean facilities[ LOG_NFACILITIES ]; gboolean priorities[ 8 ]; }; struct logpath { struct source *source; struct filter *filter; struct destination *destination; }; extern GList *sources; extern GList *destinations; extern GList *filters; extern GList *logpaths; extern gboolean read_configuration(); extern gboolean init_destination_file( struct destination* destination ); /* queue */ struct fifo_item { struct fifo_item *next; /* queue is a single-linked list */ void *payload; }; struct fifo { struct fifo_item *first; /* first pushed item */ struct fifo_item *last; /* last pushed item */ }; extern struct fifo* fifo_create(); extern void fifo_destroy( struct fifo* queue ); extern void fifo_push( struct fifo* queue, void* data ); extern void* fifo_pop( struct fifo* queue ); /* logrotate */ extern void rotate_logfile( const gchar* pathname, struct destination* destination ); /* purger */ struct purger_dir { gchar *directory; int keep_days; }; extern GList *purger_dirs; extern gboolean init_purger(); extern void fini_purger(); extern void purge_log_dirs(); /* pathnames */ extern gchar* make_absolute_log_pathname( char* path_appendix ); extern void create_directories( gchar* pathname ); extern gchar* normalize_pathname( const gchar* pathname ); /* workaround for syslog.h: included with SYSLOG_NAMES in names.c */ typedef struct _code { char *c_name; int c_val; } CODE; extern CODE prioritynames[]; extern CODE facilitynames[]; extern char* get_priority_name( int pri ); extern char* get_facility_name( int pri );