]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Allow a second log initialization after settings have been read.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 11 Oct 2017 10:03:51 +0000 (13:03 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 11 Oct 2017 10:54:13 +0000 (13:54 +0300)
This fixes logging with services that bypass the log service (lda or -L
parameter).

src/lib-master/master-service.c

index f9fe51fd5a89784f794fc6fca335bade78e57986..50998c8e8fbcae2ac61e28583cbba5e8d2cd752f 100644 (file)
@@ -341,40 +341,32 @@ bool master_getopt_str_is_valid(const char *str)
        return TRUE;
 }
 
-void master_service_init_log(struct master_service *service,
-                            const char *prefix)
+static bool
+master_service_try_init_log(struct master_service *service,
+                           const char *prefix)
 {
        const char *path, *timestamp;
-       bool log_already_initialized = service->log_initialized;
 
-       service->log_initialized = TRUE;
        if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0 &&
            (service->flags & MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR) == 0) {
-               if (log_already_initialized)
-                       return;
                timestamp = getenv("LOG_STDERR_TIMESTAMP");
                if (timestamp != NULL)
                        i_set_failure_timestamp_format(timestamp);
                i_set_failure_file("/dev/stderr", "");
-               return;
-       }
-
-       if (log_already_initialized) {
-               /* change only the prefix */
-               i_set_failure_prefix("%s", prefix);
-               return;
+               return TRUE;
        }
 
        if (getenv("LOG_SERVICE") != NULL && !service->log_directly) {
                /* logging via log service */
                i_set_failure_internal();
                i_set_failure_prefix("%s", prefix);
-               return;
+               return TRUE;
        }
 
        if (service->set == NULL) {
                i_set_failure_file("/dev/stderr", prefix);
-               return;
+               /* may be called again after we have settings */
+               return FALSE;
        }
 
        if (strcmp(service->set->log_path, "syslog") != 0) {
@@ -416,6 +408,19 @@ void master_service_init_log(struct master_service *service,
                        i_set_debug_file(path);
        }
        i_set_failure_timestamp_format(service->set->log_timestamp);
+       return TRUE;
+}
+
+void master_service_init_log(struct master_service *service,
+                            const char *prefix)
+{
+       if (service->log_initialized) {
+               /* change only the prefix */
+               i_set_failure_prefix("%s", prefix);
+               return;
+       }
+       if (master_service_try_init_log(service, prefix))
+               service->log_initialized = TRUE;
 }
 
 void master_service_set_die_with_master(struct master_service *service,