Hello!

We're uging DBMail 2.2.5 from EPEL (Extra Packages for Enterprise Linux by 
RedHat/Fedora Project) - 
http://download.fedora.redhat.com/pub/epel/5/i386/repoview/dbmail.html .

Sources of dbmail from EPEL contains next patch:
------------------------ begin patch
Index: server.c
===================================================================
--- server.c    (revision 2646)
+++ server.c    (revision 2647)
@@ -172,20 +172,36 @@
        return Restart;
 }

-pid_t server_daemonize(serverConfig_t *conf)
+/* Should be called after a HUP to allow for log rotation,
+ * as the filesystem may want to give us new inodes and/or
+ * the user may have changed the log file configs. */
+static void reopen_logs(serverConfig_t *conf)
 {
        int serr;
-       assert(conf);
+
+       if (! (freopen(conf->log, "a", stdout))) {
+               serr = errno;
+               TRACE(TRACE_ERROR, "freopen failed on [%s] [%s]",
+                               conf->log, strerror(serr));
+       }
+       if (! (freopen(conf->error_log, "a", stderr))) {
+               serr = errno;
+               TRACE(TRACE_ERROR, "freopen failed on [%s] [%s]",
+                               conf->error_log, strerror(serr));
+       }
+       if (! (freopen("/dev/null", "r", stdin))) {
+               serr = errno;
+               TRACE(TRACE_ERROR, "freopen failed on stdin [%s]",
+                               strerror(serr));
+       }
+}

-       if (fork())
-               exit(0);
-       setsid();
-       if (fork())
-               exit(0);
+/* Should be called once to initially close the actual std{in,out,err}
+ * and open the redirection files. */
+static void reopen_logs_fatal(serverConfig_t *conf)
+{
+       int serr;

-       chdir("/");
-       umask(0077);
-
        if (! (freopen(conf->log, "a", stdout))) {
                serr = errno;
                TRACE(TRACE_FATAL, "freopen failed on [%s] [%s]",
@@ -201,7 +217,23 @@
                TRACE(TRACE_FATAL, "freopen failed on stdin [%s]",
                                strerror(serr));
        }
+}

+pid_t server_daemonize(serverConfig_t *conf)
+{
+       assert(conf);
+
+       if (fork())
+               exit(0);
+       setsid();
+       if (fork())
+               exit(0);
+
+       chdir("/");
+       umask(0077);
+
+       reopen_logs_fatal(conf);
+
        TRACE(TRACE_DEBUG, "sid: [%d]", getsid(0));

        return getsid(0);
@@ -225,6 +257,8 @@
        int serrno, status, result = 0;
        pid_t pid = -1;

+       reopen_logs(conf);
+
        CreateSocket(conf);

        switch ((pid = fork())) {
------------------------ end patch

I noticed than exist bug http://dbmail.org/mantis/view.php?id=600 .

DBMail built with patch above but in any case dbmail-imapd just stop sometimes 
on logrotate (e.g. receiving SIGHUP).

How to solve this problem?

--
Ilyas
_______________________________________________
DBmail mailing list
[email protected]
https://mailman.fastxs.nl/mailman/listinfo/dbmail

Reply via email to