diff options
Diffstat (limited to 'nanohttp/nanohttp-logging.c')
-rw-r--r-- | nanohttp/nanohttp-logging.c | 209 |
1 files changed, 87 insertions, 122 deletions
diff --git a/nanohttp/nanohttp-logging.c b/nanohttp/nanohttp-logging.c index 5e1244d..45fc01a 100644 --- a/nanohttp/nanohttp-logging.c +++ b/nanohttp/nanohttp-logging.c @@ -1,8 +1,9 @@ +/** @file nanohttp-logging.c Logging functions */ /****************************************************************** -* $Id: nanohttp-logging.c,v 1.2 2006/11/25 17:03:20 m0gg Exp $ +* $Id: nanohttp-logging.c,v 1.3 2007/11/03 22:40:11 m0gg Exp $ * * CSOAP Project: A http client/server library in C -* Copyright (C) 2003 Ferhat Ayaz +* Copyright (C) 2007 Heiko Ronsdorf * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,12 +20,15 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * -* Email: ayaz@jprogrammer.net ******************************************************************/ #ifdef HAVE_CONFIG_H #include <config.h> #endif +#ifdef HAVE_CTYPE_H +#include <ctype.h> +#endif + #ifdef HAVE_STDIO_H #include <stdio.h> #endif @@ -41,169 +45,130 @@ #include <string.h> #endif -#ifdef HAVE_CTYPE_H -#include <ctype.h> -#endif - -#ifdef HAVE_PTHREAD_H -#include <pthread.h> +#ifdef HAVE_SYSLOG_H +#include <syslog.h> #endif #include "nanohttp-logging.h" -#ifdef WIN32 -#ifndef __MINGW32__ +static int _nanohttp_logtype = NANOHTTP_LOG_FOREGROUND; +static nanohttp_loglevel_t _nanohttp_log_loglevel = NANOHTTP_LOG_DEBUG; +static char *_nanohttp_log_logfile = NULL; -/* not thread safe!*/ +#if defined WIN32 && defined __MINGW32__ char * VisualC_funcname(const char *file, int line) { static char buffer[256]; - int i = strlen(file) - 1; - while (i > 0 && file[i] != '\\') - i--; + int i; + + for (i = strlen(file) - 1; i > 0 && file[i] != '\\'; i--) + /* nothing */ ; sprintf(buffer, "%s:%d", (file[i] != '\\') ? file : (file + i + 1), line); return buffer; } - #endif -#endif - -static log_level_t loglevel = HLOG_DEBUG; -static char logfile[75] = { '\0' }; -static int log_background = 0; -log_level_t -hlog_set_level(log_level_t level) +nanohttp_loglevel_t +nanohttp_log_set_loglevel(nanohttp_loglevel_t loglevel) { - log_level_t old = loglevel; - loglevel = level; + nanohttp_loglevel_t old; + + old = _nanohttp_log_loglevel; + _nanohttp_log_loglevel = loglevel; + return old; } -log_level_t -hlog_get_level(void) +nanohttp_loglevel_t +nanohttp_log_get_loglevel(void) { - return loglevel; + return _nanohttp_log_loglevel; } -void -hlog_set_file(const char *filename) +int +nanohttp_log_set_logtype(int type) { - if (filename) - strncpy(logfile, filename, 75); - else - logfile[0] = '\0'; + int old; - return; -} - -void -hlog_set_background(int state) -{ - log_background = state; + old = _nanohttp_logtype; + _nanohttp_logtype = type; - return; -} - -char * -hlog_get_file(void) -{ - if (logfile[0] == '\0') - return NULL; - return logfile; + return old; } -static void -_log_write(log_level_t level, const char *prefix, - const char *func, const char *format, va_list ap) +const char * +nanohttp_log_get_logfile(void) { - char buffer[1054]; - char buffer2[1054]; - FILE *f; - - if (level < loglevel) - return; - - if (!log_background || hlog_get_file()) - { -#ifdef WIN32 - sprintf(buffer, "*%s*: [%s] %s\n", prefix, func, format); -#else - sprintf(buffer, "*%s*:(%ld) [%s] %s\n", - prefix, pthread_self(), func, format); -#endif - vsprintf(buffer2, buffer, ap); - if (!log_background) - { - printf(buffer2); - fflush(stdout); - } - - if (hlog_get_file()) - { - f = fopen(hlog_get_file(), "a"); - if (!f) - f = fopen(hlog_get_file(), "w"); - if (f) - { - fprintf(f, buffer2); - fflush(f); - fclose(f); - } - } - } - - return; + return _nanohttp_log_logfile; } void -hlog_verbose(const char *FUNC, const char *format, ...) +nanohttp_log_set_logfile(const char *filename) { - va_list ap; + if (_nanohttp_log_logfile) + free(_nanohttp_log_logfile); - va_start(ap, format); - _log_write(HLOG_VERBOSE, "VERBOSE", FUNC, format, ap); - va_end(ap); + if (filename) + _nanohttp_log_logfile = strdup(filename); } void -hlog_debug(const char *FUNC, const char *format, ...) +_nanohttp_log_printf(nanohttp_loglevel_t level, const char *format, ...) { + const char *filename; va_list ap; + if (level < _nanohttp_log_loglevel) + return; + va_start(ap, format); - _log_write(HLOG_DEBUG, "DEBUG", FUNC, format, ap); - va_end(ap); -} -void -hlog_info(const char *FUNC, const char *format, ...) -{ - va_list ap; + if (_nanohttp_logtype & NANOHTTP_LOG_FOREGROUND) + vfprintf(stdout, format, ap); - va_start(ap, format); - _log_write(HLOG_INFO, "INFO", FUNC, format, ap); - va_end(ap); -} +#ifdef HAVE_SYSLOG_H + if (_nanohttp_logtype & NANOHTTP_LOG_SYSLOG) + { + int syslog_level; -void -hlog_warn(const char *FUNC, const char *format, ...) -{ - va_list ap; + switch (level) + { + case NANOHTTP_LOGLEVEL_VERBOSE: + case NANOHTTP_LOGLEVEL_DEBUG: + syslog_level = LOG_DEBUG; + break; + case NANOHTTP_LOGLEVEL_INFO: + syslog_level = LOG_INFO; + break; + case NANOHTTP_LOGLEVEL_WARN: + syslog_level = LOG_WARNING; + break; + case NANOHTTP_LOGLEVEL_ERROR: + syslog_level = LOG_ERR; + break; + case NANOHTTP_LOGLEVEL_FATAL: + syslog_level = LOG_CRIT; + break; + } + vsyslog(syslog_level, format, ap); + } +#endif - va_start(ap, format); - _log_write(HLOG_WARN, "WARN", FUNC, format, ap); - va_end(ap); -} + if ((filename = nanohttp_log_get_logfile())) + { + FILE *fp; -void -hlog_error(const char *FUNC, const char *format, ...) -{ - va_list ap; + if (!(fp = fopen(filename, "a"))) + fp = fopen(filename, "w"); + + if (fp) + { + vfprintf(fp, format, ap); + fflush(fp); + fclose(fp); + } + } - va_start(ap, format); - _log_write(HLOG_ERROR, "ERROR", FUNC, format, ap); va_end(ap); } - |