From 942f22989a7eddb40cbc272345314ec07c3dfdbe Mon Sep 17 00:00:00 2001 From: Robert James Kaes Date: Thu, 3 Oct 2002 20:49:57 +0000 Subject: The internal log structure now uses a vector rather than a hash. This change was required to actually display all the logs in the correct order. Also, all log lines are stored internally while tinyproxy is starting. At the appropriate point all the logs are written to the log file. --- src/log.c | 111 ++++++++++++++++++++++++++++++++++++++++---------------------- src/log.h | 6 +++- 2 files changed, 76 insertions(+), 41 deletions(-) diff --git a/src/log.c b/src/log.c index 99e7b38..fb2b15f 100644 --- a/src/log.c +++ b/src/log.c @@ -1,4 +1,4 @@ -/* $Id: log.c,v 1.22 2002-06-15 17:37:11 rjkaes Exp $ +/* $Id: log.c,v 1.23 2002-10-03 20:49:57 rjkaes Exp $ * * Logs the various messages which tinyproxy produces to either a log file or * the syslog daemon. Not much to it... @@ -19,10 +19,10 @@ #include "tinyproxy.h" -#include "hashmap.h" #include "heap.h" #include "log.h" #include "utils.h" +#include "vector.h" static char *syslog_level[] = { NULL, @@ -39,6 +39,11 @@ static char *syslog_level[] = { #define TIME_LENGTH 16 #define STRING_LENGTH 800 +/* + * Global file descriptor for the log file + */ +int log_file_fd = -1; + /* * Store the log level setting. */ @@ -50,7 +55,36 @@ static int log_level = LOG_INFO; * The key is the actual messages (already filled in full), and the value * is the log level. */ -static hashmap_t log_message_storage; +static vector_t log_message_storage; + +/* + * Open the log file and store the file descriptor in a global location. + */ +int +open_log_file(const char* log_file_name) +{ + log_file_fd = create_file_safely(log_file_name, FALSE); + return log_file_fd; +} + +/* + * Close the log file + */ +void +close_log_file(void) +{ + close(log_file_fd); +} + +/* + * Truncate log file to a zero length. + */ +void +truncate_log_file(void) +{ + lseek(log_file_fd, 0, SEEK_SET); + ftruncate(log_file_fd, 0); +} /* * Set the log level for writing to the log file. @@ -71,9 +105,7 @@ log_message(int level, char *fmt, ...) time_t nowtime; char time_string[TIME_LENGTH]; -#if defined(HAVE_SYSLOG_H) && !defined(HAVE_VSYSLOG_H) char str[STRING_LENGTH]; -#endif #ifdef NDEBUG /* @@ -101,19 +133,23 @@ log_message(int level, char *fmt, ...) * the messages for later processing. */ if (!processed_config_file) { - char string_level[4]; + char* entry_buffer; if (!log_message_storage) { - log_message_storage = hashmap_create(1); + log_message_storage = vector_create(); if (!log_message_storage) return; } vsnprintf(str, STRING_LENGTH, fmt, args); - snprintf(string_level, 4, "%d", level); - hashmap_insert(log_message_storage, str, - string_level, strlen(string_level) + 1); + entry_buffer = safemalloc(strlen(str) + 6); + if (!entry_buffer) + return; + + sprintf(entry_buffer, "%d %s", level, str); + vector_insert(log_message_storage, entry_buffer, + strlen(entry_buffer) + 1); va_end(args); @@ -130,23 +166,21 @@ log_message(int level, char *fmt, ...) # endif } else { #endif - FILE* log_file; - int fd; - - fd = create_file_safely(config.logf_name, FALSE); - log_file = fdopen(fd, "w+"); - nowtime = time(NULL); /* Format is month day hour:minute:second (24 time) */ strftime(time_string, TIME_LENGTH, "%b %d %H:%M:%S", localtime(&nowtime)); - fprintf(log_file, "%-9s %s [%ld]: ", syslog_level[level], - time_string, (long int) getpid()); - vfprintf(log_file, fmt, args); - fprintf(log_file, "\n"); + snprintf(str, STRING_LENGTH, "%-9s %s [%ld]: ", syslog_level[level], + time_string, (long int) getpid()); + + assert(log_file_fd >= 0); + + write(log_file_fd, str, strlen(str)); + vsnprintf(str, STRING_LENGTH, fmt, args); + write(log_file_fd, str, strlen(str)); + write(log_file_fd, "\n", 1); - fclose(log_file); #ifdef HAVE_SYSLOG_H } #endif @@ -160,35 +194,32 @@ log_message(int level, char *fmt, ...) void send_stored_logs(void) { - hashmap_iter iter; - char *level_string; char *string; + char *ptr; + int level; - iter = hashmap_first(log_message_storage); - if (iter >= 0) { - for ( ; !hashmap_is_end(log_message_storage, iter); ++iter) { - hashmap_return_entry(log_message_storage, - iter, - &string, - (void **)&level_string); + int i; - level = atoi(level_string); + for (i = 0; i < vector_length(log_message_storage); ++i) { + vector_getentry(log_message_storage, i, (void **)&string); + + ptr = strchr(string, ' ') + 1; + level = atoi(string); #if NDEBUG - if (log_level == LOG_CONN && level == LOG_INFO) - continue; - else if (log_level == LOG_INFO) { - if (level > LOG_INFO && level != LOG_CONN) - continue; - } else if (level > log_level) + if (log_level == LOG_CONN && level == LOG_INFO) + continue; + else if (log_level == LOG_INFO) { + if (level > LOG_INFO && level != LOG_CONN) continue; + } else if (level > log_level) + continue; #endif - log_message(level, string); - } + log_message(level, ptr); } - hashmap_delete(log_message_storage); + vector_delete(log_message_storage); log_message_storage = NULL; } diff --git a/src/log.h b/src/log.h index de7894b..c97b06e 100644 --- a/src/log.h +++ b/src/log.h @@ -1,4 +1,4 @@ -/* $Id: log.h,v 1.10 2002-05-26 18:55:19 rjkaes Exp $ +/* $Id: log.h,v 1.11 2002-10-03 20:49:57 rjkaes Exp $ * * See 'log.c' for a detailed description. * @@ -99,6 +99,10 @@ # define DEBUG2(x, y...) do { } while(0) #endif +extern int open_log_file(const char* file); +extern void close_log_file(void); +extern void truncate_log_file(void); + extern void log_message(int level, char *fmt, ...); extern void set_log_level(int level); extern void send_stored_logs(void); -- cgit v1.2.3