syslog-ng/logrotation-bug-2.0.7.patch

144 lines
4.8 KiB
Diff

diff --git a/src/affile.c b/src/affile.c
index 42f70c3..e8e2f1d 100644
--- a/src/affile.c
+++ b/src/affile.c
@@ -344,8 +344,12 @@ affile_dw_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
{
FDWrite *fdw;
- self->writer = log_writer_new(LW_FORMAT_FILE, s, &self->owner->writer_options);
+ if (!self->writer)
+ {
+ self->writer = log_writer_new(LW_FORMAT_FILE, s, &self->owner->writer_options);
+ log_pipe_append(&self->super, self->writer);
+ }
if (!log_pipe_init(self->writer, NULL, NULL))
{
msg_error("Error initializing log writer", NULL);
@@ -358,7 +362,6 @@ affile_dw_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
if (self->owner->flags & AFFILE_FSYNC)
fdw->fsync = TRUE;
log_writer_reopen(self->writer, fdw);
- log_pipe_append(&self->super, self->writer);
}
else
{
@@ -379,9 +382,7 @@ affile_dw_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
if (self->writer)
{
log_pipe_deinit(self->writer, NULL, NULL);
- log_pipe_unref(self->writer);
}
- self->writer = NULL;
return TRUE;
}
@@ -410,7 +411,7 @@ affile_dw_set_owner(AFFileDestWriter *self, AFFileDestDriver *owner)
log_pipe_ref(&owner->super.super);
self->owner = owner;
if (self->writer)
- log_writer_set_options((LogWriter *) self->writer, &owner->writer_options);
+ log_writer_set_options((LogWriter *) self->writer, &self->super, &owner->writer_options);
}
@@ -419,6 +420,8 @@ affile_dw_free(LogPipe *s)
{
AFFileDestWriter *self = (AFFileDestWriter *) s;
+ log_pipe_unref(self->writer);
+ self->writer = NULL;
g_string_free(self->filename, TRUE);
log_pipe_unref(&self->owner->super.super);
@@ -620,6 +623,7 @@ affile_dd_reuse_writer(gpointer key, gpointer value, gpointer user_data)
AFFileDestWriter *writer = (AFFileDestWriter *) value;
affile_dw_set_owner(writer, self);
+ log_pipe_init(&writer->super, NULL, NULL);
}
@@ -665,7 +669,10 @@ affile_dd_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
{
self->writer = persist_config_fetch(persist, affile_dd_format_persist_name(self));
if (self->writer)
- affile_dw_set_owner(self->writer, self);
+ {
+ affile_dw_set_owner(self->writer, self);
+ log_pipe_init(&self->writer->super, NULL, NULL);
+ }
}
@@ -711,6 +718,12 @@ affile_dd_destroy_writer_hash(gpointer value)
g_hash_table_destroy(writer_hash);
}
+static void
+affile_dd_deinit_writer(gpointer key, gpointer value, gpointer user_data)
+{
+ log_pipe_deinit((LogPipe *) value, NULL, NULL);
+}
+
static gboolean
affile_dd_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
{
@@ -721,6 +734,7 @@ affile_dd_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
{
g_assert(self->writer_hash == NULL);
+ log_pipe_deinit(&self->writer->super, NULL, NULL);
persist_config_add(persist, affile_dd_format_persist_name(self), self->writer, affile_dd_destroy_writer);
self->writer = NULL;
}
@@ -728,6 +742,7 @@ affile_dd_deinit(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist)
{
g_assert(self->writer == NULL);
+ g_hash_table_foreach(self->writer_hash, affile_dd_deinit_writer, NULL);
persist_config_add(persist, affile_dd_format_persist_name(self), self->writer_hash, affile_dd_destroy_writer_hash);
self->writer_hash = NULL;
}
diff --git a/src/logwriter.c b/src/logwriter.c
index 3286da7..bb82b43 100644
--- a/src/logwriter.c
+++ b/src/logwriter.c
@@ -423,6 +423,7 @@ log_writer_reopen(LogPipe *s, FDWrite *newfd)
{
LogWriter *self = (LogWriter *) s;
+ /* old fd is freed by the source */
if (self->source)
{
g_source_destroy(self->source);
@@ -440,12 +441,12 @@ log_writer_reopen(LogPipe *s, FDWrite *newfd)
}
void
-log_writer_set_options(LogWriter *self, LogWriterOptions *options)
+log_writer_set_options(LogWriter *self, LogPipe *control, LogWriterOptions *options)
{
+ self->control = control;
self->options = options;
}
-
LogPipe *
log_writer_new(guint32 flags, LogPipe *control, LogWriterOptions *options)
{
diff --git a/src/logwriter.h b/src/logwriter.h
index 3fe7129..284899b 100644
--- a/src/logwriter.h
+++ b/src/logwriter.h
@@ -81,7 +81,7 @@ typedef struct _LogWriter
LogWriterOptions *options;
} LogWriter;
-void log_writer_set_options(LogWriter *self, LogWriterOptions *options);
+void log_writer_set_options(LogWriter *self, LogPipe *control, LogWriterOptions *options);
void log_writer_format_log(LogWriter *self, LogMessage *lm, GString *result);
gboolean log_writer_reopen(LogPipe *s, FDWrite *fd);
LogPipe *log_writer_new(guint32 flags, LogPipe *control, LogWriterOptions *options);