summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRobert James Kaes <rjkaes@users.sourceforge.net>2002-10-03 20:49:57 +0000
committerRobert James Kaes <rjkaes@users.sourceforge.net>2002-10-03 20:49:57 +0000
commit942f22989a7eddb40cbc272345314ec07c3dfdbe (patch)
tree52133049099d5f4d5e0ceedab9520de7d903c573 /src
parent7fd291f407a9ef14cd3ac018c51a34bd446fc3a6 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/log.c111
-rw-r--r--src/log.h6
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,
@@ -40,6 +40,11 @@ static char *syslog_level[] = {
#define STRING_LENGTH 800
/*
+ * Global file descriptor for the log file
+ */
+int log_file_fd = -1;
+
+/*
* Store the log level setting.
*/
static int log_level = LOG_INFO;
@@ -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);