diff --git a/shared/report.c b/shared/report.c index e7d8222..f8c1452 100644 --- a/shared/report.c +++ b/shared/report.c @@ -3,7 +3,6 @@ */ /*- - * report.c * This file is part of LCDproc. * * This file is released under the GNU General Public License. Refer to the @@ -31,37 +30,37 @@ static char *stored_msgs[MAX_STORED_MSGS]; static int stored_levels[MAX_STORED_MSGS]; static int num_stored_msgs = 0; - /* local functions */ -static void store_report_message( int level, const char *message ); +static void store_report_message(int level, const char *message); static void flush_messages(); -void report( const int level, const char *format, .../*args*/ ) +void +report(const int level, const char *format,... /* args */ ) { /* Check if we should report it */ - if( level <= report_level || report_dest == RPT_DEST_STORE ) { + if (level <= report_level || report_dest == RPT_DEST_STORE) { + char buf[1024]; - char buf[1024]; - - /* Following functions appear to work on RedHat and Debian + /* + * Following functions appear to work on RedHat and Debian * Linux, FreeBSD and Solaris */ va_list ap; - va_start(ap, format); /* measure the required size (the number of elements of format) */ + va_start(ap, format); - switch( report_dest ) { - case RPT_DEST_STDERR: - vfprintf( stderr, format, ap ); - fprintf( stderr, "\n" ); + switch (report_dest) { + case RPT_DEST_STDERR: + vfprintf(stderr, format, ap); + fprintf(stderr, "\n"); break; - case RPT_DEST_SYSLOG: - vsyslog( LOG_USER|(level+2), format, ap ); + case RPT_DEST_SYSLOG: + vsyslog(LOG_USER | (level + 2), format, ap); break; - case RPT_DEST_STORE: - vsnprintf( buf, sizeof(buf), format, ap ); - buf[sizeof(buf)-1] = 0; /* be sure to have a terminating 0 */ - store_report_message( level, buf ); + case RPT_DEST_STORE: + vsnprintf(buf, sizeof(buf), format, ap); + buf[sizeof(buf) - 1] = 0; + store_report_message(level, buf); break; } va_end(ap); @@ -69,47 +68,62 @@ void report( const int level, const char *format, .../*args*/ ) } -int set_reporting( char *application_name, int new_level, int new_dest ) +int +set_reporting(char *application_name, int new_level, int new_dest) { - if( new_level < RPT_CRIT || new_level > RPT_DEBUG ) { - report( RPT_ERR, "report level invalid: %d", new_level ); + if (new_level < RPT_CRIT || new_level > RPT_DEBUG) { + report(RPT_ERR, "report level invalid: %d", new_level); return -1; } - if( report_dest != RPT_DEST_SYSLOG && new_dest == RPT_DEST_SYSLOG ) { - openlog( application_name, 0, LOG_USER ); + if (report_dest != RPT_DEST_SYSLOG && new_dest == RPT_DEST_SYSLOG) { + openlog(application_name, 0, LOG_USER); } - else if( report_dest == RPT_DEST_SYSLOG && new_dest != RPT_DEST_SYSLOG ) { + else if (report_dest == RPT_DEST_SYSLOG && new_dest != RPT_DEST_SYSLOG) { closelog(); } report_level = new_level; report_dest = new_dest; - if( report_dest != RPT_DEST_STORE ) + /* + * Flush all messages currently in the message store if the new + * destination is not the store itself. + */ + if (report_dest != RPT_DEST_STORE) flush_messages(); return 0; } -static void store_report_message( int level, const char *message ) +/** + * Puts a message into the message store. If the store is full new messages + * are silently discarded. + */ +static void +store_report_message(int level, const char *message) { - if( num_stored_msgs < MAX_STORED_MSGS ) { - stored_msgs[num_stored_msgs] = malloc(strlen( message )+1); - strcpy( stored_msgs[num_stored_msgs], message ); + if (num_stored_msgs < MAX_STORED_MSGS) { + stored_msgs[num_stored_msgs] = malloc(strlen(message) + 1); + strcpy(stored_msgs[num_stored_msgs], message); stored_levels[num_stored_msgs] = level; - num_stored_msgs ++; + num_stored_msgs++; } } -static void flush_messages() +/** + * Report all messages contained in the message store to the current report + * destination and release their memory. + */ +static void +flush_messages() { int i; - for( i=0; i #include - /* Reporting levels */ +/** + * \def RPT_CRIT + * Critical conditions: the program stops right after this. + * Only use this if the program is actually exited from the current + * function. + * + * \def RPT_ERR + * Error conditions: serious problem, program continues. + * Use this just before you return -1 from a function. + * + * \def RPT_WARNING + * Warning conditions: Something that the user should Fix, but the + * program can continue without a real problem. + * Ex: Protocol errors from a client. + * + * \def RPT_NOTICE + * Major event in the program. + * Ex: (un)loading of driver, client (dis)connect. + * + * \def RPT_INFO + * Minor event in the program: the activation of a Setting, details of a + * loaded driver, a key reservation, a keypress, a screen switch. + * + * \def RPT_DEBUG + * Insignificant event. + * Ex: What function has been called, what subpart of a function is being + * executed, what was received and sent over the socket, etc. + */ #define RPT_CRIT 0 #define RPT_ERR 1 #define RPT_WARNING 2 #define RPT_NOTICE 3 #define RPT_INFO 4 #define RPT_DEBUG 5 -/* Don't just modify these numbers, they're related to syslog. */ +/* Don't modify these numbers, they're related to syslog! */ /* Reporting destinations */ #define RPT_DEST_STDERR 0 #define RPT_DEST_SYSLOG 1 #define RPT_DEST_STORE 2 +/** Sets reporting level and message destination. */ int set_reporting( char *application_name, int new_level, int new_dest ); -/* Sets reporting level and message destination. */ +/** Report the message to the selected destination if important enough */ void report( const int level, const char *format, .../*args*/ ); -/* Report the message to the selected destination if important enough */ -/* Consider the debug function to be exactly the same as the report function. +/** + * The code that this function generates will not be in the executable when + * compiled without debugging. This way memory and CPU cycles are saved. + */ +static inline void dont_report( const int level, const char *format, .../*args*/ ) +{} + +/** + * Consider the debug function to be exactly the same as the report function. * The only difference is that it is only compiled in if DEBUG is defined. */ - -static inline void dont_report( const int level, const char *format, .../*args*/ ) -{} /* The idea is that this gets optimized out */ - #ifdef DEBUG # define debug report #else # define debug dont_report -#endif /*DEBUG*/ - #endif + +#endif /* REPORT_H */