From 0f593f1d7456d0374ed0ede5dae302cbb1627169 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 23 Feb 2009 14:46:42 +0000 Subject: added duplicates detection for new logging fixed file logging (flush) --- src/log.c | 24 ++++++++++++++++++++++-- src/log.h | 1 + src/log_targets.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/log.c b/src/log.c index aea8ff4..c3748d7 100644 --- a/src/log.c +++ b/src/log.c @@ -73,22 +73,42 @@ log_target_type_t log_target_parse_type(const char* conf) return TARGET_UNKNOWN; } +int log_targets_target_exists(log_targets_t* targets, log_target_type_t type) +{ + if(!targets && !targets->first_) + return 0; + + log_target_t* tmp = targets->first_; + while(tmp) { + if(tmp->type_ == type) + return 1; + tmp = tmp->next_; + } + return 0; +} + int log_targets_add(log_targets_t* targets, const char* conf) { if(!targets) return -1; log_target_t* new_target = NULL; + int duplicates_allowed = 0; switch(log_target_parse_type(conf)) { case TARGET_SYSLOG: new_target = log_target_syslog_new(); break; - case TARGET_FILE: new_target = log_target_file_new(); break; + case TARGET_FILE: new_target = log_target_file_new(); duplicates_allowed = 1; break; case TARGET_STDOUT: new_target = log_target_stdout_new(); break; case TARGET_STDERR: new_target = log_target_stderr_new(); break; default: return -3; } if(!new_target) return -2; - + + if(!duplicates_allowed && log_targets_target_exists(targets, new_target->type_)) { + free(new_target); + return -4; + } + const char* prioptr = strchr(conf, ':'); if(!prioptr || prioptr[1] == 0) { free(new_target); diff --git a/src/log.h b/src/log.h index 293a28f..0be0566 100644 --- a/src/log.h +++ b/src/log.h @@ -67,6 +67,7 @@ struct log_targets_struct { }; typedef struct log_targets_struct log_targets_t; +int log_targets_target_exists(log_targets_t* targets, log_target_type_t type); int log_targets_add(log_targets_t* targets, const char* conf); void log_targets_log(log_targets_t* targets, log_prio_t prio, const char* msg); void log_targets_clear(log_targets_t* targets); diff --git a/src/log_targets.h b/src/log_targets.h index 66f13a0..8357f4d 100644 --- a/src/log_targets.h +++ b/src/log_targets.h @@ -236,6 +236,7 @@ void log_target_file_log(log_target_t* self, log_prio_t prio, const char* msg) return; fprintf(((log_target_file_param_t*)(self->param_))->file_, "%s-%s\n", log_prio_to_string(prio), msg); + fflush(((log_target_file_param_t*)(self->param_))->file_); } void log_target_file_close(log_target_t* self) -- cgit v1.2.3