]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-3.4-20190129
authorWietse Venema <wietse@porcupine.org>
Tue, 29 Jan 2019 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Sun, 3 Feb 2019 19:02:26 +0000 (14:02 -0500)
89 files changed:
postfix/.indent.pro
postfix/HISTORY
postfix/Makefile.in
postfix/RELEASE_NOTES
postfix/WISHLIST
postfix/conf/master.cf
postfix/conf/post-install
postfix/conf/postfix-files
postfix/conf/postfix-script
postfix/html/Makefile.in
postfix/html/master.5.html
postfix/html/master.8.html
postfix/html/postconf.5.html
postfix/html/postdrop.1.html
postfix/html/postfix-manuals.html
postfix/html/postfix.1.html
postfix/html/postlog.1.html
postfix/html/postlogd.8.html [new file with mode: 0644]
postfix/html/postmulti.1.html
postfix/man/Makefile.in
postfix/man/man1/postdrop.1
postfix/man/man1/postfix.1
postfix/man/man1/postlog.1
postfix/man/man1/postmulti.1
postfix/man/man5/master.5
postfix/man/man5/postconf.5
postfix/man/man8/master.8
postfix/man/man8/postlogd.8 [new file with mode: 0644]
postfix/mantools/postlink
postfix/proto/master
postfix/proto/postconf.proto
postfix/src/global/Makefile.in
postfix/src/global/mail_params.c
postfix/src/global/mail_params.h
postfix/src/global/mail_proto.h
postfix/src/global/mail_task.c
postfix/src/global/mail_version.h
postfix/src/global/maillog_client.c [new file with mode: 0644]
postfix/src/global/maillog_client.h [new file with mode: 0644]
postfix/src/master/Makefile.in
postfix/src/master/dgram_server.c [new file with mode: 0644]
postfix/src/master/event_server.c
postfix/src/master/mail_server.h
postfix/src/master/master.c
postfix/src/master/master.h
postfix/src/master/master_ent.c
postfix/src/master/master_listen.c
postfix/src/master/master_proto.h
postfix/src/master/master_wakeup.c
postfix/src/master/multi_server.c
postfix/src/master/single_server.c
postfix/src/master/trigger_server.c
postfix/src/postalias/Makefile.in
postfix/src/postalias/postalias.c
postfix/src/postconf/postconf_master.c
postfix/src/postdrop/Makefile.in
postfix/src/postdrop/postdrop.c
postfix/src/postfix/Makefile.in
postfix/src/postfix/postfix.c
postfix/src/postkick/postkick.c
postfix/src/postlog/Makefile.in
postfix/src/postlog/postlog.c
postfix/src/postlogd/Makefile.in [new file with mode: 0644]
postfix/src/postlogd/postlogd.c [new file with mode: 0644]
postfix/src/postmap/Makefile.in
postfix/src/postmap/postmap.c
postfix/src/postmulti/Makefile.in
postfix/src/postmulti/postmulti.c
postfix/src/postqueue/Makefile.in
postfix/src/postqueue/postqueue.c
postfix/src/postsuper/Makefile.in
postfix/src/postsuper/postsuper.c
postfix/src/sendmail/Makefile.in
postfix/src/sendmail/sendmail.c
postfix/src/tls/Makefile.in
postfix/src/util/Makefile.in
postfix/src/util/connect.h
postfix/src/util/listen.h
postfix/src/util/logwriter.c [new file with mode: 0644]
postfix/src/util/logwriter.h [new file with mode: 0644]
postfix/src/util/msg_logger.c [new file with mode: 0644]
postfix/src/util/msg_logger.h [new file with mode: 0644]
postfix/src/util/msg_output.c
postfix/src/util/msg_output.h
postfix/src/util/msg_syslog.c
postfix/src/util/msg_syslog.h
postfix/src/util/unix_dgram_connect.c [new file with mode: 0644]
postfix/src/util/unix_dgram_listen.c [new file with mode: 0644]
postfix/src/util/watchdog.c

index 531e12c1c703c3848d4ecfa6c77781b5486a7b25..7e977406ba34ca2865b27a006ca8f92bda957613 100644 (file)
 -TLMTP_STATE
 -TLOCAL_EXP
 -TLOCAL_STATE
+-TLOGWRITER
 -TLONG_NAME_MASK
 -TMAC_EXP_CONTEXT
 -TMAC_EXP_OP_INFO
 -Tgeneral_name_stack_t
 -Tiana_digest
 -Toff_t
+-Tpem_load_state_t
 -Tregex_t
 -Tregmatch_t
 -Tsasl_conn_t
 -Ttime_t
 -Ttlsa_filter
 -Tx509_stack_t
--Tpem_load_state_t
index 4a49588949334bf6da6e40a8faae9330b6445545..bfdb6744679241a40a5fba3276acb3a156280daa 100644 (file)
@@ -23946,7 +23946,69 @@ Apologies for any names omitted.
         dict_open.c, and updated the -F description in the postmap
         manpage. Files: util/dict_open.c, postmap/postmap.c.
 
+20190121
+
+       Logging: support for internal logging file, without using
+       syslog (it uses the new postlogd daemon instead). This
+       solves a usability problem for MacOS, may help getting
+       around systemd, and solves 99% of the problem for logging
+       to stdout in a container (hopefully we have 100% soon).
+       Enable by setting, for example, "maillog_file =
+       /var/log/postfix.log").  This works fine for daemons, and
+       with some limitations for non-daemon programs.  See
+       RELEASE_NOTES for more details.  Files: conf/master.cf,
+       conf/post-install, conf/postfix-files, conf/postfix-script,
+       mantools/postlink, proto/master, proto/postconf.proto,
+       global/mail_params.c, global/mail_params.h, global/mail_proto.h,
+       global/maillog_client.c, global/maillog_client.h,
+       master/dgram_server.c, master/event_server.c, master/mail_server.h,
+       master/master.c, master/master.h, master/master_ent.c,
+       master/master_listen.c, master/master_proto.h,
+       master/master_wakeup.c, master/multi_server.c,
+       master/single_server.c, master/trigger_server.c,
+       postalias/postalias.c, postconf/postconf_master.c,
+       postdrop/postdrop.c, postfix/postfix.c, postkick/postkick.c,
+       postlog/postlog.c, postlogd/postlogd.c, postmap/postmap.c,
+       postmulti/postmulti.c, postqueue/postqueue.c,
+       postsuper/postsuper.c, sendmail/sendmail.c, util/connect.h,
+       util/listen.h, util/logwriter.c, util/logwriter.h,
+       util/msg_logger.c, util/msg_logger.h, util/msg_output.c,
+       util/msg_output.h, util/unix_dgram_connect.c,
+       util/unix_dgram_listen.c.
+
+       Safety: temporary postlogd fix to avoid recursion when main.cf
+       has "maillog_file =" but master(8) still still tells its child
+       processes to send logs to postlogd. File: postlogd/postlogd.c.
+
+20190126
+
+       Safety: Postfix programs will log to either syslog or postlog
+       but not both; and postlogd forwards postlog logging to
+       syslog, when a configuration change removes the maillog_file
+       pathname, but some programs still use the old configuration.
+       Files: util/msg_syslog.[hc], util/msg_logger.c,
+       global/maillog_client.c, postlogd/postlogd.c,
+
+       Bugfix (introduced: Postfix 20110109, Postfix 2.10): watchdog
+       pipe file descriptor leak. This pipe provides one source
+       of liveness, data from this pipe is discarded, and therefore
+       this does not enable privilege escalation or DOS. File:
+       util/watchdog.c.
+
+       Feature: stdout logging support; requires "postfix start-fg"
+       and "maillog_file = /dev/stdout". Files: master/master.c,
+       conf/postfix-script.
+
 20190127
 
+       Safety: when maillog_file is specified, 'postfix check' now
+       requires that the postlog service is enabled in master.cf.
+       Otherwise 'postfix start' etc. will log a fatal error. File:
+       conf/postfix-script.
+
        Documentation: added policy_context example. File:
        proto/SMTPD_POLICY_README.html.
+
+20190128
+
+       Testing: run libtls tests under Valgrind. File tls/Makefile.in.
index f7c43fcc0bc9f5513ea5ff05fae0eee7a971eb0f..fa12b0443a1c6c89f1b2589be8e45b79f57a9e8d 100644 (file)
@@ -10,7 +10,7 @@ DIRS  = src/util src/global src/dns src/tls src/xsasl src/master src/milter \
        src/postsuper src/qmqpd src/spawn src/flush src/verify \
        src/virtual src/proxymap src/anvil src/scache src/discard src/tlsmgr \
        src/postmulti src/postscreen src/dnsblog src/tlsproxy \
-       src/posttls-finger
+       src/posttls-finger src/postlogd
 MANDIRS        = proto man html
 LIBEXEC        = libexec/post-install libexec/postfix-script libexec/postfix-wrapper \
        libexec/postmulti-script libexec/postfix-tls-script
index 084382ba5d60c32efdc8dc8b5070da311ec6bc0d..c87676085d7fffc66cd8c9401dbe2645532b0aa1 100644 (file)
@@ -30,6 +30,85 @@ Major changes with snapshot 20190127
 
 [TODO: summary of SNI and chain-file support]
 
+Incompatible changes with snapshot 20190126-nonprod
+====================================================
+
+This introduces a new master.cf service type 'unix-dgram' that is
+used by the new postlogd(8) daemon. This type is not supported by
+older Postfix versions. Before backing out to an Postfix 3.3 or
+earlier, edit the master.cf file and remove the postlog entry.
+
+Major changes with snapshot 20190126-nonprod
+============================================
+
+Support for logging to file or stdout. This disables syslog logging.
+
+- Logging to file solves a usability problem for MacOS users, and
+  may also be useful on LINUX when systemd is getting in the way.
+
+- Logging to stdout is useful when Postfix runs in a container, as
+  it eliminates a syslogd dependency.
+
+To enable Postfix logging to file or stdout:
+--------------------------------------------
+
+Add the following line to master.cf (no whitespace at the start of the line):
+    postlog   unix-dgram n  -       n       -       1       postlogd
+
+To write logs to Postfix logfile: 
+    # postfix stop
+    # postconf maillog_file=/var/log/postfix.log
+    # postfix start
+
+To write logs to stdout, typically while Postfix runs in a container:
+    # postconf maillog_file=/dev/stdout
+    # postfix start-fg
+
+To rotate a Postfix logfile with a daily cronjob:
+-------------------------------------------------
+
+The following applies when the maillog_file parameter specifies a
+reguar file.
+
+- Rename the current logfile in the same directory, appending the
+  current date to file file name. The following adds a suffix
+  of the form YYYYMMDD to file name:
+   # mv postfix.log postfix.log.$(date +%Y%M%d)
+
+- DO NOT YET COMPRESS THE FILE. POSTFIX STILL WRITES TO IT.
+
+- Reload Postfix, so that postlogd(8) will start writing to a new
+  file:
+   # postfix reload
+
+- Compress the old file, and move it elsewhere if needed.
+
+Limitations of logging to Postfix logfile or stdout:
+----------------------------------------------------
+
+Background:
+
+- Logging to Postfix logfile or stdout requires the Postfix postlogd(8)
+  service. This program ensures that simultaneous logging from
+  different programs will not get mixed up.
+
+Limitations:
+
+- Non-daemon Postfix programs may log to syslogd(8) before they
+  have processed command-line options and main.cf parameters.
+
+- If Postfix is down, the non-daemon programs postfix(1), postsuper(1),
+  postmulti(1), and postlog(1), will log directly to $maillog_file.
+  These programs expect to run with root privileges, for example
+  during Postfix start-up, reload, or shutdown.
+
+- Other non-daemon Postfix programs will never write directly to
+  $maillog_file (also, logging to stdout would interfere with the
+  operation of some of these programs). These programs can log to
+  postlogd(8) if they are run by the super-user, or if their
+  executable file has set-gid permission. Do not set this permision
+  on programs other than postdrop(1) and postqueue(1).
+
 Major changes with snapshot 20180826
 ====================================
 
index 67a0abb8ecbd9609a52ebd5db49d037c57d2a3f9..8d486fab0c6c7061a5b5ee0cff28b7d3c9cf3c8e 100644 (file)
@@ -1,5 +1,10 @@
 Wish list:
 
+       Add maillog_file to postfix(1) exports?
+
+       postfix rotate-log command: mv postfix.log postfix.log.$(date
+       +%Y%M%d-%H%M%S) to avoid data loss if called repeatedly.
+
        In smtpd(8) and postscreen(8), set the ehlo_discard_mask
        to ~0 so that STARTTLS, BDAT, DSN, etc. work only for clients
        that send EHLO.
index 5a75ae576ad9ea3af6dcef7129d5b90b47663ebc..c0f2508033f6ac89ba2a2f91867fd767a3590488 100644 (file)
@@ -64,6 +64,7 @@ virtual   unix  -       n       n       -       -       virtual
 lmtp      unix  -       -       n       -       -       lmtp
 anvil     unix  -       -       n       -       1       anvil
 scache    unix  -       -       n       -       1       scache
+postlog   unix-dgram n  -       n       -       1       postlogd
 #
 # ====================================================================
 # Interfaces to non-Postfix software. Be sure to examine the manual
index 25ef7e691f10ff34a0dcdfec5b345652ab09183a..975266b8b4a590066b14f15d393fdfd55f37b5c8 100644 (file)
@@ -887,6 +887,16 @@ EOF
 #          permit_mynetworks permit_sasl_authenticated \
 #          defer_unauth_destination" || exit 1
 #    }
+
+    # Postfix 3.4
+    # Add a postlog service entry.
+
+    grep '^postlog' $config_directory/master.cf >/dev/null || {
+       echo Editing $config_directory/master.cf, adding missing entry for postlog unix-domain datagram service
+       cat >>$config_directory/master.cf <<EOF || exit 1
+postlog   unix-dgram n  -       n       -       1       postlogd
+EOF
+    }
 }
 
 # A reminder if this is the first time Postfix is being installed.
index a433f4f9a0f1b1da29385467f9b974a3da84c462..4ed9d1f7cdd1fba513d969b5644f9fc768dce54d 100644 (file)
@@ -109,6 +109,7 @@ $daemon_directory/postfix-script:f:root:-:755
 $daemon_directory/postfix-tls-script:f:root:-:755
 $daemon_directory/postfix-wrapper:f:root:-:755
 $daemon_directory/postmulti-script:f:root:-:755
+$daemon_directory/postlogd:f:root:-:755
 $daemon_directory/postscreen:f:root:-:755
 $daemon_directory/proxymap:f:root:-:755
 $daemon_directory/qmgr:f:root:-:755
@@ -221,6 +222,7 @@ $manpage_directory/man8/nqmgr.8:f:root:-:644:o
 $manpage_directory/man8/oqmgr.8:f:root:-:644:
 $manpage_directory/man8/pickup.8:f:root:-:644
 $manpage_directory/man8/pipe.8:f:root:-:644
+$manpage_directory/man8/postlogd.8:f:root:-:644
 $manpage_directory/man8/postscreen.8:f:root:-:644
 $manpage_directory/man8/proxymap.8:f:root:-:644
 $manpage_directory/man8/qmgr.8:f:root:-:644
@@ -428,6 +430,7 @@ $html_directory/postlock.1.html:f:root:-:644
 $html_directory/postlog.1.html:f:root:-:644
 $html_directory/postmap.1.html:f:root:-:644
 $html_directory/postmulti.1.html:f:root:-:644
+$html_directory/postlogd.8.html:f:root:-:644
 $html_directory/postqueue.1.html:f:root:-:644
 $html_directory/postscreen.8.html:f:root:-:644
 $html_directory/postsuper.1.html:f:root:-:644
index 104e7dd1e70fca1ed51e20c8acd464ebf99d6fca..0526681c39982355bdee75042e5cab376eb149ec 100755 (executable)
@@ -139,7 +139,7 @@ start|start-fg)
                # Foreground this so it can be stopped. All inodes are cached.
                $daemon_directory/postfix-script check-warn
        fi
-       $INFO starting the Postfix mail system
+       $INFO starting the Postfix mail system || exit 1
        case $1 in
        start)
            # NOTE: wait in foreground process to get the initialization status.
@@ -158,7 +158,7 @@ start|start-fg)
                 1) exec $daemon_directory/master -i
                    $FATAL "cannot start-fg the master daemon"
                    exit 1;;
-                *) $daemon_directory/master;;
+                *) $daemon_directory/master -s;;
                esac
                ;;
             *) $FATAL "start-fg does not support multi_instance_directories"
@@ -268,6 +268,18 @@ check-fatal)
                exit 1
        }
 
+       maillog_file=`$command_directory/postconf -h maillog_file` || {
+               $FATAL cannot execute $command_directory/postconf!
+               exit 1
+       }
+       test -n "$maillog_file" && {
+               $command_directory/postconf -M postlog/unix-dgram 2>/dev/null \
+                   | grep . >/dev/null || {
+                       $FATAL "missing 'postlog' service in master.cf - run 'postfix upgrade-configuration'"
+                       exit 1
+               }
+       }
+
        # See if all queue files are in the right place. This is slow.
        # We must scan all queues for mis-named queue files before the
        # mail system can run.
index ecf0961be0667d0ee31d7745221f8b5e41ebf977..c5481f8aff7019e24da820781ebb10531e8be321 100644 (file)
@@ -8,7 +8,7 @@ DAEMONS =  bounce.8.html cleanup.8.html defer.8.html error.8.html local.8.html \
        oqmgr.8.html spawn.8.html flush.8.html virtual.8.html qmqpd.8.html \
        trace.8.html verify.8.html proxymap.8.html anvil.8.html \
        scache.8.html discard.8.html tlsmgr.8.html postscreen.8.html \
-       dnsblog.8.html tlsproxy.8.html
+       dnsblog.8.html tlsproxy.8.html postlogd.8.html
 COMMANDS= mailq.1.html newaliases.1.html postalias.1.html postcat.1.html \
        postconf.1.html postfix.1.html postkick.1.html postlock.1.html \
        postlog.1.html postdrop.1.html postmap.1.html postmulti.1.html \
@@ -101,6 +101,10 @@ pipe.8.html: ../src/pipe/pipe.c
        PATH=../mantools:$$PATH; \
        srctoman $? | $(AWK) | $(NROFF) -man | uniq | $(MAN2HTML) | postlink >$@
 
+postlogd.8.html: ../src/postlogd/postlogd.c
+       PATH=../mantools:$$PATH; \
+       srctoman $? | $(AWK) | $(NROFF) -man | uniq | $(MAN2HTML) | postlink >$@
+
 postscreen.8.html: ../src/postscreen/postscreen.c
        PATH=../mantools:$$PATH; \
        srctoman $? | $(AWK) | $(NROFF) -man | uniq | $(MAN2HTML) | postlink >$@
index 626164b6262314438a458bdd1f49ae6104b855c0..4e488fc021ff19fda190de038dfe69c3bcd4a565 100644 (file)
@@ -81,8 +81,8 @@ MASTER(5)                                                            MASTER(5)
                      hard-coding loopback IP address information in  <a href="master.5.html">master.cf</a>
                      or in <a href="postconf.5.html">main.cf</a>.
 
-              <b>unix</b>   The service listens on a UNIX-domain socket and is acces-
-                     sible for local clients only.
+              <b>unix</b>   The service listens on a UNIX-domain stream socket and is
+                     accessible for local clients only.
 
                      The service name is a pathname relative  to  the  Postfix
                      queue    directory    (pathname   controlled   with   the
@@ -91,29 +91,38 @@ MASTER(5)                                                            MASTER(5)
                      On Solaris 8 and earlier systems the <b>unix</b> type is  imple-
                      mented with streams sockets.
 
-              <b>fifo</b>   The  service listens on a FIFO (named pipe) and is acces-
-                     sible for local clients only.
+              <b>unix-dgram</b>
+                     The  service listens on a UNIX-domain datagram socket and
+                     is accessible for local clients only.
 
                      The service name is a pathname relative  to  the  Postfix
                      queue    directory    (pathname   controlled   with   the
                      <b><a href="postconf.5.html#queue_directory">queue_directory</a></b> configuration parameter in <a href="postconf.5.html">main.cf</a>).
 
-              <b>pass</b>   The service listens  on  a  UNIX-domain  socket,  and  is
-                     accessible  to  local  clients only. It receives one open
-                     connection  (file  descriptor  passing)  per   connection
-                     request.
+              <b>fifo</b> (obsolete)
+                     The service listens on a FIFO (named pipe) and is  acces-
+                     sible for local clients only.
 
                      The  service  name  is a pathname relative to the Postfix
                      queue   directory   (pathname   controlled    with    the
                      <b><a href="postconf.5.html#queue_directory">queue_directory</a></b> configuration parameter in <a href="postconf.5.html">main.cf</a>).
 
-                     On  Solaris 8 and earlier systems the <b>pass</b> type is imple-
+              <b>pass</b>   The  service  listens on a UNIX-domain stream socket, and
+                     is accessible to local clients only. It receives one open
+                     connection   (file  descriptor  passing)  per  connection
+                     request.
+
+                     The service name is a pathname relative  to  the  Postfix
+                     queue    directory    (pathname   controlled   with   the
+                     <b><a href="postconf.5.html#queue_directory">queue_directory</a></b> configuration parameter in <a href="postconf.5.html">main.cf</a>).
+
+                     On Solaris 8 and earlier systems the <b>pass</b> type is  imple-
                      mented with streams sockets.
 
                      This feature is available as of Postfix version 2.5.
 
        <b>Private (default: y)</b>
-              Whether or not access is restricted to the mail system.   Inter-
+              Whether  or not access is restricted to the mail system.  Inter-
               net (type <b>inet</b>) services can't be private.
 
        <b>Unprivileged (default: y)</b>
@@ -121,80 +130,80 @@ MASTER(5)                                                            MASTER(5)
               the  Postfix  system  (the  owner  name  is  controlled  by  the
               <b><a href="postconf.5.html#mail_owner">mail_owner</a></b> configuration variable in the <a href="postconf.5.html">main.cf</a> file).
 
-              The  <a href="local.8.html"><b>local</b>(8)</a>, <a href="pipe.8.html"><b>pipe</b>(8)</a>, <a href="spawn.8.html"><b>spawn</b>(8)</a>, and <a href="virtual.8.html"><b>virtual</b>(8)</a> daemons require
+              The <a href="local.8.html"><b>local</b>(8)</a>, <a href="pipe.8.html"><b>pipe</b>(8)</a>, <a href="spawn.8.html"><b>spawn</b>(8)</a>, and <a href="virtual.8.html"><b>virtual</b>(8)</a> daemons  require
               privileges.
 
        <b>Chroot (default: Postfix</b> &gt;<b>= 3.0: n, Postfix</b> &lt;<b>3.0: y)</b>
-              Whether or not the service  runs  chrooted  to  the  mail  queue
+              Whether  or  not  the  service  runs  chrooted to the mail queue
               directory (pathname is controlled by the <b><a href="postconf.5.html#queue_directory">queue_directory</a></b> config-
               uration variable in the <a href="postconf.5.html">main.cf</a> file).
 
-              Chroot should not be used with the <a href="local.8.html"><b>local</b>(8)</a>, <a href="pipe.8.html"><b>pipe</b>(8)</a>,  <a href="spawn.8.html"><b>spawn</b>(8)</a>,
+              Chroot  should not be used with the <a href="local.8.html"><b>local</b>(8)</a>, <a href="pipe.8.html"><b>pipe</b>(8)</a>, <a href="spawn.8.html"><b>spawn</b>(8)</a>,
               and <a href="virtual.8.html"><b>virtual</b>(8)</a> daemons.  Although the <a href="proxymap.8.html"><b>proxymap</b>(8)</a> server can run
-              chrooted, doing so defeats most of the purpose  of  having  that
+              chrooted,  doing  so  defeats most of the purpose of having that
               service in the first place.
 
               The files in the examples/chroot-setup subdirectory of the Post-
-              fix source show how to set up a Postfix chroot environment on  a
-              variety  of  systems.  See  also  <a href="BASIC_CONFIGURATION_README.html">BASIC_CONFIGURATION_README</a> for
+              fix  source show how to set up a Postfix chroot environment on a
+              variety of  systems.  See  also  <a href="BASIC_CONFIGURATION_README.html">BASIC_CONFIGURATION_README</a>  for
               issues related to running daemons chrooted.
 
        <b>Wake up time (default: 0)</b>
               Automatically wake up the named service after the specified num-
-              ber  of seconds. The wake up is implemented by connecting to the
-              service and sending a wake up request.  A ? at the  end  of  the
-              wake-up  time  field  requests  that  no  wake up events be sent
+              ber of seconds. The wake up is implemented by connecting to  the
+              service  and  sending  a wake up request.  A ? at the end of the
+              wake-up time field requests that  no  wake  up  events  be  sent
               before the first time a service is used.  Specify 0 for no auto-
               matic wake up.
 
-              The  <a href="pickup.8.html"><b>pickup</b>(8)</a>,  <a href="qmgr.8.html"><b>qmgr</b>(8)</a>  and <a href="flush.8.html"><b>flush</b>(8)</a> daemons require a wake up
+              The <a href="pickup.8.html"><b>pickup</b>(8)</a>, <a href="qmgr.8.html"><b>qmgr</b>(8)</a> and <a href="flush.8.html"><b>flush</b>(8)</a> daemons require  a  wake  up
               timer.
 
        <b>Process limit (default: $<a href="postconf.5.html#default_process_limit">default_process_limit</a>)</b>
-              The maximum number of processes that may  execute  this  service
+              The  maximum  number  of processes that may execute this service
               simultaneously. Specify 0 for no process count limit.
 
-              NOTE:  Some  Postfix  services  must  be  configured  as  a sin-
-              gle-process service (for example,  <a href="qmgr.8.html"><b>qmgr</b>(8)</a>)  and  some  services
-              must   be   configured  with  no  process  limit  (for  example,
+              NOTE: Some  Postfix  services  must  be  configured  as  a  sin-
+              gle-process  service  (for  example,  <a href="qmgr.8.html"><b>qmgr</b>(8)</a>) and some services
+              must  be  configured  with  no  process  limit   (for   example,
               <a href="cleanup.8.html"><b>cleanup</b>(8)</a>).  These limits must not be changed.
 
        <b>Command name + arguments</b>
-              The command to be executed.  Characters that are special to  the
-              shell  such  as  "&gt;"  or  "|"  have no special meaning here, and
-              quotes cannot be used to  protect  arguments  containing  white-
-              space.  To  protect  whitespace,  use  "{"  and "}" as described
+              The  command to be executed.  Characters that are special to the
+              shell such as "&gt;" or "|"  have  no  special  meaning  here,  and
+              quotes  cannot  be  used  to protect arguments containing white-
+              space. To protect whitespace,  use  "{"  and  "}"  as  described
               below.
 
-              The command name is relative to  the  Postfix  daemon  directory
-              (pathname  is  controlled  by the <b><a href="postconf.5.html#daemon_directory">daemon_directory</a></b> configuration
+              The  command  name  is  relative to the Postfix daemon directory
+              (pathname is controlled by  the  <b><a href="postconf.5.html#daemon_directory">daemon_directory</a></b>  configuration
               variable).
 
-              The command argument syntax for specific commands  is  specified
+              The  command  argument syntax for specific commands is specified
               in the respective daemon manual page.
 
-              The  following command-line options have the same effect for all
+              The following command-line options have the same effect for  all
               daemon programs:
 
-              <b>-D</b>     Run the daemon under control  by  the  command  specified
+              <b>-D</b>     Run  the  daemon  under  control by the command specified
                      with the <b><a href="postconf.5.html#debugger_command">debugger_command</a></b> variable in the <a href="postconf.5.html">main.cf</a> config-
                      uration file.  See <a href="DEBUG_README.html">DEBUG_README</a> for hints and tips.
 
               <b>-o {</b> <i>name</i> = <i>value</i> <b>}</b> (long form, Postfix &gt;= 3.0)
 
               <b>-o</b> <i>name</i>=<i>value</i> (short form)
-                     Override the named <a href="postconf.5.html">main.cf</a> configuration  parameter.  The
-                     parameter  value  can  refer to other parameters as <i>$name</i>
-                     etc., just like in <a href="postconf.5.html">main.cf</a>.  See <a href="postconf.5.html"><b>postconf</b>(5)</a> for  syntax.
+                     Override  the  named <a href="postconf.5.html">main.cf</a> configuration parameter. The
+                     parameter value can refer to other  parameters  as  <i>$name</i>
+                     etc.,  just like in <a href="postconf.5.html">main.cf</a>.  See <a href="postconf.5.html"><b>postconf</b>(5)</a> for syntax.
 
-                     NOTE  1:  With  the  "long  form" shown above, whitespace
-                     after "{", around "=", and before  "}"  is  ignored,  and
+                     NOTE 1: With the  "long  form"  shown  above,  whitespace
+                     after  "{",  around  "=",  and before "}" is ignored, and
                      whitespace within the parameter value is preserved.
 
                      NOTE 2: with the "short form" shown above, do not specify
-                     whitespace around the "="  or  in  parameter  values.  To
-                     specify  a  parameter value that contains whitespace, use
-                     the long form described above, or use commas  instead  of
+                     whitespace  around  the  "="  or  in parameter values. To
+                     specify a parameter value that contains  whitespace,  use
+                     the  long  form described above, or use commas instead of
                      spaces, or specify the value in <a href="postconf.5.html">main.cf</a>. Example:
 
                      /etc/postfix/<a href="master.5.html">master.cf</a>:
@@ -205,18 +214,18 @@ MASTER(5)                                                            MASTER(5)
                          submission_xxx_yyy = text with whitespace...
 
                      NOTE 3: Over-zealous use of parameter overrides makes the
-                     Postfix configuration hard to  understand  and  maintain.
-                     At  a certain point, it might be easier to configure mul-
+                     Postfix  configuration  hard  to understand and maintain.
+                     At a certain point, it might be easier to configure  mul-
                      tiple instances of Postfix, instead of configuring multi-
                      ple personalities via <a href="master.5.html">master.cf</a>.
 
-              <b>-v</b>     Increase  the  verbose logging level. Specify multiple <b>-v</b>
-                     options to make a  Postfix  daemon  process  increasingly
+              <b>-v</b>     Increase the verbose logging level. Specify  multiple  <b>-v</b>
+                     options  to  make  a  Postfix daemon process increasingly
                      verbose.
 
               Other command-line arguments
                      Specify "{" and "}" around command arguments that contain
-                     whitespace (Postfix 3.0 and later). Whitespace after  "{"
+                     whitespace  (Postfix 3.0 and later). Whitespace after "{"
                      and before "}" is ignored.
 
 <b>SEE ALSO</b>
index 64d6735d4784ab96a44ffef4ce5bbaac2fc21d14..66087d3448bd6a99c2fdda1c216288c17942108d 100644 (file)
@@ -47,23 +47,26 @@ MASTER(8)                                                            MASTER(8)
               Terminate the master process after <i>exit</i><b>_</b><i>time</i> seconds. Child pro-
               cesses terminate at their convenience.
 
-       <b>-i</b>     Enable  <b>init</b> mode: do not attempt to become a session or process
-              group leader; and to force termination, set an  explicit  signal
-              handler  instead  of  relying on the default signal action. This
-              mode is allowed only if the process ID equals 1.
+       <b>-i</b>     Enable  <b>init</b>  mode:  do  not  become  a session or process group
+              leader; similar to <b>-s</b>, do not redirect stdout to  /dev/null,  so
+              that  "<a href="postconf.5.html#maillog_file">maillog_file</a>  = /dev/stdout" works.  This mode is allowed
+              only if the process ID equals 1.
 
-       <b>-t</b>     Test mode. Return a zero exit status when  the  <b>master.pid</b>  lock
-              file  does  not  exist or when that file is not locked.  This is
+       <b>-s</b>     Do not redirect stdout to /dev/null,  so  that  "<a href="postconf.5.html#maillog_file">maillog_file</a>  =
+              /dev/stdout" works.
+
+       <b>-t</b>     Test  mode.  Return  a zero exit status when the <b>master.pid</b> lock
+              file does not exist or when that file is not  locked.   This  is
               evidence that the <a href="master.8.html"><b>master</b>(8)</a> daemon is not running.
 
-       <b>-v</b>     Enable verbose logging for debugging purposes.  This  option  is
+       <b>-v</b>     Enable  verbose  logging  for debugging purposes. This option is
               passed on to child processes. Multiple <b>-v</b> options make the soft-
               ware increasingly verbose.
 
        <b>-w</b>     Wait in a dummy foreground process, while the real master daemon
-              initializes  in  a  background  process.   The  dummy foreground
-              process returns a zero exit status only  if  the  master  daemon
-              initialization  is  successful, and if it completes in a reason-
+              initializes in  a  background  process.   The  dummy  foreground
+              process  returns  a  zero  exit status only if the master daemon
+              initialization is successful, and if it completes in  a  reason-
               able amount of time.
 
               This feature is available in Postfix 2.10 and later.
@@ -71,27 +74,27 @@ MASTER(8)                                                            MASTER(8)
        Signals:
 
        <b>SIGHUP</b> Upon receipt of a <b>HUP</b> signal (e.g., after "<b>postfix reload</b>"), the
-              master  process  re-reads  its configuration files. If a service
-              has been removed from the <a href="master.5.html"><b>master.cf</b></a> file, its running  processes
-              are  terminated  immediately.   Otherwise, running processes are
-              allowed to terminate as soon as is convenient, so  that  changes
+              master process re-reads its configuration files.  If  a  service
+              has  been removed from the <a href="master.5.html"><b>master.cf</b></a> file, its running processes
+              are terminated immediately.  Otherwise,  running  processes  are
+              allowed  to  terminate as soon as is convenient, so that changes
               in configuration settings affect only new service requests.
 
        <b>SIGTERM</b>
               Upon receipt of a <b>TERM</b> signal (e.g., after "<b>postfix abort</b>"), the
-              master process passes the signal on to its child  processes  and
-              terminates.   This is useful for an emergency shutdown. Normally
-              one would terminate only the master ("<b>postfix stop</b>")  and  allow
+              master  process  passes the signal on to its child processes and
+              terminates.  This is useful for an emergency shutdown.  Normally
+              one  would  terminate only the master ("<b>postfix stop</b>") and allow
               running processes to finish what they are doing.
 
 <b>DIAGNOSTICS</b>
-       Problems  are  reported  to  <b>syslogd</b>(8). The exit status is non-zero in
-       case of problems, including problems while  initializing  as  a  master
+       Problems are reported to <b>syslogd</b>(8). The exit  status  is  non-zero  in
+       case  of  problems,  including  problems while initializing as a master
        daemon process in the background.
 
 <b>ENVIRONMENT</b>
        <b>MAIL_DEBUG</b>
-              After  initialization,  start  a  debugger as specified with the
+              After initialization, start a debugger  as  specified  with  the
               <b><a href="postconf.5.html#debugger_command">debugger_command</a></b> configuration parameter in the <a href="postconf.5.html"><b>main.cf</b></a> configu-
               ration file.
 
@@ -99,18 +102,18 @@ MASTER(8)                                                            MASTER(8)
               Directory with Postfix configuration files.
 
 <b>CONFIGURATION PARAMETERS</b>
-       Unlike  most  Postfix  daemon  processes, the <a href="master.8.html"><b>master</b>(8)</a> server does not
-       automatically pick up changes to  <a href="postconf.5.html"><b>main.cf</b></a>.  Changes  to  <a href="master.5.html"><b>master.cf</b></a>  are
-       never  picked up automatically.  Use the "<b>postfix reload</b>" command after
+       Unlike most Postfix daemon processes, the  <a href="master.8.html"><b>master</b>(8)</a>  server  does  not
+       automatically  pick  up  changes  to  <a href="postconf.5.html"><b>main.cf</b></a>. Changes to <a href="master.5.html"><b>master.cf</b></a> are
+       never picked up automatically.  Use the "<b>postfix reload</b>" command  after
        a configuration change.
 
 <b>RESOURCE AND RATE CONTROLS</b>
        <b><a href="postconf.5.html#default_process_limit">default_process_limit</a> (100)</b>
-              The default maximal number of Postfix child processes that  pro-
+              The  default maximal number of Postfix child processes that pro-
               vide a given service.
 
        <b><a href="postconf.5.html#max_idle">max_idle</a> (100s)</b>
-              The  maximum  amount of time that an idle Postfix daemon process
+              The maximum amount of time that an idle Postfix  daemon  process
               waits for an incoming connection before terminating voluntarily.
 
        <b><a href="postconf.5.html#max_use">max_use</a> (100)</b>
@@ -118,18 +121,18 @@ MASTER(8)                                                            MASTER(8)
               process will service before terminating voluntarily.
 
        <b><a href="postconf.5.html#service_throttle_time">service_throttle_time</a> (60s)</b>
-              How long the Postfix <a href="master.8.html"><b>master</b>(8)</a> waits  before  forking  a  server
+              How  long  the  Postfix  <a href="master.8.html"><b>master</b>(8)</a> waits before forking a server
               that appears to be malfunctioning.
 
        Available in Postfix version 2.6 and later:
 
        <b><a href="postconf.5.html#master_service_disable">master_service_disable</a> (empty)</b>
-              Selectively  disable <a href="master.8.html"><b>master</b>(8)</a> listener ports by service type or
+              Selectively disable <a href="master.8.html"><b>master</b>(8)</a> listener ports by service type  or
               by service name and type.
 
 <b>MISCELLANEOUS CONTROLS</b>
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The default location of the Postfix <a href="postconf.5.html">main.cf</a> and  <a href="master.5.html">master.cf</a>  con-
+              The  default  location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
               figuration files.
 
        <b><a href="postconf.5.html#daemon_directory">daemon_directory</a> (see 'postconf -d' output)</b>
@@ -140,20 +143,20 @@ MASTER(8)                                                            MASTER(8)
               invoked with the -D option.
 
        <b><a href="postconf.5.html#inet_interfaces">inet_interfaces</a> (all)</b>
-              The  network  interface addresses that this mail system receives
+              The network interface addresses that this mail  system  receives
               mail on.
 
        <b><a href="postconf.5.html#inet_protocols">inet_protocols</a> (all)</b>
-              The Internet protocols Postfix will attempt to use  when  making
+              The  Internet  protocols Postfix will attempt to use when making
               or accepting connections.
 
        <b><a href="postconf.5.html#import_environment">import_environment</a> (see 'postconf -d' output)</b>
-              The  list  of  environment  parameters that a privileged Postfix
-              process will  import  from  a  non-Postfix  parent  process,  or
+              The list of environment parameters  that  a  privileged  Postfix
+              process  will  import  from  a  non-Postfix  parent  process, or
               name=value environment overrides.
 
        <b><a href="postconf.5.html#mail_owner">mail_owner</a> (postfix)</b>
-              The  UNIX  system  account  that owns the Postfix queue and most
+              The UNIX system account that owns the  Postfix  queue  and  most
               Postfix daemon processes.
 
        <b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
@@ -169,7 +172,7 @@ MASTER(8)                                                            MASTER(8)
               The syslog facility of Postfix logging.
 
        <b><a href="postconf.5.html#syslog_name">syslog_name</a> (see 'postconf -d' output)</b>
-              A prefix that  is  prepended  to  the  process  name  in  syslog
+              A  prefix  that  is  prepended  to  the  process  name in syslog
               records, so that, for example, "smtpd" becomes "prefix/smtpd".
 
        Available in Postfix 3.3 and later:
@@ -178,7 +181,7 @@ MASTER(8)                                                            MASTER(8)
               The <a href="master.5.html">master.cf</a> service name of a Postfix daemon process.
 
 <b>FILES</b>
-       To  expand  the directory names below into their actual values, use the
+       To expand the directory names below into their actual values,  use  the
        command "<b>postconf <a href="postconf.5.html#config_directory">config_directory</a></b>" etc.
 
        $<a href="postconf.5.html#config_directory">config_directory</a>/<a href="postconf.5.html">main.cf</a>, global configuration file.
index 17e67f0a7616eeeff81c7f614a0370acaf1089cf..6aa08434c7ea72447df165f9d6cc7f98f3b9a03d 100644 (file)
@@ -6235,6 +6235,23 @@ substitutions in regular expression maps. </p>
 <p> This feature is available in Postfix 2.3 and later. </p>
 
 
+</DD>
+
+<DT><b><a name="maillog_file">maillog_file</a>
+(default: empty)</b></DT><DD>
+
+<p> The name of an optional logfile that is written by the Postfix
+<a href="postlogd.8.html">postlogd(8)</a> service. A non-empty value disables logging to syslogd(8).
+Specify "/dev/stdout" for logging to standard output. Stdout logging
+requires that Postfix is started with "postfix start-fg".  </p>
+
+<p> Note: Some Postfix non-daemon programs may still log information
+to syslogd(8), before they have processed their configuration
+parameters and command-line options. </p>
+
+<p> This feature is available in Postfix 3.4 and later. </p>
+
+
 </DD>
 
 <DT><b><a name="mailq_path">mailq_path</a>
@@ -7619,6 +7636,36 @@ is rejected by the <b><a href="postconf.5.html#reject_plaintext_session">reject_
 <p> This feature is available in Postfix 2.3 and later. </p>
 
 
+</DD>
+
+<DT><b><a name="postlog_service_name">postlog_service_name</a>
+(default: postlog)</b></DT><DD>
+
+<p> The name of the <a href="postlogd.8.html">postlogd(8)</a> service entry in <a href="master.5.html">master.cf</a>.
+This service appends logfile records to the file specified
+with the <a href="postconf.5.html#maillog_file">maillog_file</a> parameter. </p>
+
+<p> This feature is available in Postfix 3.4 and later. </p>
+
+
+</DD>
+
+<DT><b><a name="postlogd_watchdog_timeout">postlogd_watchdog_timeout</a>
+(default: 10s)</b></DT><DD>
+
+<p> How much time a <a href="postlogd.8.html">postlogd(8)</a> process may take to process a request
+before it is terminated by a built-in watchdog timer. This is a
+safety mechanism that prevents <a href="postlogd.8.html">postlogd(8)</a> from becoming non-responsive
+due to a bug in Postfix itself or in system software. This limit
+cannot be set under 10s. </p>
+
+<p> Specify a non-zero time value (an integral value plus an optional
+one-letter suffix that specifies the time unit).  Time units: s
+(seconds), m (minutes), h (hours), d (days), w (weeks).  </p>
+
+<p> This feature is available in Postfix 3.4 and later.  </p>
+
+
 </DD>
 
 <DT><b><a name="postmulti_control_commands">postmulti_control_commands</a>
@@ -19439,7 +19486,7 @@ cannot be set under 10s.  </p>
 one-letter suffix that specifies the time unit).  Time units: s
 (seconds), m (minutes), h (hours), d (days), w (weeks).  </p>
 
-<p> This feature is available in Postfix 2.8.  </p>
+<p> This feature is available in Postfix 2.8 and later  </p>
 
 
 </DD>
index 99443263235ac0bfa51e9d48f00d93ec961c0b1a..9d73c335be2c141c25141e1b553dc16ff89f8e2e 100644 (file)
@@ -60,16 +60,18 @@ POSTDROP(1)                                                        POSTDROP(1)
 
        <b><a href="postconf.5.html#alternate_config_directories">alternate_config_directories</a> (empty)</b>
               A list of non-default Postfix configuration directories that may
-              be  specified with "-c <a href="postconf.5.html#config_directory">config_directory</a>" on the command line, or
-              via the MAIL_CONFIG environment parameter.
+              be  specified with "-c <a href="postconf.5.html#config_directory">config_directory</a>" on the command line (in
+              the case of <a href="sendmail.1.html"><b>sendmail</b>(1)</a>, with  the  "-C"  option),  or  via  the
+              MAIL_CONFIG environment parameter.
 
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The default location of the Postfix <a href="postconf.5.html">main.cf</a> and  <a href="master.5.html">master.cf</a>  con-
+              The  default  location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
               figuration files.
 
        <b><a href="postconf.5.html#import_environment">import_environment</a> (see 'postconf -d' output)</b>
-              The  list  of environment parameters that a Postfix process will
-              import from a non-Postfix parent process.
+              The list of environment parameters  that  a  privileged  Postfix
+              process  will  import  from  a  non-Postfix  parent  process, or
+              name=value environment overrides.
 
        <b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
               The location of the Postfix top-level queue directory.
index 18448053c0105f2828891ed55f4de88796559423..9b90c23df641b17766f1e9f34ecf7d84d716d5c7 100644 (file)
@@ -208,6 +208,8 @@ the following convention:  </p>
 
 <li> <a href="pipe.8.html">pipe(8)</a>, deliver mail to non-Postfix command 
 
+<li> <a href="postlogd.8.html">postlogd(8)</a>, Postfix internal logging service 
+
 <li> <a href="postscreen.8.html">postscreen(8)</a>, Postfix zombie blocker 
 
 <li> <a href="proxymap.8.html">proxymap(8)</a>, Postfix lookup table proxy server 
index c7514f37747eedd5834661d4f8aef98e8f84929e..aeec1c36c735d68b979eacee3e4a8ed07455902c 100644 (file)
@@ -141,12 +141,23 @@ POSTFIX(1)                                                          POSTFIX(1)
        <b>MAIL_DEBUG</b>
               This is set when the -D command-line option is present.
 
+       When  the  internal  logging service is enabled (by setting a non-empty
+       <a href="postconf.5.html#maillog_file">maillog_file</a> parameter value) the <a href="postfix.1.html">postfix(1)</a> command  exports  settings
+       that  are used by child processes before they have processed <a href="postconf.5.html">main.cf</a> or
+       command-line settings.
+
+       <b>POSTLOG_SERVICE</b>
+              The name of the public postlog service endpoint.
+
+       <b>POSTLOG_HOSTNAME</b>
+              The hostname to prepend to internal logging.
+
 <b>CONFIGURATION PARAMETERS</b>
        The following <a href="postconf.5.html"><b>main.cf</b></a> configuration parameters are exported as environ-
        ment variables with the same names:
 
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The default location of the Postfix <a href="postconf.5.html">main.cf</a> and  <a href="master.5.html">master.cf</a>  con-
+              The  default  location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
               figuration files.
 
        <b><a href="postconf.5.html#command_directory">command_directory</a> (see 'postconf -d' output)</b>
@@ -156,22 +167,22 @@ POSTFIX(1)                                                          POSTFIX(1)
               The directory with Postfix support programs and daemon programs.
 
        <b><a href="postconf.5.html#html_directory">html_directory</a> (see 'postconf -d' output)</b>
-              The location of Postfix HTML files that describe how  to  build,
+              The  location  of Postfix HTML files that describe how to build,
               configure or operate a specific Postfix subsystem or feature.
 
        <b><a href="postconf.5.html#mail_owner">mail_owner</a> (postfix)</b>
-              The  UNIX  system  account  that owns the Postfix queue and most
+              The UNIX system account that owns the  Postfix  queue  and  most
               Postfix daemon processes.
 
        <b><a href="postconf.5.html#mailq_path">mailq_path</a> (see 'postconf -d' output)</b>
-              Sendmail compatibility feature that specifies where the  Postfix
+              Sendmail  compatibility feature that specifies where the Postfix
               <a href="mailq.1.html"><b>mailq</b>(1)</a> command is installed.
 
        <b><a href="postconf.5.html#manpage_directory">manpage_directory</a> (see 'postconf -d' output)</b>
               Where the Postfix manual pages are installed.
 
        <b><a href="postconf.5.html#newaliases_path">newaliases_path</a> (see 'postconf -d' output)</b>
-              Sendmail  compatibility  feature  that specifies the location of
+              Sendmail compatibility feature that specifies  the  location  of
               the <a href="newaliases.1.html"><b>newaliases</b>(1)</a> command.
 
        <b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
@@ -182,31 +193,31 @@ POSTFIX(1)                                                          POSTFIX(1)
               configure or operate a specific Postfix subsystem or feature.
 
        <b><a href="postconf.5.html#sendmail_path">sendmail_path</a> (see 'postconf -d' output)</b>
-              A  Sendmail compatibility feature that specifies the location of
+              A Sendmail compatibility feature that specifies the location  of
               the Postfix <a href="sendmail.1.html"><b>sendmail</b>(1)</a> command.
 
        <b><a href="postconf.5.html#setgid_group">setgid_group</a> (postdrop)</b>
-              The  group  ownership  of  set-gid  Postfix  commands   and   of
+              The   group   ownership  of  set-gid  Postfix  commands  and  of
               group-writable Postfix directories.
 
        Available in Postfix version 2.5 and later:
 
        <b><a href="postconf.5.html#data_directory">data_directory</a> (see 'postconf -d' output)</b>
-              The  directory  with  Postfix-writable  data files (for example:
+              The directory with Postfix-writable  data  files  (for  example:
               caches, pseudo-random numbers).
 
        Available in Postfix version 3.0 and later:
 
        <b><a href="postconf.5.html#meta_directory">meta_directory</a> (see 'postconf -d' output)</b>
-              The location of non-executable files that are shared among  mul-
-              tiple  Postfix instances, such as postfix-files, dynamicmaps.cf,
-              and the multi-instance template  files  <a href="postconf.5.html">main.cf</a>.proto  and  <a href="master.5.html">mas-
+              The  location of non-executable files that are shared among mul-
+              tiple Postfix instances, such as postfix-files,  dynamicmaps.cf,
+              and  the  multi-instance  template  files <a href="postconf.5.html">main.cf</a>.proto and <a href="master.5.html">mas-
               ter.cf</a>.proto.
 
        <b><a href="postconf.5.html#shlib_directory">shlib_directory</a> (see 'postconf -d' output)</b>
-              The  location  of Postfix dynamically-linked libraries (libpost-
-              fix-*.so), and the default location of Postfix database  plugins
-              (postfix-*.so)  that  have  a  relative  pathname  in the dynam-
+              The location of Postfix dynamically-linked  libraries  (libpost-
+              fix-*.so),  and the default location of Postfix database plugins
+              (postfix-*.so) that have  a  relative  pathname  in  the  dynam-
               icmaps.cf file.
 
        Available in Postfix version 3.1 and later:
@@ -217,29 +228,29 @@ POSTFIX(1)                                                          POSTFIX(1)
        Other configuration parameters:
 
        <b><a href="postconf.5.html#import_environment">import_environment</a> (see 'postconf -d' output)</b>
-              The list of environment parameters  that  a  privileged  Postfix
-              process  will  import  from  a  non-Postfix  parent  process, or
+              The  list  of  environment  parameters that a privileged Postfix
+              process will  import  from  a  non-Postfix  parent  process,  or
               name=value environment overrides.
 
        <b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
               The syslog facility of Postfix logging.
 
        <b><a href="postconf.5.html#syslog_name">syslog_name</a> (see 'postconf -d' output)</b>
-              A prefix that  is  prepended  to  the  process  name  in  syslog
+              A  prefix  that  is  prepended  to  the  process  name in syslog
               records, so that, for example, "smtpd" becomes "prefix/smtpd".
 
        Available in Postfix version 2.6 and later:
 
        <b><a href="postconf.5.html#multi_instance_directories">multi_instance_directories</a> (empty)</b>
-              An  optional  list of non-default Postfix configuration directo-
-              ries; these directories belong to additional  Postfix  instances
-              that  share  the Postfix executable files and documentation with
-              the default Postfix instance, and  that  are  started,  stopped,
+              An optional list of non-default Postfix  configuration  directo-
+              ries;  these  directories belong to additional Postfix instances
+              that share the Postfix executable files and  documentation  with
+              the  default  Postfix  instance,  and that are started, stopped,
               etc., together with the default Postfix instance.
 
        <b><a href="postconf.5.html#multi_instance_wrapper">multi_instance_wrapper</a> (empty)</b>
-              The  pathname of a multi-instance manager command that the <a href="postfix.1.html"><b>post-</b></a>
-              <a href="postfix.1.html"><b>fix</b>(1)</a>  command  invokes  when  the   <a href="postconf.5.html#multi_instance_directories">multi_instance_directories</a>
+              The pathname of a multi-instance manager command that the  <a href="postfix.1.html"><b>post-</b></a>
+              <a href="postfix.1.html"><b>fix</b>(1)</a>   command  invokes  when  the  <a href="postconf.5.html#multi_instance_directories">multi_instance_directories</a>
               parameter value is non-empty.
 
        <b><a href="postconf.5.html#multi_instance_group">multi_instance_group</a> (empty)</b>
@@ -249,9 +260,18 @@ POSTFIX(1)                                                          POSTFIX(1)
               The optional instance name of this Postfix instance.
 
        <b><a href="postconf.5.html#multi_instance_enable">multi_instance_enable</a> (no)</b>
-              Allow  this  Postfix instance to be started, stopped, etc., by a
+              Allow this Postfix instance to be started, stopped, etc.,  by  a
               multi-instance manager.
 
+       Available in Postfix version 3.4 and later:
+
+       <b><a href="postconf.5.html#maillog_file">maillog_file</a> (empty)</b>
+              The  name  of an optional logfile that is written by the Postfix
+              <a href="postlogd.8.html"><b>postlogd</b>(8)</a> service.
+
+       <b><a href="postconf.5.html#postlog_service_name">postlog_service_name</a> (postlog)</b>
+              The name of the <a href="postlogd.8.html"><b>postlogd</b>(8)</a> service entry in <a href="master.5.html">master.cf</a>.
+
 <b>FILES</b>
        Prior to Postfix version 2.6, all of the following files were in  <b>$<a href="postconf.5.html#config_directory">con</a>-</b>
        <b><a href="postconf.5.html#config_directory">fig_directory</a></b>. Some files are now in <b>$<a href="postconf.5.html#daemon_directory">daemon_directory</a></b> so that they can
@@ -328,6 +348,7 @@ POSTFIX(1)                                                          POSTFIX(1)
        <a href="qmgr.8.html">oqmgr(8)</a>, old Postfix queue manager
        <a href="pickup.8.html">pickup(8)</a>, Postfix local mail pickup
        <a href="pipe.8.html">pipe(8)</a>, deliver mail to non-Postfix command
+       <a href="postlogd.8.html">postlogd(8)</a>, Postfix internal logging service
        <a href="postscreen.8.html">postscreen(8)</a>, Postfix zombie blocker
        <a href="proxymap.8.html">proxymap(8)</a>, Postfix lookup table proxy server
        <a href="qmgr.8.html">qmgr(8)</a>, Postfix queue manager
index bf3b0ad5a24301f619ed26d1cea320712bc77adf..672de9f5839cceb674c882d3d3bf5f692a2de296 100644 (file)
@@ -20,8 +20,8 @@ POSTLOG(1)                                                          POSTLOG(1)
        record.  If  no <i>text</i> is specified on the command line, <a href="postlog.1.html"><b>postlog</b>(1)</a> reads
        from standard input and logs each input line as one record.
 
-       Logging is sent to <b>syslogd</b>(8); when the standard error stream  is  con-
-       nected to a terminal, logging is sent there as well.
+       By default, logging is sent to  <b>syslogd</b>(8);  when  the  standard  error
+       stream is connected to a terminal, logging is sent there as well.
 
        The following options are implemented:
 
@@ -29,19 +29,21 @@ POSTLOG(1)                                                          POSTLOG(1)
               Read  the  <a href="postconf.5.html"><b>main.cf</b></a>  configuration  file  in  the named directory
               instead of the default configuration directory.
 
-       <b>-i</b>     Include the process ID in the logging tag.
+       <b>-i</b> (obsolete)
+              Include the process ID in the logging tag. This flag is  ignored
+              as of Postfix 3.4, where the PID is always included.
 
        <b>-p</b> <i>priority</i> (default: <b>info</b>)
-              Specifies the logging severity: <b>info</b>,  <b>warn</b>,  <b>error</b>,  <b>fatal</b>,  or
-              <b>panic</b>.  With Postfix 3.1 and later, the program will pause for 1
-              second after reporting a <b>fatal</b> or  <b>panic</b>  condition,  just  like
+              Specifies  the  logging  severity:  <b>info</b>, <b>warn</b>, <b>error</b>, <b>fatal</b>, or
+              <b>panic</b>. With Postfix 3.1 and later, the program will pause for  1
+              second  after  reporting  a  <b>fatal</b> or <b>panic</b> condition, just like
               other Postfix programs.
 
-       <b>-t</b> <i>tag</i> Specifies  the  logging  tag, that is, the identifying name that
-              appears at the beginning of each logging record. A  default  tag
+       <b>-t</b> <i>tag</i> Specifies the logging tag, that is, the  identifying  name  that
+              appears  at  the beginning of each logging record. A default tag
               is used when none is specified.
 
-       <b>-v</b>     Enable  verbose  logging  for  debugging  purposes.  Multiple <b>-v</b>
+       <b>-v</b>     Enable verbose  logging  for  debugging  purposes.  Multiple  <b>-v</b>
               options make the software increasingly verbose.
 
 <b>ENVIRONMENT</b>
@@ -49,31 +51,41 @@ POSTLOG(1)                                                          POSTLOG(1)
               Directory with the <a href="postconf.5.html"><b>main.cf</b></a> file.
 
 <b>CONFIGURATION PARAMETERS</b>
-       The following <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant to  this  pro-
+       The  following  <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant to this pro-
        gram.
 
-       The  text  below provides only a parameter summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for
+       The text below provides only a parameter summary. See  <a href="postconf.5.html"><b>postconf</b>(5)</a>  for
        more details including examples.
 
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The default location of the Postfix <a href="postconf.5.html">main.cf</a> and  <a href="master.5.html">master.cf</a>  con-
+              The  default  location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
               figuration files.
 
        <b><a href="postconf.5.html#import_environment">import_environment</a> (see 'postconf -d' output)</b>
-              The  list  of  environment  parameters that a privileged Postfix
-              process will  import  from  a  non-Postfix  parent  process,  or
+              The list of environment parameters  that  a  privileged  Postfix
+              process  will  import  from  a  non-Postfix  parent  process, or
               name=value environment overrides.
 
        <b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
               The syslog facility of Postfix logging.
 
        <b><a href="postconf.5.html#syslog_name">syslog_name</a> (see 'postconf -d' output)</b>
-              A  prefix  that  is  prepended  to  the  process  name in syslog
+              A prefix that  is  prepended  to  the  process  name  in  syslog
               records, so that, for example, "smtpd" becomes "prefix/smtpd".
 
+       Available in Postfix 3.4 and later:
+
+       <b><a href="postconf.5.html#maillog_file">maillog_file</a> (empty)</b>
+              The  name  of an optional logfile that is written by the Postfix
+              <a href="postlogd.8.html"><b>postlogd</b>(8)</a> service.
+
+       <b><a href="postconf.5.html#postlog_service_name">postlog_service_name</a> (postlog)</b>
+              The name of the <a href="postlogd.8.html"><b>postlogd</b>(8)</a> service entry in <a href="master.5.html">master.cf</a>.
+
 <b>SEE ALSO</b>
        <a href="postconf.5.html">postconf(5)</a>, configuration parameters
        syslogd(8), syslog daemon
+       <a href="postlogd.8.html">postlogd(8)</a>, internal logging service
 
 <b>LICENSE</b>
        The Secure Mailer license must be distributed with this software.
diff --git a/postfix/html/postlogd.8.html b/postfix/html/postlogd.8.html
new file mode 100644 (file)
index 0000000..d41c554
--- /dev/null
@@ -0,0 +1,87 @@
+<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html> <head>
+<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
+<title> Postfix manual - postlogd(8) </title>
+</head> <body> <pre>
+POSTLOGD(8)                                                        POSTLOGD(8)
+
+<b>NAME</b>
+       postlogd - Postfix internal log server
+
+<b>SYNOPSIS</b>
+       <b>postlogd</b> [generic Postfix daemon options]
+
+<b>DESCRIPTION</b>
+       This program logs events on behalf of Postfix programs when the maillog
+       configuration parameter specifies a non-empty value.
+
+<b>BUGS</b>
+       Non-daemon Postfix programs don't know that  they  should  log  to  the
+       internal  logging  service  before  they  have  processed  command-line
+       options and <a href="postconf.5.html">main.cf</a> parameters. These programs still log earlier events
+       to the syslog service.
+
+       If  Postfix  is down, the non-daemon programs <a href="postfix.1.html"><b>postfix</b>(1)</a>, <a href="postsuper.1.html"><b>postsuper</b>(1)</a>,
+       <a href="postmulti.1.html"><b>postmulti</b>(1)</a>, and <a href="postlog.1.html"><b>postlog</b>(1)</a>, will log directly to <b>$<a href="postconf.5.html#maillog_file">maillog_file</a></b>. These
+       programs expect to run with root privileges, for example during Postfix
+       start-up, reload, or shutdown.
+
+       Other non-daemon Postfix programs will never write directly  to  <b>$<a href="postconf.5.html#maillog_file">mail</a>-</b>
+       <b><a href="postconf.5.html#maillog_file">log_file</a></b> (also, logging to stdout would interfere with the operation of
+       some of these programs). These programs can log to <a href="postlogd.8.html"><b>postlogd</b>(8)</a> if  they
+       are run by the super-user, or if their executable file has set-gid per-
+       mission. Do not set this permision on programs other  than  <a href="postdrop.1.html"><b>postdrop</b>(1)</a>
+       and <a href="postqueue.1.html"><b>postqueue</b>(1)</a>.
+
+<b>CONFIGURATION PARAMETERS</b>
+       Changes  to  <a href="postconf.5.html"><b>main.cf</b></a>  are  picked up automatically, as <a href="postlogd.8.html"><b>postlogd</b>(8)</a> pro-
+       cesses run for only a limited amount of time. Use the command  "<b>postfix</b>
+       <b>reload</b>" to speed up a change.
+
+       The  text  below provides only a parameter summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for
+       more details including examples.
+
+       <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
+              The default location of the Postfix <a href="postconf.5.html">main.cf</a> and  <a href="master.5.html">master.cf</a>  con-
+              figuration files.
+
+       <b><a href="postconf.5.html#maillog_file">maillog_file</a> (empty)</b>
+              The  name  of an optional logfile that is written by the Postfix
+              <a href="postlogd.8.html"><b>postlogd</b>(8)</a> service.
+
+       <b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
+              The process ID of a Postfix command or daemon process.
+
+       <b><a href="postconf.5.html#process_name">process_name</a> (read-only)</b>
+              The process name of a Postfix command or daemon process.
+
+       <b><a href="postconf.5.html#syslog_name">syslog_name</a> (see 'postconf -d' output)</b>
+              A prefix that  is  prepended  to  the  process  name  in  syslog
+              records, so that, for example, "smtpd" becomes "prefix/smtpd".
+
+       <b><a href="postconf.5.html#service_name">service_name</a> (read-only)</b>
+              The <a href="master.5.html">master.cf</a> service name of a Postfix daemon process.
+
+       <b><a href="postconf.5.html#postlogd_watchdog_timeout">postlogd_watchdog_timeout</a> (10s)</b>
+              How  much  time  a  <a href="postlogd.8.html"><b>postlogd</b>(8)</a>  process  may  take to process a
+              request before it is terminated by a built-in watchdog timer.
+
+<b>SEE ALSO</b>
+       <a href="postconf.5.html">postconf(5)</a>, configuration parameters
+       syslogd(5), system logging
+
+<b>LICENSE</b>
+       The Secure Mailer license must be distributed with this software.
+
+<b>HISTORY</b>
+       This service was introduced with Postfix version 3.4.
+
+<b>AUTHOR(S)</b>
+       Wietse Venema
+       Google, Inc.
+       111 8th Avenue
+       New York, NY 10011, USA
+
+                                                                   POSTLOGD(8)
+</pre> </body> </html>
index c7c1f1570105bae36bdfad5b52dfde10726a3531..0115b9fd83faff09e9d1324b17ab6b264e174df9 100644 (file)
@@ -399,5 +399,10 @@ POSTMULTI(1)                                                      POSTMULTI(1)
        P.O. Box 704
        Yorktown Heights, NY 10598, USA
 
+       Wietse Venema
+       Google, Inc.
+       111 8th Avenue
+       New York, NY 10011, USA
+
                                                                   POSTMULTI(1)
 </pre> </body> </html>
index 4fba8b61de4c2482e7e7262e4c2245d3457a26ce..f98402ca9a8844f32deb3ff3a301e28af364b022 100644 (file)
@@ -8,7 +8,7 @@ DAEMONS = man8/bounce.8 man8/defer.8 man8/cleanup.8 man8/error.8 man8/local.8 \
        man8/oqmgr.8 man8/spawn.8 man8/flush.8 man8/virtual.8 man8/qmqpd.8 \
        man8/verify.8 man8/trace.8 man8/proxymap.8 man8/anvil.8 \
        man8/scache.8 man8/discard.8 man8/tlsmgr.8 man8/postscreen.8 \
-       man8/dnsblog.8 man8/tlsproxy.8
+       man8/dnsblog.8 man8/tlsproxy.8 man8/postlogd.8
 COMMANDS= man1/postalias.1 man1/postcat.1 man1/postconf.1 man1/postfix.1 \
        man1/postkick.1 man1/postlock.1 man1/postlog.1 man1/postdrop.1 \
        man1/postmap.1 man1/postmulti.1 man1/postqueue.1 man1/postsuper.1 \
@@ -109,6 +109,11 @@ man8/pipe.8: ../src/pipe/pipe.c
            (cmp -s junk $? || mv junk $?) && rm -f junk
        ../mantools/srctoman $? >$@
 
+man8/postlogd.8: ../src/postlogd/postlogd.c
+       ../mantools/fixman ../proto/postconf.proto $? >junk && \
+           (cmp -s junk $? || mv junk $?) && rm -f junk
+       ../mantools/srctoman $? >$@
+
 man8/postscreen.8: ../src/postscreen/postscreen.c
        ../mantools/fixman ../proto/postconf.proto $? >junk && \
            (cmp -s junk $? || mv junk $?) && rm -f junk
index 483c0a474aa93254d5d56a3d2cf69c6d7a6e2d72..674b0e57c3a32b2f435a40dc386eb13b7c42630d 100644 (file)
@@ -70,14 +70,16 @@ The text below provides only a parameter summary. See
 \fBpostconf\fR(5) for more details including examples.
 .IP "\fBalternate_config_directories (empty)\fR"
 A list of non\-default Postfix configuration directories that may
-be specified with "\-c config_directory" on the command line, or
-via the MAIL_CONFIG environment parameter.
+be specified with "\-c config_directory" on the command line (in the
+case of \fBsendmail\fR(1), with the "\-C" option), or via the MAIL_CONFIG
+environment parameter.
 .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
 The default location of the Postfix main.cf and master.cf
 configuration files.
 .IP "\fBimport_environment (see 'postconf -d' output)\fR"
-The list of environment parameters that a Postfix process will
-import from a non\-Postfix parent process.
+The list of environment parameters that a privileged Postfix
+process will import from a non\-Postfix parent process, or name=value
+environment overrides.
 .IP "\fBqueue_directory (see 'postconf -d' output)\fR"
 The location of the Postfix top\-level queue directory.
 .IP "\fBsyslog_facility (mail)\fR"
index 01c972e88a791a19d425948342c0b5921a934562..bc5775a62b135ca20249f1c090279356f9a1550c 100644 (file)
@@ -136,6 +136,15 @@ commands that run as a descendant of the current process.
 This is set when the \-v command\-line option is present.
 .IP \fBMAIL_DEBUG\fR
 This is set when the \-D command\-line option is present.
+.PP
+When the internal logging service is enabled (by setting a
+non\-empty maillog_file parameter value) the postfix(1)
+command exports settings that are used by child processes
+before they have processed main.cf or command\-line settings.
+.IP \fBPOSTLOG_SERVICE
+The name of the public postlog service endpoint.
+.IP \fBPOSTLOG_HOSTNAME
+The hostname to prepend to internal logging.
 .SH "CONFIGURATION PARAMETERS"
 .na
 .nf
@@ -225,6 +234,13 @@ The optional instance name of this Postfix instance.
 .IP "\fBmulti_instance_enable (no)\fR"
 Allow this Postfix instance to be started, stopped, etc., by a
 multi\-instance manager.
+.PP
+Available in Postfix version 3.4 and later:
+.IP "\fBmaillog_file (empty)\fR"
+The name of an optional logfile that is written by the Postfix
+\fBpostlogd\fR(8) service.
+.IP "\fBpostlog_service_name (postlog)\fR"
+The name of the \fBpostlogd\fR(8) service entry in master.cf.
 .SH "FILES"
 .na
 .nf
@@ -310,6 +326,7 @@ master(8), Postfix master daemon
 oqmgr(8), old Postfix queue manager
 pickup(8), Postfix local mail pickup
 pipe(8), deliver mail to non\-Postfix command
+postlogd(8), Postfix internal logging service
 postscreen(8), Postfix zombie blocker
 proxymap(8), Postfix lookup table proxy server
 qmgr(8), Postfix queue manager
index 10b1eb8265a41791f906c17f2eb09b289bd50ebe..435c49bdc76da0dc932d529d8e4fdaa7d7222f92 100644 (file)
@@ -23,15 +23,17 @@ line as one record. If no \fItext\fR is specified on the command
 line, \fBpostlog\fR(1) reads from standard input and logs each input
 line as one record.
 
-Logging is sent to \fBsyslogd\fR(8); when the standard error stream
-is connected to a terminal, logging is sent there as well.
+By default, logging is sent to \fBsyslogd\fR(8); when the
+standard error stream is connected to a terminal, logging
+is sent there as well.
 
 The following options are implemented:
 .IP "\fB\-c \fIconfig_dir\fR"
 Read the \fBmain.cf\fR configuration file in the named directory
 instead of the default configuration directory.
-.IP \fB\-i\fR
-Include the process ID in the logging tag.
+.IP "\fB\-i\fR (obsolete)"
+Include the process ID in the logging tag. This flag is ignored as
+of Postfix 3.4, where the PID is always included.
 .IP "\fB\-p \fIpriority\fR (default: \fBinfo\fR)"
 Specifies the logging severity: \fBinfo\fR, \fBwarn\fR,
 \fBerror\fR, \fBfatal\fR, or \fBpanic\fR. With Postfix 3.1
@@ -74,11 +76,19 @@ The syslog facility of Postfix logging.
 .IP "\fBsyslog_name (see 'postconf -d' output)\fR"
 A prefix that is prepended to the process name in syslog
 records, so that, for example, "smtpd" becomes "prefix/smtpd".
+.PP
+Available in Postfix 3.4 and later:
+.IP "\fBmaillog_file (empty)\fR"
+The name of an optional logfile that is written by the Postfix
+\fBpostlogd\fR(8) service.
+.IP "\fBpostlog_service_name (postlog)\fR"
+The name of the \fBpostlogd\fR(8) service entry in master.cf.
 .SH "SEE ALSO"
 .na
 .nf
 postconf(5), configuration parameters
 syslogd(8), syslog daemon
+postlogd(8), internal logging service
 .SH "LICENSE"
 .na
 .nf
index 4a35947ff55379812dca2e93346c03e56bd2079b..ad04dea1e91cb80cc7490b4bc1268f1339949094 100644 (file)
@@ -427,3 +427,8 @@ Wietse Venema
 IBM T.J. Watson Research
 P.O. Box 704
 Yorktown Heights, NY 10598, USA
+
+Wietse Venema
+Google, Inc.
+111 8th Avenue
+New York, NY 10011, USA
index d37173b1c7ca2822f0e5609a38cf0cca6d0ac161..008181f8431042780a23c2dc5849e602880139ea 100644 (file)
@@ -85,8 +85,8 @@ Note: with Postfix version 2.2 and later specify
 of hard\-coding loopback IP address information in master.cf
 or in main.cf.
 .IP \fBunix\fR
-The service listens on a UNIX\-domain socket and is accessible
-for local clients only.
+The service listens on a UNIX\-domain stream socket and is
+accessible for local clients only.
 
 The service name is a pathname relative to the Postfix
 queue directory (pathname controlled with the \fBqueue_directory\fR
@@ -94,7 +94,14 @@ configuration parameter in main.cf).
 .sp
 On Solaris 8 and earlier systems the \fBunix\fR type is
 implemented with streams sockets.
-.IP \fBfifo\fR
+.IP \fBunix\-dgram\fR
+The service listens on a UNIX\-domain datagram socket and is
+accessible for local clients only.
+
+The service name is a pathname relative to the Postfix
+queue directory (pathname controlled with the \fBqueue_directory\fR
+configuration parameter in main.cf).
+.IP "\fBfifo\fR (obsolete)"
 The service listens on a FIFO (named pipe) and is accessible
 for local clients only.
 
@@ -102,9 +109,9 @@ The service name is a pathname relative to the Postfix
 queue directory (pathname controlled with the \fBqueue_directory\fR
 configuration parameter in main.cf).
 .IP \fBpass\fR
-The service listens on a UNIX\-domain socket, and is accessible
-to local clients only. It receives one open connection (file
-descriptor passing) per connection request.
+The service listens on a UNIX\-domain stream socket, and is
+accessible to local clients only. It receives one open
+connection (file descriptor passing) per connection request.
 
 The service name is a pathname relative to the Postfix
 queue directory (pathname controlled with the \fBqueue_directory\fR
index 7263bbda8657f79c9e98ba056327024f7b210fd3..fa01f867ac3c4eec71432d02a69ec01baa9caff4 100644 (file)
@@ -3748,6 +3748,17 @@ For safety reasons, this feature does not allow $number
 substitutions in regular expression maps.
 .PP
 This feature is available in Postfix 2.3 and later.
+.SH maillog_file (default: empty)
+The name of an optional logfile that is written by the Postfix
+\fBpostlogd\fR(8) service. A non\-empty value disables logging to \fBsyslogd\fR(8).
+Specify "/dev/stdout" for logging to standard output. Stdout logging
+requires that Postfix is started with "postfix start\-fg".
+.PP
+Note: Some Postfix non\-daemon programs may still log information
+to \fBsyslogd\fR(8), before they have processed their configuration
+parameters and command\-line options.
+.PP
+This feature is available in Postfix 3.4 and later.
 .SH mailq_path (default: see "postconf \-d" output)
 Sendmail compatibility feature that specifies where the Postfix
 \fBmailq\fR(1) command is installed. This command can be used to
@@ -4640,6 +4651,24 @@ The numerical Postfix SMTP server response code when a request
 is rejected by the \fBreject_plaintext_session\fR restriction.
 .PP
 This feature is available in Postfix 2.3 and later.
+.SH postlog_service_name (default: postlog)
+The name of the \fBpostlogd\fR(8) service entry in master.cf.
+This service appends logfile records to the file specified
+with the maillog_file parameter.
+.PP
+This feature is available in Postfix 3.4 and later.
+.SH postlogd_watchdog_timeout (default: 10s)
+How much time a \fBpostlogd\fR(8) process may take to process a request
+before it is terminated by a built\-in watchdog timer. This is a
+safety mechanism that prevents \fBpostlogd\fR(8) from becoming non\-responsive
+due to a bug in Postfix itself or in system software. This limit
+cannot be set under 10s.
+.PP
+Specify a non\-zero time value (an integral value plus an optional
+one\-letter suffix that specifies the time unit).  Time units: s
+(seconds), m (minutes), h (hours), d (days), w (weeks).
+.PP
+This feature is available in Postfix 3.4 and later.
 .SH postmulti_control_commands (default: reload flush)
 The \fBpostfix\fR(1) commands that the \fBpostmulti\fR(1) instance manager
 treats as "control" commands, that operate on running instances. For
@@ -13508,7 +13537,7 @@ Specify a non\-zero time value (an integral value plus an optional
 one\-letter suffix that specifies the time unit).  Time units: s
 (seconds), m (minutes), h (hours), d (days), w (weeks).
 .PP
-This feature is available in Postfix 2.8.
+This feature is available in Postfix 2.8 and later
 .SH trace_service_name (default: trace)
 The name of the trace service. This service is implemented by the
 \fBbounce\fR(8) daemon and maintains a record
index 6594edc082df3e57801bb05b61970b3ce159b1ce..c6790ea4acfacf02880248ac4622bcd2acf86c47 100644 (file)
@@ -44,11 +44,13 @@ for debugging only.
 Terminate the master process after \fIexit_time\fR seconds. Child
 processes terminate at their convenience.
 .IP \fB\-i\fR
-Enable \fBinit\fR mode: do not attempt to become a session
-or process group leader; and to force termination, set an
-explicit signal handler instead of relying on the default
-signal action. This mode is allowed only if the process ID
-equals 1.
+Enable \fBinit\fR mode: do not become a session or process
+group leader; similar to \fB\-s\fR, do not redirect stdout
+to /dev/null, so that "maillog_file = /dev/stdout" works.
+This mode is allowed only if the process ID equals 1.
+.IP \fB\-s\fR
+Do not redirect stdout to /dev/null, so that "maillog_file
+= /dev/stdout" works.
 .IP \fB\-t\fR
 Test mode. Return a zero exit status when the \fBmaster.pid\fR lock
 file does not exist or when that file is not locked.  This is evidence
diff --git a/postfix/man/man8/postlogd.8 b/postfix/man/man8/postlogd.8
new file mode 100644 (file)
index 0000000..811b7f9
--- /dev/null
@@ -0,0 +1,92 @@
+.TH POSTLOGD 8 
+.ad
+.fi
+.SH NAME
+postlogd
+\-
+Postfix internal log server
+.SH "SYNOPSIS"
+.na
+.nf
+\fBpostlogd\fR [generic Postfix daemon options]
+.SH DESCRIPTION
+.ad
+.fi
+This program logs events on behalf of Postfix programs
+when the maillog configuration parameter specifies a non\-empty
+value.
+.SH BUGS
+.ad
+.fi
+Non\-daemon Postfix programs don't know that they should log
+to the internal logging service before they have processed
+command\-line options and main.cf parameters. These programs
+still log earlier events to the syslog service.
+
+If Postfix is down, the non\-daemon programs \fBpostfix\fR(1),
+\fBpostsuper\fR(1), \fBpostmulti\fR(1), and \fBpostlog\fR(1),
+will log directly to \fB$maillog_file\fR. These programs
+expect to run with root privileges, for example during
+Postfix start\-up, reload, or shutdown.
+
+Other non\-daemon Postfix programs will never write directly to
+\fB$maillog_file\fR (also, logging to stdout would interfere
+with the operation of some of these programs). These programs
+can log to \fBpostlogd\fR(8) if they are run by the super\-user,
+or if their executable file has set\-gid permission. Do not
+set this permision on programs other than \fBpostdrop\fR(1)
+and \fBpostqueue\fR(1).
+.SH "CONFIGURATION PARAMETERS"
+.na
+.nf
+.ad
+.fi
+Changes to \fBmain.cf\fR are picked up automatically, as
+\fBpostlogd\fR(8) processes run for only a limited amount
+of time. Use the command "\fBpostfix reload\fR" to speed
+up a change.
+
+The text below provides only a parameter summary. See
+\fBpostconf\fR(5) for more details including examples.
+.IP "\fBconfig_directory (see 'postconf -d' output)\fR"
+The default location of the Postfix main.cf and master.cf
+configuration files.
+.IP "\fBmaillog_file (empty)\fR"
+The name of an optional logfile that is written by the Postfix
+\fBpostlogd\fR(8) service.
+.IP "\fBprocess_id (read\-only)\fR"
+The process ID of a Postfix command or daemon process.
+.IP "\fBprocess_name (read\-only)\fR"
+The process name of a Postfix command or daemon process.
+.IP "\fBsyslog_name (see 'postconf -d' output)\fR"
+A prefix that is prepended to the process name in syslog
+records, so that, for example, "smtpd" becomes "prefix/smtpd".
+.IP "\fBservice_name (read\-only)\fR"
+The master.cf service name of a Postfix daemon process.
+.IP "\fBpostlogd_watchdog_timeout (10s)\fR"
+How much time a \fBpostlogd\fR(8) process may take to process a request
+before it is terminated by a built\-in watchdog timer.
+.SH "SEE ALSO"
+.na
+.nf
+postconf(5), configuration parameters
+syslogd(5), system logging
+.SH "LICENSE"
+.na
+.nf
+.ad
+.fi
+The Secure Mailer license must be distributed with this software.
+.SH HISTORY
+.ad
+.fi
+.ad
+.fi
+This service was introduced with Postfix version 3.4.
+.SH "AUTHOR(S)"
+.na
+.nf
+Wietse Venema
+Google, Inc.
+111 8th Avenue
+New York, NY 10011, USA
index 806cf1a1a3480d79c0773ce893d54fb30dc5cb0a..8cd48b2eae0a7cf0378e2b988d4ba685093b081b 100755 (executable)
@@ -811,6 +811,7 @@ while (<>) {
     s/[<bB>]*mas[-<\/bB>]*\n* *[<bB>]*ter[<\/bB>]*\(8\)/<a href="master.8.html">$&<\/a>/g;
     s/[<bB>]*pickup[<\/bB>]*\(8\)/<a href="pickup.8.html">$&<\/a>/g;
     s/[<bB>]*pipe[<\/bB>]*\(8\)/<a href="pipe.8.html">$&<\/a>/g;
+    s/[<bB>]*postlogd[<\/bB>]*\(8\)/<a href="postlogd.8.html">$&<\/a>/g;
     s/[<bB>]*postscreen[<\/bB>]*\(8\)/<a href="postscreen.8.html">$&<\/a>/g;
     s/[<bB>]*oqmgr[<\/bB>]*\(8\)/<a href="qmgr.8.html">$&<\/a>/g;
     s/[<bB>]*\bqmgr[<\/bB>]*\(8\)/<a href="qmgr.8.html">$&<\/a>/g;
@@ -1116,6 +1117,11 @@ while (<>) {
     s;\bsmtputf8_autodetect_classes\b;<a href="postconf.5.html#smtputf8_autodetect_classes">$&</a>;g;
     s;\benable_idna2003_compatibility\b;<a href="postconf.5.html#enable_idna2003_compatibility">$&</a>;g;
 
+    # Internal logging.
+    s;\bmail[-</bB>]*\n*[ <bB>]*log_file\b;<a href="postconf.5.html#maillog_file">$&</a>;g;
+    s;\bpostlog_service_name\b;<a href="postconf.5.html#postlog_service_name">$&</a>;g;
+    s;\bpostlogd_watchdog_timeout\b;<a href="postconf.5.html#postlogd_watchdog_timeout">$&</a>;g;
+
     # Service-defined parameters...
 
     s;\bpolicy_time_limit\b;<a href="postconf.5.html#transport_time_limit">$&</a>;g;
index dd4041c4d9bd0734a27df2e75beec6e7403e9135..670b800a12b75cdadf888579e5ea2a1b7068b7ac 100644 (file)
@@ -79,8 +79,8 @@
 #      of hard-coding loopback IP address information in master.cf
 #      or in main.cf.
 # .IP \fBunix\fR
-#      The service listens on a UNIX-domain socket and is accessible
-#      for local clients only.
+#      The service listens on a UNIX-domain stream socket and is
+#      accessible for local clients only.
 #
 #      The service name is a pathname relative to the Postfix
 #      queue directory (pathname controlled with the \fBqueue_directory\fR
 # .sp
 #      On Solaris 8 and earlier systems the \fBunix\fR type is
 #      implemented with streams sockets.
-# .IP \fBfifo\fR
+# .IP \fBunix-dgram\fR
+#      The service listens on a UNIX-domain datagram socket and is
+#      accessible for local clients only.
+#
+#      The service name is a pathname relative to the Postfix
+#      queue directory (pathname controlled with the \fBqueue_directory\fR
+#      configuration parameter in main.cf).
+# .IP "\fBfifo\fR (obsolete)"
 #      The service listens on a FIFO (named pipe) and is accessible
 #      for local clients only.
 #
 #      queue directory (pathname controlled with the \fBqueue_directory\fR
 #      configuration parameter in main.cf).
 # .IP \fBpass\fR
-#      The service listens on a UNIX-domain socket, and is accessible
-#      to local clients only. It receives one open connection (file
-#      descriptor passing) per connection request.
+#      The service listens on a UNIX-domain stream socket, and is
+#      accessible to local clients only. It receives one open
+#      connection (file descriptor passing) per connection request.
 #
 #      The service name is a pathname relative to the Postfix
 #      queue directory (pathname controlled with the \fBqueue_directory\fR
index 979f422c07e500820f870fce16e7e0d05675ef81..5c53add8e951f54e8855063460aebe99c21f94bf 100644 (file)
@@ -15041,7 +15041,7 @@ cannot be set under 10s.  </p>
 one-letter suffix that specifies the time unit).  Time units: s
 (seconds), m (minutes), h (hours), d (days), w (weeks).  </p>
 
-<p> This feature is available in Postfix 2.8.  </p>
+<p> This feature is available in Postfix 2.8 and later  </p>
 
 %PARAM postscreen_discard_ehlo_keywords $smtpd_discard_ehlo_keywords
 
@@ -17526,3 +17526,38 @@ as needed. </p>
 parameter. See there for details. </p>
 
 <p> This feature is available in Postfix 3.4 and later.  </p>
+
+%PARAM maillog_file
+
+<p> The name of an optional logfile that is written by the Postfix
+postlogd(8) service. A non-empty value disables logging to syslogd(8).
+Specify "/dev/stdout" for logging to standard output. Stdout logging
+requires that Postfix is started with "postfix start-fg".  </p>
+
+<p> Note: Some Postfix non-daemon programs may still log information
+to syslogd(8), before they have processed their configuration
+parameters and command-line options. </p>
+
+<p> This feature is available in Postfix 3.4 and later. </p>
+
+%PARAM postlog_service_name postlog
+
+<p> The name of the postlogd(8) service entry in master.cf. 
+This service appends logfile records to the file specified
+with the maillog_file parameter. </p>
+
+<p> This feature is available in Postfix 3.4 and later. </p>
+
+%PARAM postlogd_watchdog_timeout 10s
+
+<p> How much time a postlogd(8) process may take to process a request
+before it is terminated by a built-in watchdog timer. This is a
+safety mechanism that prevents postlogd(8) from becoming non-responsive
+due to a bug in Postfix itself or in system software. This limit
+cannot be set under 10s. </p>
+
+<p> Specify a non-zero time value (an integral value plus an optional
+one-letter suffix that specifies the time unit).  Time units: s
+(seconds), m (minutes), h (hours), d (days), w (weeks).  </p>
+
+<p> This feature is available in Postfix 3.4 and later.  </p>
index 5d809d0a2e09cd592f348cd933159180a2547bee..21caa0d975276c2fa88a5e0fc0fa1a5bc88942f7 100644 (file)
@@ -34,7 +34,7 @@ SRCS  = abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
        dict_memcache.c mail_version.c memcache_proto.c server_acl.c \
        mkmap_fail.c haproxy_srvr.c dsn_filter.c dynamicmaps.c uxtext.c \
        smtputf8.c mail_conf_over.c mail_parm_split.c midna_adomain.c \
-       mail_addr_form.c quote_flags.c
+       mail_addr_form.c quote_flags.c maillog_client.c
 OBJS   = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
        canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
        clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
@@ -70,7 +70,7 @@ OBJS  = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
        dict_memcache.o mail_version.o memcache_proto.o server_acl.o \
        mkmap_fail.o haproxy_srvr.o dsn_filter.o dynamicmaps.o uxtext.o \
        smtputf8.o attr_override.o mail_parm_split.o midna_adomain.o \
-       $(NON_PLUGIN_MAP_OBJ) mail_addr_form.o quote_flags.o
+       $(NON_PLUGIN_MAP_OBJ) mail_addr_form.o quote_flags.o maillog_client.o
 # MAP_OBJ is for maps that may be dynamically loaded with dynamicmaps.cf.
 # When hard-linking these maps, makedefs sets NON_PLUGIN_MAP_OBJ=$(MAP_OBJ),
 # otherwise it sets the PLUGIN_* macros.
@@ -103,7 +103,8 @@ HDRS        = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
        addr_match_list.h smtp_reply_footer.h safe_ultostr.h \
        verify_sender_addr.h dict_memcache.h memcache_proto.h server_acl.h \
        haproxy_srvr.h dsn_filter.h dynamicmaps.h uxtext.h smtputf8.h \
-       attr_override.h mail_parm_split.h midna_adomain.h mail_addr_form.h
+       attr_override.h mail_parm_split.h midna_adomain.h mail_addr_form.h \
+       maillog_client.h
 TESTSRC        = rec2stream.c stream2rec.c recdump.c
 DEFS   = -I. -I$(INC_DIR) -D$(SYSTYPE)
 CFLAGS = $(DEBUG) $(OPT) $(DEFS)
@@ -1909,6 +1910,26 @@ mail_version.o: ../../include/vbuf.h
 mail_version.o: ../../include/vstring.h
 mail_version.o: mail_version.c
 mail_version.o: mail_version.h
+maillog_client.o: ../../include/attr.h
+maillog_client.o: ../../include/check_arg.h
+maillog_client.o: ../../include/htable.h
+maillog_client.o: ../../include/iostuff.h
+maillog_client.o: ../../include/logwriter.h
+maillog_client.o: ../../include/msg.h
+maillog_client.o: ../../include/msg_logger.h
+maillog_client.o: ../../include/msg_syslog.h
+maillog_client.o: ../../include/mymalloc.h
+maillog_client.o: ../../include/nvtable.h
+maillog_client.o: ../../include/safe.h
+maillog_client.o: ../../include/stringops.h
+maillog_client.o: ../../include/sys_defs.h
+maillog_client.o: ../../include/vbuf.h
+maillog_client.o: ../../include/vstream.h
+maillog_client.o: ../../include/vstring.h
+maillog_client.o: mail_params.h
+maillog_client.o: mail_proto.h
+maillog_client.o: maillog_client.c
+maillog_client.o: maillog_client.h
 maps.o: ../../include/argv.h
 maps.o: ../../include/check_arg.h
 maps.o: ../../include/dict.h
index 203e52feaae3314c5eb3b1b5a7435b1f75884cbb..a504cce053f04a11b82c35f19e53ac34575d138c 100644 (file)
 /*     int     warn_compat_break_relay_domains;
 /*     int     warn_compat_break_flush_domains;
 /*     int     warn_compat_break_mynetworks_style;
+/*
+/*     char    *var_maillog_file;
+/*     char    *var_postlog_service;
 /* DESCRIPTION
 /*     This module (actually the associated include file) defines
 /*     the names and defaults of all mail configuration parameters.
@@ -348,6 +351,9 @@ int     var_compat_level;
 char   *var_drop_hdrs;
 bool    var_enable_orcpt;
 
+char   *var_maillog_file;
+char   *var_postlog_service;
+
 const char null_format_string[1] = "";
 
  /*
@@ -670,6 +676,8 @@ void    mail_params_init()
        /* multi_instance_wrapper may have dependencies but not dependents. */
        VAR_MULTI_GROUP, DEF_MULTI_GROUP, &var_multi_group, 0, 0,
        VAR_MULTI_NAME, DEF_MULTI_NAME, &var_multi_name, 0, 0,
+       VAR_MAILLOG_FILE, DEF_MAILLOG_FILE, &var_maillog_file, 0, 0,
+       VAR_POSTLOG_SERVICE, DEF_POSTLOG_SERVICE, &var_postlog_service, 1, 0,
        0,
     };
     static const CONFIG_BOOL_TABLE first_bool_defaults[] = {
@@ -822,7 +830,7 @@ void    mail_params_init()
      */
     get_mail_conf_str_table(first_str_defaults);
 
-    if (!msg_syslog_facility(var_syslog_facility))
+    if (!msg_syslog_set_facility(var_syslog_facility))
        msg_fatal("file %s/%s: parameter %s: unrecognized value: %s",
                  var_config_dir, MAIN_CONF_FILE,
                  VAR_SYSLOG_FACILITY, var_syslog_facility);
index 2edec94fb35ad51e4432e5b1d56d35c4df6aff98..05b7fc283517c959aaa74a5ff0f0dbd429fffb3a 100644 (file)
@@ -2532,7 +2532,9 @@ extern int var_fflush_refresh;
   * and what Postfix exports to the external world.
   */
 #define VAR_IMPORT_ENVIRON             "import_environment"
-#define DEF_IMPORT_ENVIRON             "MAIL_CONFIG MAIL_DEBUG MAIL_LOGTAG TZ XAUTHORITY DISPLAY LANG=C"
+#define DEF_IMPORT_ENVIRON             "MAIL_CONFIG MAIL_DEBUG MAIL_LOGTAG " \
+                                       "TZ XAUTHORITY DISPLAY LANG=C " \
+                                       "POSTLOG_SERVICE POSTLOG_HOSTNAME"
 extern char *var_import_environ;
 
 #define VAR_EXPORT_ENVIRON             "export_environment"
@@ -4171,6 +4173,21 @@ extern int var_idna2003_compat;
 #define DEF_DNS_NCACHE_TTL_FIX         0
 extern bool var_dns_ncache_ttl_fix;
 
+ /*
+  * Logging. As systems evolve over time, logging becomes more challenging.
+  */
+#define VAR_MAILLOG_FILE       "maillog_file"
+#define DEF_MAILLOG_FILE       ""
+extern char *var_maillog_file;
+
+#define VAR_POSTLOG_SERVICE    "postlog_service_name"
+#define DEF_POSTLOG_SERVICE    MAIL_SERVICE_POSTLOG
+extern char *var_postlog_service;
+
+#define VAR_POSTLOGD_WATCHDOG  "postlogd_watchdog_timeout"
+#define DEF_POSTLOGD_WATCHDOG  "10s"
+extern int var_postlogd_watchdog;
+
 /* LICENSE
 /* .ad
 /* .fi
index 9fc9ab68eaea59784d9db152439858ed68979961..3428374e3f1ef976989fab53fdfdc63920092af2 100644 (file)
@@ -60,6 +60,7 @@
 #define MAIL_SERVICE_SCACHE    "scache"
 #define MAIL_SERVICE_DNSBLOG   "dnsblog"
 #define MAIL_SERVICE_TLSPROXY  "tlsproxy"
+#define MAIL_SERVICE_POSTLOG   "postlog"
 
  /*
   * Mail source classes. Used to specify policy decisions for content
index b1df611d40bc28acdef4e1338ab470231694e04d..543130a6e9da35696f1df590920ce959d4a51b96 100644 (file)
 /*     are easier to recognize. The mail system name is specified
 /*     with the "syslog_name" configuration parameter.
 /*
-/*     The result is volatile.  Make a copy of the result if it is
-/*     to be used for any appreciable amount of time.
+/*     The result is overwritten with each call.
+/*
+/*     A null argv0 argument requests that the current
+/*     result is returned.
 /* LICENSE
 /* .ad
 /* .fi
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System library. */
@@ -52,15 +59,17 @@ const char *mail_task(const char *argv0)
     const char *slash;
     const char *tag;
 
-    if (canon_name == 0)
-       canon_name = vstring_alloc(10);
-    if ((slash = strrchr(argv0, '/')) != 0 && slash[1])
-       argv0 = slash + 1;
-    /* Setenv()-ed from main.cf, or inherited from master. */
-    if ((tag = safe_getenv(CONF_ENV_LOGTAG)) == 0)
-       /* Check main.cf settings directly, in case set-gid. */
-       tag = var_syslog_name ? var_syslog_name :
-           mail_conf_eval(DEF_SYSLOG_NAME);
-    vstring_sprintf(canon_name, "%s/%s", tag, argv0);
+    if (argv0) {
+       if (canon_name == 0)
+           canon_name = vstring_alloc(10);
+       if ((slash = strrchr(argv0, '/')) != 0 && slash[1])
+           argv0 = slash + 1;
+       /* Setenv()-ed from main.cf, or inherited from master. */
+       if ((tag = safe_getenv(CONF_ENV_LOGTAG)) == 0)
+           /* Check main.cf settings directly, in case set-gid. */
+           tag = var_syslog_name ? var_syslog_name :
+               mail_conf_eval(DEF_SYSLOG_NAME);
+       vstring_sprintf(canon_name, "%s/%s", tag, argv0);
+    }
     return (vstring_str(canon_name));
 }
index c207852016403ed491f2c8187ddb51c0e302de63..f4675fa9581501e8cb3baae97a55984eed47aeb8 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20190127"
+#define MAIL_RELEASE_DATE      "20190129"
 #define MAIL_VERSION_NUMBER    "3.4"
 
 #ifdef SNAPSHOT
diff --git a/postfix/src/global/maillog_client.c b/postfix/src/global/maillog_client.c
new file mode 100644 (file)
index 0000000..ab8c915
--- /dev/null
@@ -0,0 +1,278 @@
+/*++
+/* NAME
+/*     maillog_client 3
+/* SUMMARY
+/*     choose between syslog client and postlog client
+/* SYNOPSIS
+/*     #include <maillog_client.h>
+/*
+/*     int     maillog_client_init(
+/*     const char *progname,
+/*     int     flags)
+/* DESCRIPTION
+/*     maillog_client_init() chooses between logging to the syslog
+/*     service or to the internal postlog service.
+/*
+/*     maillog_client_init() may be called before configuration
+/*     parameters are initialized. During this time, logging is
+/*     controlled by the presence or absence of POSTLOG_SERVICE
+/*     in the process environment (this is ignored if a program
+/*     runs with set-uid or set-gid permissions).
+/*
+/*     maillog_client_init() may also be called after configuration
+/*     parameters are initialized. During this time, logging is
+/*     controlled by the "maillog_file" parameter value.
+/*
+/*     Arguments:
+/* .IP progname
+/*     The program name that will be prepended to logfile records.
+/* .IP flags
+/*     Specify one of the following:
+/* .RS
+/* .IP MAILLOG_CLIENT_FLAG_NONE
+/*     No special processing.
+/* .IP MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK
+/*     Try to fall back to writing the "maillog_file" directly,
+/*     if logging to the internal postlog service is enabled, but
+/*     the postlog service is unavailable. If the fallback fails,
+/*     die with a fatal error.
+/* .RE
+/* ENVIRONMENT
+/* .ad
+/* .fi
+/*     When logging to the internal postlog service is enabled,
+/*     each process exports the following information, to help
+/*     initialize the logging in a child process, before the child
+/*     has initialized its configuration parameters.
+/* .IP POSTLOG_SERVICE
+/*     The pathname of the public postlog service endpoint, usually
+/*     "$queue_directory/public/$postlog_service_name".
+/* .IP POSTLOG_HOSTNAME
+/*     The hostname to prepend to information that is sent to the
+/*     internal postlog logging service, usually "$myhostname".
+/* CONFIGURATION PARAMETERS
+/* .ad
+/* .fi
+/* .IP "maillog_file (empty)"
+/*     The name of an optional logfile. If the value is empty, or
+/*     unitialized and the process environment does not specify
+/*     POSTLOG_SERVICE, the program will log to the syslog service
+/*     instead.
+/* .IP "myhostname (default: see postconf -d output)"
+/*     The internet hostname of this mail system.
+/* .IP "postlog_service_name (postlog)"
+/*     The name of the internal postlog logging service.
+/* SEE ALSO
+/*     msg_syslog(3)   syslog client
+/*     msg_logger(3)   internal logger
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this
+/*     software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+ /*
+  * System library.
+  */
+#include <sys_defs.h>
+
+ /*
+  * Utility library.
+  */
+#include <logwriter.h>
+#include <msg_logger.h>
+#include <msg_syslog.h>
+#include <safe.h>
+#include <stringops.h>
+
+ /*
+  * Global library.
+  */
+#include <mail_params.h>
+#include <mail_proto.h>
+#include <maillog_client.h>
+#include <msg.h>
+
+ /*
+  * Using logging to debug logging is painful.
+  */
+#define MAILLOG_CLIENT_DEBUG   0
+
+ /*
+  * Application-specific.
+  */
+static int maillog_client_flags;
+
+#define POSTLOG_SERVICE_ENV    "POSTLOG_SERVICE"
+#define POSTLOG_HOSTNAME_ENV   "POSTLOG_HOSTNAME"
+
+/* maillog_client_logwriter_fallback - fall back to logfile writer or bust */
+
+static void maillog_client_logwriter_fallback(const char *text)
+{
+    static int fallback_guard = 0;
+
+    /*
+     * Guard against recursive calls.
+     * 
+     * If an error happened before the maillog_file parameter was initialized,
+     * or if maillog_file logging is disabled, then we cannot fall back to a
+     * logfile. All we can do is to hope that stderr logging will bring out
+     * the bad news.
+     */
+    if (fallback_guard == 0 && var_maillog_file && *var_maillog_file
+       && logwriter_one_shot(var_maillog_file, text, strlen(text)) < 0) {
+       fallback_guard = 1;
+       msg_fatal("logfile '%s' write error: %m", var_maillog_file);
+    }
+}
+
+/* maillog_client_init - set up syslog or internal log client */
+
+void    maillog_client_init(const char *progname, int flags)
+{
+    char   *import_service_path;
+    char   *import_hostname;
+
+    /*
+     * Crucially, only one logger mode can be in effect at any time,
+     * otherwise postlogd(8) may go into a loop.
+     */
+    enum {
+       MAILLOG_CLIENT_MODE_SYSLOG, MAILLOG_CLIENT_MODE_POSTLOG,
+    }       logger_mode;
+
+    /*
+     * Security: this code may run before the import_environment setting has
+     * taken effect. It has to guard against privilege escalation attacks on
+     * setgid programs, using malicious environment settings.
+     * 
+     * Import the postlog service name and hostname from the environment.
+     * 
+     * - These will be used and kept if the process has not yet initialized its
+     * configuration parameters.
+     * 
+     * - These will be set or updated if the configuration enables postlog
+     * logging.
+     * 
+     * - These will be removed if the configuration does not enable postlog
+     * logging.
+     */
+    if ((import_service_path = safe_getenv(POSTLOG_SERVICE_ENV)) != 0
+       && *import_service_path == 0)
+       import_service_path = 0;
+    if ((import_hostname = safe_getenv(POSTLOG_HOSTNAME_ENV)) != 0
+       && *import_hostname == 0)
+       import_hostname = 0;
+
+#if MAILLOG_CLIENT_DEBUG
+#define STRING_OR_NULL(s) ((s) ? (s) : "(null)")
+    msg_syslog_init(progname, LOG_PID, LOG_FACILITY);
+    msg_info("import_service_path=%s", STRING_OR_NULL(import_service_path));
+    msg_info("import_hostname=%s", STRING_OR_NULL(import_hostname));
+#endif
+
+    /*
+     * Before configuration parameters are initialized, the logging mode is
+     * controlled by the presence or absence of POSTLOG_SERVICE in the
+     * process environment. After configuration parameters are initialized,
+     * the logging mode is controlled by the "maillog_file" parameter value.
+     * 
+     * The configured mode may change after a process is started. The
+     * postlogd(8) server will proxy logging to syslogd where needed.
+     */
+    if (var_maillog_file ? *var_maillog_file == 0 : import_service_path == 0) {
+       logger_mode = MAILLOG_CLIENT_MODE_SYSLOG;
+    } else {
+       /* var_maillog_file ? *var_maillog_file : import_service_path != 0 */
+       logger_mode = MAILLOG_CLIENT_MODE_POSTLOG;
+    }
+
+    /*
+     * Postlog logging is enabled. Update the 'progname' as that may have
+     * changed since an earlier call, and update the environment settings if
+     * they differ from configuration settings. This blends two code paths,
+     * one code path where configuration parameters are initialized (the
+     * preferred path), and one code path that uses imports from environment.
+     */
+    if (logger_mode == MAILLOG_CLIENT_MODE_POSTLOG) {
+       char   *myhostname;
+       char   *service_path;
+
+       if (var_myhostname && *var_myhostname) {
+           myhostname = var_myhostname;
+       } else if ((myhostname = import_hostname) == 0) {
+           myhostname = "amnesiac";
+       }
+#if MAILLOG_CLIENT_DEBUG
+       msg_info("myhostname=%s", STRING_OR_NULL(myhostname));
+#endif
+       if (var_postlog_service) {
+           service_path = concatenate(var_queue_dir, "/", MAIL_CLASS_PUBLIC,
+                                      "/", var_postlog_service, (char *) 0);
+       } else {
+           service_path = import_service_path;
+       }
+       maillog_client_flags = flags;
+       msg_logger_init(progname, myhostname, service_path,
+                       (flags & MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK) ?
+                       maillog_client_logwriter_fallback :
+                       (MSG_LOGGER_FALLBACK_FN) 0);
+
+       /*
+        * Export or update the exported postlog service pathname and the
+        * hostname, so that a child process can bootstrap postlog logging
+        * before it has processed main.cf and command-line options.
+        */
+       if (import_service_path == 0
+           || strcmp(service_path, import_service_path) != 0) {
+#if MAILLOG_CLIENT_DEBUG
+           msg_info("export %s=%s", POSTLOG_SERVICE_ENV, service_path);
+#endif
+           if (setenv(POSTLOG_SERVICE_ENV, service_path, 1) < 0)
+               msg_fatal("setenv: %m");
+       }
+       if (import_hostname == 0 || strcmp(myhostname, import_hostname) != 0) {
+#if MAILLOG_CLIENT_DEBUG
+           msg_info("export %s=%s", POSTLOG_HOSTNAME_ENV, myhostname);
+#endif
+           if (setenv(POSTLOG_HOSTNAME_ENV, myhostname, 1) < 0)
+               msg_fatal("setenv: %m");
+       }
+       if (service_path != import_service_path)
+           myfree(service_path);
+    }
+
+    /*
+     * Postlog logging is disabled. Silence the msg_logger client, and remove
+     * the environment settings that bootstrap postlog logging in a child
+     * process.
+     */
+    else {
+       msg_logger_control(CA_MSG_LOGGER_CTL_DISABLE, CA_MSG_LOGGER_CTL_END);
+       if ((import_service_path && unsetenv(POSTLOG_SERVICE_ENV))
+           || (import_hostname && unsetenv(POSTLOG_HOSTNAME_ENV)))
+           msg_fatal("unsetenv: %m");
+    }
+
+    /*
+     * Syslog logging is enabled. Update the 'progname' as that may have
+     * changed since an earlier call.
+     */
+    if (logger_mode == MAILLOG_CLIENT_MODE_SYSLOG) {
+       msg_syslog_init(progname, LOG_PID, LOG_FACILITY);
+    }
+
+    /*
+     * Syslog logging is disabled, silence the syslog client.
+     */
+    else {
+       msg_syslog_disable();
+    }
+}
diff --git a/postfix/src/global/maillog_client.h b/postfix/src/global/maillog_client.h
new file mode 100644 (file)
index 0000000..7160187
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef _MAILLOG_CLIENT_H_INCLUDED_
+#define _MAILLOG_CLIENT_H_INCLUDED_
+
+/*++
+/* NAME
+/*     maillog_client 3h
+/* SUMMARY
+/*     choose between syslog client and postlog client
+/* SYNOPSIS
+/*     #include <maillog_client.h>
+/* DESCRIPTION
+/* .nf
+
+ /*
+  * External interface.
+  */
+#define MAILLOG_CLIENT_FLAG_NONE               (0)
+#define MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK (1<<0)
+
+extern void maillog_client_init(const char *, int);
+
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+#endif
index 9263920c2e27d8e585df6fec05b14274ddfcd968..1dd334d86ee99e77fb18eccb4886755103cb3115 100644 (file)
@@ -3,13 +3,13 @@ SRCS  = master.c master_conf.c master_ent.c master_sig.c master_avail.c \
        master_spawn.c master_service.c master_status.c master_listen.c \
        master_proto.c single_server.c multi_server.c master_vars.c \
        master_wakeup.c master_flow.c master_watch.c mail_flow.c \
-       master_monitor.c
+       master_monitor.c dgram_server.c
 OBJS   = master.o master_conf.o master_ent.o master_sig.o master_avail.o \
        master_spawn.o master_service.o master_status.o master_listen.o \
        master_vars.o master_wakeup.o master_watch.o master_flow.o \
        master_monitor.o
 LIB_OBJ        = single_server.o multi_server.o trigger_server.o master_proto.o \
-       mail_flow.o event_server.o
+       mail_flow.o event_server.o dgram_server.o
 HDRS   = mail_server.h master_proto.h mail_flow.h
 INT_HDR        = master.h
 DEFS   = -I. -I$(INC_DIR) -D$(SYSTYPE)
@@ -87,6 +87,47 @@ depend: $(MAKES)
        @$(EXPORT) make -f Makefile.in Makefile 1>&2
 
 # do not edit below this line - it is generated by 'make depend'
+dgram_server.o: ../../include/argv.h
+dgram_server.o: ../../include/attr.h
+dgram_server.o: ../../include/bounce.h
+dgram_server.o: ../../include/check_arg.h
+dgram_server.o: ../../include/chroot_uid.h
+dgram_server.o: ../../include/debug_process.h
+dgram_server.o: ../../include/deliver_request.h
+dgram_server.o: ../../include/dict.h
+dgram_server.o: ../../include/dsn.h
+dgram_server.o: ../../include/dsn_buf.h
+dgram_server.o: ../../include/events.h
+dgram_server.o: ../../include/htable.h
+dgram_server.o: ../../include/iostuff.h
+dgram_server.o: ../../include/listen.h
+dgram_server.o: ../../include/mail_conf.h
+dgram_server.o: ../../include/mail_dict.h
+dgram_server.o: ../../include/mail_params.h
+dgram_server.o: ../../include/mail_task.h
+dgram_server.o: ../../include/mail_version.h
+dgram_server.o: ../../include/maillog_client.h
+dgram_server.o: ../../include/msg.h
+dgram_server.o: ../../include/msg_stats.h
+dgram_server.o: ../../include/msg_vstream.h
+dgram_server.o: ../../include/myflock.h
+dgram_server.o: ../../include/mymalloc.h
+dgram_server.o: ../../include/nvtable.h
+dgram_server.o: ../../include/recipient_list.h
+dgram_server.o: ../../include/resolve_local.h
+dgram_server.o: ../../include/safe_open.h
+dgram_server.o: ../../include/sane_accept.h
+dgram_server.o: ../../include/split_at.h
+dgram_server.o: ../../include/stringops.h
+dgram_server.o: ../../include/sys_defs.h
+dgram_server.o: ../../include/vbuf.h
+dgram_server.o: ../../include/vstream.h
+dgram_server.o: ../../include/vstring.h
+dgram_server.o: ../../include/watchdog.h
+dgram_server.o: dgram_server.c
+dgram_server.o: mail_flow.h
+dgram_server.o: mail_server.h
+dgram_server.o: master_proto.h
 event_server.o: ../../include/argv.h
 event_server.o: ../../include/attr.h
 event_server.o: ../../include/bounce.h
@@ -106,9 +147,9 @@ event_server.o: ../../include/mail_dict.h
 event_server.o: ../../include/mail_params.h
 event_server.o: ../../include/mail_task.h
 event_server.o: ../../include/mail_version.h
+event_server.o: ../../include/maillog_client.h
 event_server.o: ../../include/msg.h
 event_server.o: ../../include/msg_stats.h
-event_server.o: ../../include/msg_syslog.h
 event_server.o: ../../include/msg_vstream.h
 event_server.o: ../../include/myflock.h
 event_server.o: ../../include/mymalloc.h
@@ -148,8 +189,8 @@ master.o: ../../include/mail_params.h
 master.o: ../../include/mail_parm_split.h
 master.o: ../../include/mail_task.h
 master.o: ../../include/mail_version.h
+master.o: ../../include/maillog_client.h
 master.o: ../../include/msg.h
-master.o: ../../include/msg_syslog.h
 master.o: ../../include/myflock.h
 master.o: ../../include/mymalloc.h
 master.o: ../../include/open_lock.h
@@ -327,9 +368,9 @@ multi_server.o: ../../include/mail_dict.h
 multi_server.o: ../../include/mail_params.h
 multi_server.o: ../../include/mail_task.h
 multi_server.o: ../../include/mail_version.h
+multi_server.o: ../../include/maillog_client.h
 multi_server.o: ../../include/msg.h
 multi_server.o: ../../include/msg_stats.h
-multi_server.o: ../../include/msg_syslog.h
 multi_server.o: ../../include/msg_vstream.h
 multi_server.o: ../../include/myflock.h
 multi_server.o: ../../include/mymalloc.h
@@ -369,9 +410,9 @@ single_server.o: ../../include/mail_dict.h
 single_server.o: ../../include/mail_params.h
 single_server.o: ../../include/mail_task.h
 single_server.o: ../../include/mail_version.h
+single_server.o: ../../include/maillog_client.h
 single_server.o: ../../include/msg.h
 single_server.o: ../../include/msg_stats.h
-single_server.o: ../../include/msg_syslog.h
 single_server.o: ../../include/msg_vstream.h
 single_server.o: ../../include/myflock.h
 single_server.o: ../../include/mymalloc.h
@@ -411,9 +452,9 @@ trigger_server.o: ../../include/mail_dict.h
 trigger_server.o: ../../include/mail_params.h
 trigger_server.o: ../../include/mail_task.h
 trigger_server.o: ../../include/mail_version.h
+trigger_server.o: ../../include/maillog_client.h
 trigger_server.o: ../../include/msg.h
 trigger_server.o: ../../include/msg_stats.h
-trigger_server.o: ../../include/msg_syslog.h
 trigger_server.o: ../../include/msg_vstream.h
 trigger_server.o: ../../include/myflock.h
 trigger_server.o: ../../include/mymalloc.h
diff --git a/postfix/src/master/dgram_server.c b/postfix/src/master/dgram_server.c
new file mode 100644 (file)
index 0000000..c9b3ea6
--- /dev/null
@@ -0,0 +1,663 @@
+/*++
+/* NAME
+/*     dgram_server 3
+/* SUMMARY
+/*     skeleton datagram server subsystem
+/* SYNOPSIS
+/*     #include <mail_server.h>
+/*
+/*     NORETURN dgram_server_main(argc, argv, service, key, value, ...)
+/*     int     argc;
+/*     char    **argv;
+/*     void    (*service)(char *buf, int len, char *service_name, char **argv);
+/*     int     key;
+/* DESCRIPTION
+/*     This module implements a skeleton for mail subsystem programs
+/*     that wake up on client request and perform some activity
+/*     without further client interaction.  This module supports
+/*     local IPC via a UNIX-domain datagram socket. The resulting
+/*     program expects to be run from the \fBmaster\fR process.
+/*
+/*     dgram_server_main() is the skeleton entry point. It should
+/*     be called from the application main program. The skeleton
+/*     does the generic command-line options processing, initialization
+/*     of configurable parameters, and receiving datagrams. The
+/*     skeleton never returns.
+/*
+/*     Arguments:
+/* .IP "void (*service)(char *buf, int len, char *service_name, char **argv)"
+/*     A pointer to a function that is called by the skeleton each
+/*     time a client sends a datagram to the program's service
+/*     port. The function is run after the program has irrevocably
+/*     dropped its privileges.  The buffer argument specifies the
+/*     data read from the datagram port; this data corresponds to
+/*     request.  The len argument specifies how much client data
+/*     is available.  The maximal size of the buffer is specified
+/*     via the DGRAM_BUF_SIZE manifest constant.  The service name
+/*     argument corresponds to the service name in the master.cf
+/*     file.  The argv argument specifies command-line arguments
+/*     left over after options processing.
+/* .PP
+/*     Optional arguments are specified as a null-terminated list
+/*     with macros that have zero or more arguments:
+/* .IP "CA_MAIL_SERVER_INT_TABLE(CONFIG_INT_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_LONG_TABLE(CONFIG_LONG_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_STR_TABLE(CONFIG_STR_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_BOOL_TABLE(CONFIG_BOOL_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_TIME_TABLE(CONFIG_TIME_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_RAW_TABLE(CONFIG_RAW_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed. Raw parameters are not subjected to $name
+/*     evaluation.
+/* .IP "CA_MAIL_SERVER_NINT_TABLE(CONFIG_NINT_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_NBOOL_TABLE(CONFIG_NBOOL_TABLE *)"
+/*     A table with configurable parameters, to be loaded from the
+/*     global Postfix configuration file. Tables are loaded in the
+/*     order as specified, and multiple instances of the same type
+/*     are allowed.
+/* .IP "CA_MAIL_SERVER_PRE_INIT(void *(char *service_name, char **argv))"
+/*     A pointer to a function that is called once
+/*     by the skeleton after it has read the global configuration file
+/*     and after it has processed command-line arguments, but before
+/*     the skeleton has optionally relinquished the process privileges.
+/* .sp
+/*     Only the last instance of this parameter type is remembered.
+/* .IP "CA_MAIL_SERVER_POST_INIT(void *(char *service_name, char **argv))"
+/*     A pointer to a function that is called once
+/*     by the skeleton after it has optionally relinquished the process
+/*     privileges, but before servicing client connection requests.
+/* .sp
+/*     Only the last instance of this parameter type is remembered.
+/* .IP "CA_MAIL_SERVER_LOOP(int *(char *service_name, char **argv))"
+/*     A pointer to function that is executed from
+/*     within the event loop, whenever an I/O or timer event has happened,
+/*     or whenever nothing has happened for a specified amount of time.
+/*     The result value of the function specifies how long to wait until
+/*     the next event. Specify -1 to wait for "as long as it takes".
+/* .sp
+/*     Only the last instance of this parameter type is remembered.
+/* .IP "CA_MAIL_SERVER_EXIT(void *(char *service_name, char **argv))"
+/*     A pointer to function that is executed immediately before normal
+/*     process termination.
+/* .sp
+/*     Only the last instance of this parameter type is remembered.
+/* .IP "CA_MAIL_SERVER_PRE_ACCEPT(void *(char *service_name, char **argv))"
+/*     Function to be executed prior to accepting a new request.
+/* .sp
+/*     Only the last instance of this parameter type is remembered.
+/* .IP "CA_MAIL_SERVER_IN_FLOW_DELAY(none)"
+/*     Pause $in_flow_delay seconds when no "mail flow control token"
+/*     is available. A token is consumed for each connection request.
+/* .IP CA_MAIL_SERVER_SOLITARY
+/*     This service must be configured with process limit of 1.
+/* .IP CA_MAIL_SERVER_UNLIMITED
+/*     This service must be configured with process limit of 0.
+/* .IP CA_MAIL_SERVER_PRIVILEGED
+/*     This service must be configured as privileged.
+/* .IP "CA_MAIL_SERVER_WATCHDOG(int *)"
+/*     Override the default 1000s watchdog timeout. The value is
+/*     used after command-line and main.cf file processing.
+/* .IP "CA_MAIL_SERVER_BOUNCE_INIT(const char *, const char **)"
+/*     Initialize the DSN filter for the bounce/defer service
+/*     clients with the specified map source and map names.
+/* .PP
+/*     The var_use_limit variable limits the number of clients that
+/*     a server can service before it commits suicide.
+/*     This value is taken from the global \fBmain.cf\fR configuration
+/*     file. Setting \fBvar_use_limit\fR to zero disables the client limit.
+/*
+/*     The var_idle_limit variable limits the time that a service
+/*     receives no client connection requests before it commits suicide.
+/*     This value is taken from the global \fBmain.cf\fR configuration
+/*     file. Setting \fBvar_use_limit\fR to zero disables the idle limit.
+/* DIAGNOSTICS
+/*     Problems and transactions are logged to \fBsyslogd\fR(8).
+/* SEE ALSO
+/*     master(8), master process
+/*     syslogd(8) system logging
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+/* System library. */
+
+#include <sys_defs.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#ifdef STRCASECMP_IN_STRINGS_H
+#include <strings.h>
+#endif
+#include <time.h>
+
+/* Utility library. */
+
+#include <msg.h>
+#include <msg_vstream.h>
+#include <chroot_uid.h>
+#include <vstring.h>
+#include <vstream.h>
+#include <msg_vstream.h>
+#include <mymalloc.h>
+#include <events.h>
+#include <iostuff.h>
+#include <stringops.h>
+#include <sane_accept.h>
+#include <myflock.h>
+#include <safe_open.h>
+#include <listen.h>
+#include <watchdog.h>
+#include <split_at.h>
+
+/* Global library. */
+
+#include <mail_params.h>
+#include <mail_task.h>
+#include <debug_process.h>
+#include <mail_conf.h>
+#include <mail_dict.h>
+#include <resolve_local.h>
+#include <mail_flow.h>
+#include <mail_version.h>
+#include <bounce.h>
+#include <maillog_client.h>
+
+/* Process manager. */
+
+#include "master_proto.h"
+
+/* Application-specific */
+
+#include "mail_server.h"
+
+ /*
+  * Global state.
+  */
+static int use_count;
+
+static DGRAM_SERVER_FN dgram_server_service;
+static char *dgram_server_name;
+static char **dgram_server_argv;
+static void (*dgram_server_accept) (int, void *);
+static void (*dgram_server_onexit) (char *, char **);
+static void (*dgram_server_pre_accept) (char *, char **);
+static VSTREAM *dgram_server_lock;
+static int dgram_server_in_flow_delay;
+static unsigned dgram_server_generation;
+static int dgram_server_watchdog = 1000;
+
+/* dgram_server_exit - normal termination */
+
+static NORETURN dgram_server_exit(void)
+{
+    if (dgram_server_onexit)
+       dgram_server_onexit(dgram_server_name, dgram_server_argv);
+    exit(0);
+}
+
+/* dgram_server_abort - terminate after abnormal master exit */
+
+static void dgram_server_abort(int unused_event, void *unused_context)
+{
+    if (msg_verbose)
+       msg_info("master disconnect -- exiting");
+    dgram_server_exit();
+}
+
+/* dgram_server_timeout - idle time exceeded */
+
+static void dgram_server_timeout(int unused_event, void *unused_context)
+{
+    if (msg_verbose)
+       msg_info("idle timeout -- exiting");
+    dgram_server_exit();
+}
+
+/* dgram_server_wakeup - wake up application */
+
+static void dgram_server_wakeup(int fd)
+{
+    char    buf[DGRAM_BUF_SIZE];
+    ssize_t len;
+
+    /*
+     * Commit suicide when the master process disconnected from us, after
+     * handling the client request.
+     */
+    if (master_notify(var_pid, dgram_server_generation, MASTER_STAT_TAKEN) < 0)
+        /* void */ ;
+    if (dgram_server_in_flow_delay && mail_flow_get(1) < 0)
+       doze(var_in_flow_delay * 1000000);
+    if ((len = recv(fd, buf, sizeof(buf), 0)) >= 0)
+       dgram_server_service(buf, len, dgram_server_name, dgram_server_argv);
+    if (master_notify(var_pid, dgram_server_generation, MASTER_STAT_AVAIL) < 0)
+       dgram_server_abort(EVENT_NULL_TYPE, EVENT_NULL_CONTEXT);
+    if (var_idle_limit > 0)
+       event_request_timer(dgram_server_timeout, (void *) 0, var_idle_limit);
+    /* Avoid integer wrap-around in a persistent process.  */
+    if (use_count < INT_MAX)
+       use_count++;
+}
+
+/* dgram_server_accept_unix - handle UNIX-domain socket event */
+
+static void dgram_server_accept_unix(int unused_event, void *context)
+{
+    const char *myname = "dgram_server_accept";
+    int     listen_fd = CAST_ANY_PTR_TO_INT(context);
+
+    if (dgram_server_lock != 0
+       && myflock(vstream_fileno(dgram_server_lock), INTERNAL_LOCK,
+                  MYFLOCK_OP_NONE) < 0)
+       msg_fatal("select unlock: %m");
+
+    if (msg_verbose)
+       msg_info("%s: request arrived", myname);
+
+    /*
+     * Read whatever the other side wrote. The socket is non-blocking so we
+     * won't get stuck when multiple processes wake up.
+     */
+    if (dgram_server_pre_accept)
+       dgram_server_pre_accept(dgram_server_name, dgram_server_argv);
+    dgram_server_wakeup(listen_fd);
+}
+
+/* dgram_server_main - the real main program */
+
+NORETURN dgram_server_main(int argc, char **argv, DGRAM_SERVER_FN service,...)
+{
+    const char *myname = "dgram_server_main";
+    char   *root_dir = 0;
+    char   *user_name = 0;
+    int     debug_me = 0;
+    int     daemon_mode = 1;
+    char   *service_name = basename(argv[0]);
+    int     delay;
+    int     c;
+    int     socket_count = 1;
+    int     fd;
+    va_list ap;
+    MAIL_SERVER_INIT_FN pre_init = 0;
+    MAIL_SERVER_INIT_FN post_init = 0;
+    MAIL_SERVER_LOOP_FN loop = 0;
+    int     key;
+    char   *transport = 0;
+    char   *lock_path;
+    VSTRING *why;
+    int     alone = 0;
+    int     zerolimit = 0;
+    WATCHDOG *watchdog;
+    char   *oname_val;
+    char   *oname;
+    char   *oval;
+    const char *err;
+    char   *generation;
+    int     msg_vstream_needed = 0;
+    const char *dsn_filter_title;
+    const char **dsn_filter_maps;
+
+    /*
+     * Process environment options as early as we can.
+     */
+    if (getenv(CONF_ENV_VERB))
+       msg_verbose = 1;
+    if (getenv(CONF_ENV_DEBUG))
+       debug_me = 1;
+
+    /*
+     * Don't die when a process goes away unexpectedly.
+     */
+    signal(SIGPIPE, SIG_IGN);
+
+    /*
+     * Don't die for frivolous reasons.
+     */
+#ifdef SIGXFSZ
+    signal(SIGXFSZ, SIG_IGN);
+#endif
+
+    /*
+     * May need this every now and then.
+     */
+    var_procname = mystrdup(basename(argv[0]));
+    set_mail_conf_str(VAR_PROCNAME, var_procname);
+
+    /*
+     * Initialize logging and exit handler. Do the syslog first, so that its
+     * initialization completes before we enter the optional chroot jail.
+     */
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
+    if (msg_verbose)
+       msg_info("daemon started");
+
+    /*
+     * Check the Postfix library version as soon as we enable logging.
+     */
+    MAIL_VERSION_CHECK;
+
+    /*
+     * Initialize from the configuration file. Allow command-line options to
+     * override compiled-in defaults or configured parameter values.
+     */
+    mail_conf_suck();
+
+    /*
+     * After database open error, continue execution with reduced
+     * functionality.
+     */
+    dict_allow_surrogate = 1;
+
+    /*
+     * Pick up policy settings from master process. Shut up error messages to
+     * stderr, because no-one is going to see them.
+     */
+    opterr = 0;
+    while ((c = GETOPT(argc, argv, "cdDi:lm:n:o:s:t:uvVz")) > 0) {
+       switch (c) {
+       case 'c':
+           root_dir = "setme";
+           break;
+       case 'd':
+           daemon_mode = 0;
+           break;
+       case 'D':
+           debug_me = 1;
+           break;
+       case 'i':
+           mail_conf_update(VAR_MAX_IDLE, optarg);
+           break;
+       case 'l':
+           alone = 1;
+           break;
+       case 'm':
+           mail_conf_update(VAR_MAX_USE, optarg);
+           break;
+       case 'n':
+           service_name = optarg;
+           break;
+       case 'o':
+           oname_val = mystrdup(optarg);
+           if ((err = split_nameval(oname_val, &oname, &oval)) != 0)
+               msg_fatal("invalid \"-o %s\" option value: %s", optarg, err);
+           mail_conf_update(oname, oval);
+           myfree(oname_val);
+           break;
+       case 's':
+           if ((socket_count = atoi(optarg)) <= 0)
+               msg_fatal("invalid socket_count: %s", optarg);
+           break;
+       case 't':
+           transport = optarg;
+           break;
+       case 'u':
+           user_name = "setme";
+           break;
+       case 'v':
+           msg_verbose++;
+           break;
+       case 'V':
+           if (++msg_vstream_needed == 1)
+               msg_vstream_init(mail_task(var_procname), VSTREAM_ERR);
+           break;
+       case 'z':
+           zerolimit = 1;
+           break;
+       default:
+           msg_fatal("invalid option: %c", optopt);
+           break;
+       }
+    }
+    set_mail_conf_str(VAR_SERVNAME, service_name);
+
+    /*
+     * Initialize generic parameters and re-initialize logging in case of a
+     * non-default program name or logging destination.
+     */
+    mail_params_init();
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
+
+    /*
+     * Register higher-level dictionaries and initialize the support for
+     * dynamically-loaded dictionarles.
+     */
+    mail_dict_init();
+
+    /*
+     * If not connected to stdin, stdin must not be a terminal.
+     */
+    if (daemon_mode && isatty(STDIN_FILENO)) {
+       msg_vstream_init(var_procname, VSTREAM_ERR);
+       msg_fatal("do not run this command by hand");
+    }
+
+    /*
+     * Application-specific initialization.
+     */
+    va_start(ap, service);
+    while ((key = va_arg(ap, int)) != 0) {
+       switch (key) {
+       case MAIL_SERVER_INT_TABLE:
+           get_mail_conf_int_table(va_arg(ap, CONFIG_INT_TABLE *));
+           break;
+       case MAIL_SERVER_LONG_TABLE:
+           get_mail_conf_long_table(va_arg(ap, CONFIG_LONG_TABLE *));
+           break;
+       case MAIL_SERVER_STR_TABLE:
+           get_mail_conf_str_table(va_arg(ap, CONFIG_STR_TABLE *));
+           break;
+       case MAIL_SERVER_BOOL_TABLE:
+           get_mail_conf_bool_table(va_arg(ap, CONFIG_BOOL_TABLE *));
+           break;
+       case MAIL_SERVER_TIME_TABLE:
+           get_mail_conf_time_table(va_arg(ap, CONFIG_TIME_TABLE *));
+           break;
+       case MAIL_SERVER_RAW_TABLE:
+           get_mail_conf_raw_table(va_arg(ap, CONFIG_RAW_TABLE *));
+           break;
+       case MAIL_SERVER_NINT_TABLE:
+           get_mail_conf_nint_table(va_arg(ap, CONFIG_NINT_TABLE *));
+           break;
+       case MAIL_SERVER_NBOOL_TABLE:
+           get_mail_conf_nbool_table(va_arg(ap, CONFIG_NBOOL_TABLE *));
+           break;
+       case MAIL_SERVER_PRE_INIT:
+           pre_init = va_arg(ap, MAIL_SERVER_INIT_FN);
+           break;
+       case MAIL_SERVER_POST_INIT:
+           post_init = va_arg(ap, MAIL_SERVER_INIT_FN);
+           break;
+       case MAIL_SERVER_LOOP:
+           loop = va_arg(ap, MAIL_SERVER_LOOP_FN);
+           break;
+       case MAIL_SERVER_EXIT:
+           dgram_server_onexit = va_arg(ap, MAIL_SERVER_EXIT_FN);
+           break;
+       case MAIL_SERVER_PRE_ACCEPT:
+           dgram_server_pre_accept = va_arg(ap, MAIL_SERVER_ACCEPT_FN);
+           break;
+       case MAIL_SERVER_IN_FLOW_DELAY:
+           dgram_server_in_flow_delay = 1;
+           break;
+       case MAIL_SERVER_SOLITARY:
+           if (!alone)
+               msg_fatal("service %s requires a process limit of 1",
+                         service_name);
+           break;
+       case MAIL_SERVER_UNLIMITED:
+           if (!zerolimit)
+               msg_fatal("service %s requires a process limit of 0",
+                         service_name);
+           break;
+       case MAIL_SERVER_PRIVILEGED:
+           if (user_name)
+               msg_fatal("service %s requires privileged operation",
+                         service_name);
+           break;
+       case MAIL_SERVER_WATCHDOG:
+           dgram_server_watchdog = *va_arg(ap, int *);
+           break;
+       case MAIL_SERVER_BOUNCE_INIT:
+           dsn_filter_title = va_arg(ap, const char *);
+           dsn_filter_maps = va_arg(ap, const char **);
+           bounce_client_init(dsn_filter_title, *dsn_filter_maps);
+           break;
+       default:
+           msg_panic("%s: unknown argument type: %d", myname, key);
+       }
+    }
+    va_end(ap);
+
+    if (root_dir)
+       root_dir = var_queue_dir;
+    if (user_name)
+       user_name = var_mail_owner;
+
+    /*
+     * Can options be required?
+     */
+    if (transport == 0)
+       msg_fatal("no transport type specified");
+    else if (strcasecmp(transport, MASTER_XPORT_NAME_UXDG) == 0)
+       dgram_server_accept = dgram_server_accept_unix;
+    else
+       msg_fatal("unsupported transport type: %s", transport);
+
+    /*
+     * Retrieve process generation from environment.
+     */
+    if ((generation = getenv(MASTER_GEN_NAME)) != 0) {
+       if (!alldig(generation))
+           msg_fatal("bad generation: %s", generation);
+       OCTAL_TO_UNSIGNED(dgram_server_generation, generation);
+       if (msg_verbose)
+           msg_info("process generation: %s (%o)",
+                    generation, dgram_server_generation);
+    }
+
+    /*
+     * Optionally start the debugger on ourself.
+     */
+    if (debug_me)
+       debug_process();
+
+    /*
+     * Traditionally, BSD select() can't handle multiple processes selecting
+     * on the same socket, and wakes up every process in select(). See TCP/IP
+     * Illustrated volume 2 page 532. We avoid select() collisions with an
+     * external lock file.
+     */
+    if (!alone) {
+       lock_path = concatenate(DEF_PID_DIR, "/", transport,
+                               ".", service_name, (char *) 0);
+       why = vstring_alloc(1);
+       if ((dgram_server_lock = safe_open(lock_path, O_CREAT | O_RDWR, 0600,
+                                     (struct stat *) 0, -1, -1, why)) == 0)
+           msg_fatal("open lock file %s: %s", lock_path, vstring_str(why));
+       close_on_exec(vstream_fileno(dgram_server_lock), CLOSE_ON_EXEC);
+       myfree(lock_path);
+       vstring_free(why);
+    }
+
+    /*
+     * Set up call-back info.
+     */
+    dgram_server_service = service;
+    dgram_server_name = service_name;
+    dgram_server_argv = argv + optind;
+
+    /*
+     * Run pre-jail initialization.
+     */
+    if (chdir(var_queue_dir) < 0)
+       msg_fatal("chdir(\"%s\"): %m", var_queue_dir);
+    if (pre_init)
+       pre_init(dgram_server_name, dgram_server_argv);
+
+    /*
+     * Optionally, restrict the damage that this process can do.
+     */
+    resolve_local_init();
+    tzset();
+    chroot_uid(root_dir, user_name);
+
+    /*
+     * Run post-jail initialization.
+     */
+    if (post_init)
+       post_init(dgram_server_name, dgram_server_argv);
+
+    /*
+     * Running as a semi-resident server. Service requests. Terminate when we
+     * have serviced a sufficient number of requests, when no-one has been
+     * talking to us for a configurable amount of time, or when the master
+     * process terminated abnormally.
+     */
+    if (var_idle_limit > 0)
+       event_request_timer(dgram_server_timeout, (void *) 0, var_idle_limit);
+    for (fd = MASTER_LISTEN_FD; fd < MASTER_LISTEN_FD + socket_count; fd++) {
+       event_enable_read(fd, dgram_server_accept, CAST_INT_TO_VOID_PTR(fd));
+       close_on_exec(fd, CLOSE_ON_EXEC);
+    }
+    event_enable_read(MASTER_STATUS_FD, dgram_server_abort, (void *) 0);
+    close_on_exec(MASTER_STATUS_FD, CLOSE_ON_EXEC);
+    close_on_exec(MASTER_FLOW_READ, CLOSE_ON_EXEC);
+    close_on_exec(MASTER_FLOW_WRITE, CLOSE_ON_EXEC);
+    watchdog = watchdog_create(dgram_server_watchdog,
+                              (WATCHDOG_FN) 0, (void *) 0);
+
+    /*
+     * The event loop, at last.
+     */
+    while (var_use_limit == 0 || use_count < var_use_limit) {
+       if (dgram_server_lock != 0) {
+           watchdog_stop(watchdog);
+           if (myflock(vstream_fileno(dgram_server_lock), INTERNAL_LOCK,
+                       MYFLOCK_OP_EXCLUSIVE) < 0)
+               msg_fatal("select lock: %m");
+       }
+       watchdog_start(watchdog);
+       delay = loop ? loop(dgram_server_name, dgram_server_argv) : -1;
+       event_loop(delay);
+    }
+    dgram_server_exit();
+}
index a1c0d246a5b21f2b9b6e857d318abc0b979d6d82..b7b9a4ff637f1cb359701b930349a87181b3e459 100644 (file)
 #include <sys/time.h>                  /* select() */
 #include <unistd.h>
 #include <signal.h>
-#include <syslog.h>
 #include <stdlib.h>
 #include <limits.h>
 #include <string.h>
 /* Utility library. */
 
 #include <msg.h>
-#include <msg_syslog.h>
 #include <msg_vstream.h>
 #include <chroot_uid.h>
 #include <listen.h>
 #include <mail_flow.h>
 #include <mail_version.h>
 #include <bounce.h>
+#include <maillog_client.h>
 
 /* Process manager. */
 
@@ -584,7 +583,6 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
     const char *err;
     char   *generation;
     int     msg_vstream_needed = 0;
-    int     redo_syslog_init = 0;
     const char *dsn_filter_title;
     const char **dsn_filter_maps;
     int     retire_me_from_flags = 0;
@@ -620,7 +618,7 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
      * Initialize logging and exit handler. Do the syslog first, so that its
      * initialization completes before we enter the optional chroot jail.
      */
-    msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
     if (msg_verbose)
        msg_info("daemon started");
 
@@ -674,8 +672,6 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
            if ((err = split_nameval(oname_val, &oname, &oval)) != 0)
                msg_fatal("invalid \"-o %s\" option value: %s", optarg, err);
            mail_conf_update(oname, oval);
-           if (strcmp(oname, VAR_SYSLOG_NAME) == 0)
-               redo_syslog_init = 1;
            myfree(oname_val);
            break;
        case 'r':
@@ -713,11 +709,11 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
     set_mail_conf_str(VAR_SERVNAME, service_name);
 
     /*
-     * Initialize generic parameters.
+     * Initialize generic parameters and re-initialize logging in case of a
+     * non-default program name or logging destination.
      */
     mail_params_init();
-    if (redo_syslog_init)
-       msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
 
     /*
      * Register higher-level dictionaries and initialize the support for
index 56a3072b7fb737ec1851831ed01110bc1f9ffe51..7300b3f01047021e8e34b4199a0aa6fe85694e7c 100644 (file)
@@ -125,6 +125,14 @@ extern NORETURN trigger_server_main(int, char **, TRIGGER_SERVER_FN,...);
 
 #define TRIGGER_BUF_SIZE       1024
 
+ /*
+  * dgram_server.c
+  */
+typedef void (*DGRAM_SERVER_FN) (char *, ssize_t, char *, char **);
+extern NORETURN dgram_server_main(int, char **, DGRAM_SERVER_FN,...);
+
+#define DGRAM_BUF_SIZE 4096
+
 /* LICENSE
 /* .ad
 /* .fi
index 4d77f1041d738144da2c62e8322b304e187a268a..dbe8809649195b3dff0011ccdc363083ca2c9b58 100644 (file)
 /*     Terminate the master process after \fIexit_time\fR seconds. Child
 /*     processes terminate at their convenience.
 /* .IP \fB-i\fR
-/*     Enable \fBinit\fR mode: do not attempt to become a session
-/*     or process group leader; and to force termination, set an
-/*     explicit signal handler instead of relying on the default
-/*     signal action. This mode is allowed only if the process ID
-/*     equals 1.
+/*     Enable \fBinit\fR mode: do not become a session or process
+/*     group leader; similar to \fB-s\fR, do not redirect stdout
+/*     to /dev/null, so that "maillog_file = /dev/stdout" works.
+/*     This mode is allowed only if the process ID equals 1.
+/* .IP \fB-s\fR
+/*     Do not redirect stdout to /dev/null, so that "maillog_file
+/*     = /dev/stdout" works.
 /* .IP \fB-t\fR
 /*     Test mode. Return a zero exit status when the \fBmaster.pid\fR lock
 /*     file does not exist or when that file is not locked.  This is evidence
 
 #include <sys_defs.h>
 #include <sys/stat.h>
-#include <syslog.h>
 #include <signal.h>
 #include <stdlib.h>
 #include <unistd.h>
 
 #include <events.h>
 #include <msg.h>
-#include <msg_syslog.h>
 #include <vstring.h>
 #include <mymalloc.h>
 #include <iostuff.h>
 #include <open_lock.h>
 #include <inet_proto.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -264,6 +265,7 @@ int     main(int argc, char **argv)
     VSTRING *data_lock_path;
     off_t   inherited_limit;
     int     debug_me = 0;
+    int     keep_stdout = 0;
     int     ch;
     int     fd;
     int     n;
@@ -321,7 +323,8 @@ int     main(int argc, char **argv)
     /*
      * Initialize logging and exit handler.
      */
-    msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), 
+                       MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
 
     /*
      * Check the Postfix library version as soon as we enable logging.
@@ -341,7 +344,7 @@ int     main(int argc, char **argv)
     /*
      * Process JCL.
      */
-    while ((ch = GETOPT(argc, argv, "c:Dde:itvw")) > 0) {
+    while ((ch = GETOPT(argc, argv, "c:Dde:istvw")) > 0) {
        switch (ch) {
        case 'c':
            if (setenv(CONF_ENV_PATH, optarg, 1) < 0)
@@ -357,9 +360,13 @@ int     main(int argc, char **argv)
            if (getpid() != 1)
                msg_fatal("-i is allowed only for PID 1 process");
            init_mode = 1;
+           keep_stdout = 1;
            break;
        case 'D':
-           debug_me = 1;
+            debug_me = 1;
+           break;
+       case 's':
+           keep_stdout = 1;
            break;
        case 't':
            test_lock = 1;
@@ -407,6 +414,8 @@ int     main(int argc, char **argv)
      */
     if (master_detach)
        for (fd = 0; fd < 3; fd++) {
+           if (fd == STDOUT_FILENO && keep_stdout)
+               continue;
            (void) close(fd);
            if (open("/dev/null", O_RDWR, 0) != fd)
                msg_fatal("open /dev/null: %m");
@@ -525,6 +534,8 @@ int     main(int argc, char **argv)
     master_config();
     master_sigsetup();
     master_flow_init();
+    maillog_client_init(mail_task(var_procname), 
+                       MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
     msg_info("daemon started -- version %s, configuration %s",
             var_mail_version, var_config_dir);
 
@@ -563,6 +574,8 @@ int     main(int argc, char **argv)
            master_gotsighup = 0;               /* this first */
            master_vars_init();                 /* then this */
            master_refresh();                   /* then this */
+           maillog_client_init(mail_task(var_procname), 
+                               MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
        }
        if (master_gotsigchld) {
            if (msg_verbose)
index 55bdf74db78bcfffe3211b8fea70d35a6a3a1ab0..ce07ab77946a1697a2a0e80b805878aab7bf0842 100644 (file)
@@ -73,12 +73,13 @@ typedef struct MASTER_SERV {
 #define MASTER_LIMIT_OK(limit, count) ((limit) == 0 || ((count) < (limit)))
 
  /*
-  * Service types.
+  * Service types, stream sockets unless indicated otherwise.
   */
 #define MASTER_SERV_TYPE_UNIX  1       /* AF_UNIX domain socket */
 #define MASTER_SERV_TYPE_INET  2       /* AF_INET domain socket */
 #define MASTER_SERV_TYPE_FIFO  3       /* fifo (named pipe) */
 #define MASTER_SERV_TYPE_PASS  4       /* AF_UNIX domain socket */
+#define MASTER_SERV_TYPE_UXDG  5       /* AF_UNIX domain datagram socket */
 
  /*
   * Default process management policy values. This is only the bare minimum.
index 20aec82d9afa0fa8c5224741eb86a101c6759594..9f0f34c2e47299f8019c05679cee12f3e383674c 100644 (file)
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System libraries. */
@@ -381,6 +386,10 @@ MASTER_SERV *get_master_ent()
        serv->type = MASTER_SERV_TYPE_UNIX;
        serv->listen_fd_count = 1;
        serv->flags |= MASTER_FLAG_LOCAL_ONLY;
+    } else if (STR_SAME(transport, MASTER_XPORT_NAME_UXDG)) {
+       serv->type = MASTER_SERV_TYPE_UXDG;
+       serv->listen_fd_count = 1;
+       serv->flags |= MASTER_FLAG_LOCAL_ONLY;
     } else if (STR_SAME(transport, MASTER_XPORT_NAME_FIFO)) {
        serv->type = MASTER_SERV_TYPE_FIFO;
        serv->listen_fd_count = 1;
@@ -444,6 +453,9 @@ MASTER_SERV *get_master_ent()
     } else if (serv->type == MASTER_SERV_TYPE_UNIX) {
        serv->name = mail_pathname(private ? MAIL_CLASS_PRIVATE :
                                   MAIL_CLASS_PUBLIC, name);
+    } else if (serv->type == MASTER_SERV_TYPE_UXDG) {
+       serv->name = mail_pathname(private ? MAIL_CLASS_PRIVATE :
+                                  MAIL_CLASS_PUBLIC, name);
     } else if (serv->type == MASTER_SERV_TYPE_FIFO) {
        serv->name = mail_pathname(private ? MAIL_CLASS_PRIVATE :
                                   MAIL_CLASS_PUBLIC, name);
@@ -593,6 +605,7 @@ void    print_master_ent(MASTER_SERV *serv)
 #ifdef MASTER_SERV_TYPE_PASS
             serv->type == MASTER_SERV_TYPE_PASS ? MASTER_XPORT_NAME_PASS :
 #endif
+            serv->type == MASTER_SERV_TYPE_UXDG ? MASTER_XPORT_NAME_UXDG :
             "unknown transport type");
     msg_info("listen_fd_count: %d", serv->listen_fd_count);
     msg_info("wakeup: %d", serv->wakeup_time);
index a17bde1cbd6d81cd28203c8916ad0a3f597f2229..1e7f6fabe136dd60898f07df366e692988d4adf9 100644 (file)
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System library. */
@@ -97,6 +102,17 @@ void    master_listen_init(MASTER_SERV *serv)
        set_ugid(getuid(), getgid());
        break;
 
+       /*
+        * UNIX-domain datagram listener endpoints always come as singlets.
+        */
+    case MASTER_SERV_TYPE_UXDG:
+       set_eugid(var_owner_uid, var_owner_gid);
+       serv->listen_fd[0] =
+           unix_dgram_listen(serv->name, NON_BLOCKING);
+       close_on_exec(serv->listen_fd[0], CLOSE_ON_EXEC);
+       set_ugid(getuid(), getgid());
+       break;
+
        /*
         * FIFO listener endpoints always come as singlets.
         */
index bfa0e04c65df4eee0c92d30d574c83e447bd2896..60845147434f641d53793dbeed5f956a829f10aa 100644 (file)
@@ -16,6 +16,7 @@
 #define MASTER_XPORT_NAME_FIFO "fifo"  /* local IPC */
 #define MASTER_XPORT_NAME_INET "inet"  /* non-local IPC */
 #define MASTER_XPORT_NAME_PASS "pass"  /* local IPC */
+#define MASTER_XPORT_NAME_UXDG "unix-dgram"    /* local IPC */
 
  /*
   * Format of a status message sent by a child process to the process
@@ -65,5 +66,10 @@ extern int master_notify(int, unsigned, int);        /* encapsulate status msg */
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
index e303dc2ccb8ccd171be87a0770df0b64d915129c..cc509242051b408eb714c5623001df37d6a12369 100644 (file)
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System library. */
@@ -53,6 +58,7 @@
 #include <sys_defs.h>
 #include <unistd.h>
 #include <string.h>
+#include <errno.h>
 
 /* Utility library. */
 
@@ -105,6 +111,10 @@ static void master_wakeup_timer_event(int unused_event, void *context)
        case MASTER_SERV_TYPE_UNIX:
            status = LOCAL_TRIGGER(serv->name, &wakeup, sizeof(wakeup), BRIEFLY);
            break;
+       case MASTER_SERV_TYPE_UXDG:
+           status = -1;
+           errno = EOPNOTSUPP;
+           break;
 #ifdef MASTER_SERV_TYPE_PASS
        case MASTER_SERV_TYPE_PASS:
            status = pass_trigger(serv->name, &wakeup, sizeof(wakeup), BRIEFLY);
index 22dc4635cd33cd545eb53267fa4bf705c15f6849..273a07da863ac6ac66a34089c0be232d5cbe2d97 100644 (file)
 #include <sys/time.h>                  /* select() */
 #include <unistd.h>
 #include <signal.h>
-#include <syslog.h>
 #include <stdlib.h>
 #include <limits.h>
 #include <string.h>
 /* Utility library. */
 
 #include <msg.h>
-#include <msg_syslog.h>
 #include <msg_vstream.h>
 #include <chroot_uid.h>
 #include <listen.h>
 #include <mail_flow.h>
 #include <mail_version.h>
 #include <bounce.h>
+#include <maillog_client.h>
 
 /* Process manager. */
 
@@ -560,7 +559,6 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
     const char *err;
     char   *generation;
     int     msg_vstream_needed = 0;
-    int     redo_syslog_init = 0;
     const char *dsn_filter_title;
     const char **dsn_filter_maps;
 
@@ -594,7 +592,7 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
      * Initialize logging and exit handler. Do the syslog first, so that its
      * initialization completes before we enter the optional chroot jail.
      */
-    msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
     if (msg_verbose)
        msg_info("daemon started");
 
@@ -648,8 +646,6 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
            if ((err = split_nameval(oname_val, &oname, &oval)) != 0)
                msg_fatal("invalid \"-o %s\" option value: %s", optarg, err);
            mail_conf_update(oname, oval);
-           if (strcmp(oname, VAR_SYSLOG_NAME) == 0)
-               redo_syslog_init = 1;
            myfree(oname_val);
            break;
        case 's':
@@ -683,11 +679,11 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
     set_mail_conf_str(VAR_SERVNAME, service_name);
 
     /*
-     * Initialize generic parameters.
+     * Initialize generic parameters and re-initialize logging in case of a
+     * non-default program name or logging destination.
      */
     mail_params_init();
-    if (redo_syslog_init)
-       msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
 
     /*
      * Register higher-level dictionaries and initialize the support for
index 7ef4ca0cc3bef1e8cb69fa90de2f2d7cac574989..a3176734f1df77189af7f13122074322368e35df 100644 (file)
 #include <sys/socket.h>
 #include <unistd.h>
 #include <signal.h>
-#include <syslog.h>
 #include <stdlib.h>
 #include <limits.h>
 #include <string.h>
 /* Utility library. */
 
 #include <msg.h>
-#include <msg_syslog.h>
 #include <msg_vstream.h>
 #include <chroot_uid.h>
 #include <vstring.h>
 #include <mail_flow.h>
 #include <mail_version.h>
 #include <bounce.h>
+#include <maillog_client.h>
 
 /* Process manager. */
 
@@ -453,7 +452,6 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
     const char *err;
     char   *generation;
     int     msg_vstream_needed = 0;
-    int     redo_syslog_init = 0;
     const char *dsn_filter_title;
     const char **dsn_filter_maps;
     int     retire_me_from_flags = 0;
@@ -489,7 +487,7 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
      * Initialize logging and exit handler. Do the syslog first, so that its
      * initialization completes before we enter the optional chroot jail.
      */
-    msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
     if (msg_verbose)
        msg_info("daemon started");
 
@@ -543,8 +541,6 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
            if ((err = split_nameval(oname_val, &oname, &oval)) != 0)
                msg_fatal("invalid \"-o %s\" option value: %s", optarg, err);
            mail_conf_update(oname, oval);
-           if (strcmp(oname, VAR_SYSLOG_NAME) == 0)
-               redo_syslog_init = 1;
            myfree(oname_val);
            break;
        case 'r':
@@ -585,8 +581,7 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
      * Initialize generic parameters.
      */
     mail_params_init();
-    if (redo_syslog_init)
-       msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
 
     /*
      * Register higher-level dictionaries and initialize the support for
index 5762e1af6b8b70d1146744fa851b510622f4969d..efa73d12600585c7d938df7117652f2d1c82c0c1 100644 (file)
 #include <sys/socket.h>
 #include <unistd.h>
 #include <signal.h>
-#include <syslog.h>
 #include <stdlib.h>
 #include <limits.h>
 #include <string.h>
 /* Utility library. */
 
 #include <msg.h>
-#include <msg_syslog.h>
 #include <msg_vstream.h>
 #include <chroot_uid.h>
 #include <vstring.h>
 #include <mail_flow.h>
 #include <mail_version.h>
 #include <bounce.h>
+#include <maillog_client.h>
 
 /* Process manager. */
 
@@ -441,7 +440,6 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
     const char *err;
     char   *generation;
     int     msg_vstream_needed = 0;
-    int     redo_syslog_init = 0;
     const char *dsn_filter_title;
     const char **dsn_filter_maps;
 
@@ -475,7 +473,7 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
      * Initialize logging and exit handler. Do the syslog first, so that its
      * initialization completes before we enter the optional chroot jail.
      */
-    msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
     if (msg_verbose)
        msg_info("daemon started");
 
@@ -529,8 +527,6 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
            if ((err = split_nameval(oname_val, &oname, &oval)) != 0)
                msg_fatal("invalid \"-o %s\" option value: %s", optarg, err);
            mail_conf_update(oname, oval);
-           if (strcmp(oname, VAR_SYSLOG_NAME) == 0)
-               redo_syslog_init = 1;
            myfree(oname_val);
            break;
        case 's':
@@ -564,11 +560,11 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
     set_mail_conf_str(VAR_SERVNAME, service_name);
 
     /*
-     * Initialize generic parameters.
+     * Initialize generic parameters and re-initialize logging in case of a
+     * non-default program name or logging destination.
      */
     mail_params_init();
-    if (redo_syslog_init)
-       msg_syslog_init(mail_task(var_procname), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(var_procname), MAILLOG_CLIENT_FLAG_NONE);
 
     /*
      * Register higher-level dictionaries and initialize the support for
index 16485bb401c37786da3f7c5aee6b604549e65aa6..5e5b72dca97dbc04c54297234b25246a0476a99c 100644 (file)
@@ -100,9 +100,9 @@ postalias.o: ../../include/mail_params.h
 postalias.o: ../../include/mail_parm_split.h
 postalias.o: ../../include/mail_task.h
 postalias.o: ../../include/mail_version.h
+postalias.o: ../../include/maillog_client.h
 postalias.o: ../../include/mkmap.h
 postalias.o: ../../include/msg.h
-postalias.o: ../../include/msg_syslog.h
 postalias.o: ../../include/msg_vstream.h
 postalias.o: ../../include/myflock.h
 postalias.o: ../../include/mymalloc.h
index 48d10a7ac38496acd588453cd440cfe31cb13133..0cebc677fa2335edc0deec64293defeaeabd210a 100644 (file)
@@ -79,8 +79,8 @@
 /*     found to the standard output stream. The exit status is zero
 /*     when the requested information was found.
 /*
-/*     Note: this performs a single query with the key as specified, 
-/*     and does not make iterative queries with substrings of the 
+/*     Note: this performs a single query with the key as specified,
+/*     and does not make iterative queries with substrings of the
 /*     key as described in the aliases(5) manual page.
 /*
 /*     If a key value of \fB-\fR is specified, the program reads key
 #include <vstring.h>
 #include <vstream.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <readlline.h>
 #include <stringops.h>
 #include <split_at.h>
 #include <mail_task.h>
 #include <dict_proxy.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -509,8 +509,8 @@ static int postalias_queries(VSTREAM *in, char **maps, const int map_count,
        dicts[n] = 0;
 
     /*
-     * Perform all queries. Open maps on the fly, to avoid opening unnecessary
-     * maps.
+     * Perform all queries. Open maps on the fly, to avoid opening
+     * unnecessary maps.
      */
     while (vstring_get_nonl(keybuf, in) != VSTREAM_EOF) {
        for (n = 0; n < map_count; n++) {
@@ -740,13 +740,13 @@ int     main(int argc, char **argv)
        msg_verbose = 1;
 
     /*
-     * Initialize. Set up logging, read the global configuration file and
-     * extract configuration information.
+     * Initialize. Set up logging. Read the global configuration file after
+     * parsing command-line arguments.
      */
     if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
        argv[0] = slash + 1;
     msg_vstream_init(argv[0], VSTREAM_ERR);
-    msg_syslog_init(mail_task(argv[0]), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(argv[0]), MAILLOG_CLIENT_FLAG_NONE);
 
     /*
      * Check the Postfix library version as soon as we enable logging.
@@ -822,7 +822,7 @@ int     main(int argc, char **argv)
     update_env(import_env->argv);
     argv_free(import_env);
     /* Re-evaluate mail_task() after reading main.cf. */
-    msg_syslog_init(mail_task(argv[0]), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(argv[0]), MAILLOG_CLIENT_FLAG_NONE);
     mail_dict_init();
 
     /*
index 71d0daf027124dc1168997217687c362ef57b2f4..3c169f7282ea2b17ada1068fc39b4cce6dd71487 100644 (file)
@@ -190,6 +190,7 @@ static const char *pcf_valid_master_types[] = {
     MASTER_XPORT_NAME_FIFO,
     MASTER_XPORT_NAME_INET,
     MASTER_XPORT_NAME_PASS,
+    MASTER_XPORT_NAME_UXDG,
     0,
 };
 
index 2e9c9e58426d0a8af69bbc0d637637930c785532..6ae3f7a9f7b2653042555938cb268907811f5df2 100644 (file)
@@ -74,8 +74,8 @@ postdrop.o: ../../include/mail_queue.h
 postdrop.o: ../../include/mail_stream.h
 postdrop.o: ../../include/mail_task.h
 postdrop.o: ../../include/mail_version.h
+postdrop.o: ../../include/maillog_client.h
 postdrop.o: ../../include/msg.h
-postdrop.o: ../../include/msg_syslog.h
 postdrop.o: ../../include/msg_vstream.h
 postdrop.o: ../../include/mymalloc.h
 postdrop.o: ../../include/nvtable.h
index 96e0bbe359a9307620dd492fe5710a81d361825d..47b2e88b271e2183dad3b52948cd2be65e7ea8cf 100644 (file)
 /*     \fBpostconf\fR(5) for more details including examples.
 /* .IP "\fBalternate_config_directories (empty)\fR"
 /*     A list of non-default Postfix configuration directories that may
-/*     be specified with "-c config_directory" on the command line, or
-/*     via the MAIL_CONFIG environment parameter.
+/*     be specified with "-c config_directory" on the command line (in the
+/*     case of \fBsendmail\fR(1), with the "-C" option), or via the MAIL_CONFIG
+/*     environment parameter.
 /* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
 /*     The default location of the Postfix main.cf and master.cf
 /*     configuration files.
 /* .IP "\fBimport_environment (see 'postconf -d' output)\fR"
-/*     The list of environment parameters that a Postfix process will
-/*     import from a non-Postfix parent process.
+/*     The list of environment parameters that a privileged Postfix
+/*     process will import from a non-Postfix parent process, or name=value
+/*     environment overrides.
 /* .IP "\fBqueue_directory (see 'postconf -d' output)\fR"
 /*     The location of the Postfix top-level queue directory.
 /* .IP "\fBsyslog_facility (mail)\fR"
 #include <string.h>
 #include <stdlib.h>
 #include <signal.h>
-#include <syslog.h>
 #include <errno.h>
 #include <warn_stat.h>
 
 #include <vstream.h>
 #include <vstring.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <argv.h>
 #include <iostuff.h>
 #include <stringops.h>
 #include <user_acl.h>
 #include <rec_attr_map.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -184,9 +185,11 @@ static void postdrop_sig(int sig)
     /*
      * This is the fatal error handler. Don't try to do anything fancy.
      * 
-     * msg_vstream does not allocate memory, but msg_syslog may indirectly in
-     * syslog(), so it should not be called from a user-triggered signal
-     * handler.
+     * To avoid privilege escalation in a set-gid program, Postfix logging
+     * functions must not be called from a user-triggered signal handler,
+     * because Postfix logging functions may allocate memory on the fly (as
+     * does the syslog() library function), and the memory allocator is not
+     * reentrant.
      * 
      * Assume atomic signal() updates, even when emulated with sigaction(). We
      * use the in-kernel SIGINT handler address as an atomic variable to
@@ -270,7 +273,7 @@ int     main(int argc, char **argv)
      */
     argv[0] = "postdrop";
     msg_vstream_init(argv[0], VSTREAM_ERR);
-    msg_syslog_init(mail_task("postdrop"), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task("postdrop"), MAILLOG_CLIENT_FLAG_NONE);
     set_mail_conf_str(VAR_PROCNAME, var_procname = mystrdup(argv[0]));
 
     /*
@@ -303,16 +306,11 @@ int     main(int argc, char **argv)
 
     /*
      * Read the global configuration file and extract configuration
-     * information. Some claim that the user should supply the working
-     * directory instead. That might be OK, given that this command needs
-     * write permission in a subdirectory called "maildrop". However we still
-     * need to reliably detect incomplete input, and so we must perform
-     * record-level I/O. With that, we should also take the opportunity to
-     * perform some sanity checks on the input.
+     * information.
      */
     mail_conf_read();
     /* Re-evaluate mail_task() after reading main.cf. */
-    msg_syslog_init(mail_task("postdrop"), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task("postdrop"), MAILLOG_CLIENT_FLAG_NONE);
     get_mail_conf_str_table(str_table);
 
     /*
index 5f67eb7c7fd8311817bf4f09fa08897a007e5d58..56ff96b0b150ca7369a55bab34815ff9bff26f89 100644 (file)
@@ -69,8 +69,8 @@ postfix.o: ../../include/mail_conf.h
 postfix.o: ../../include/mail_params.h
 postfix.o: ../../include/mail_parm_split.h
 postfix.o: ../../include/mail_version.h
+postfix.o: ../../include/maillog_client.h
 postfix.o: ../../include/msg.h
-postfix.o: ../../include/msg_syslog.h
 postfix.o: ../../include/msg_vstream.h
 postfix.o: ../../include/safe.h
 postfix.o: ../../include/stringops.h
index 1b7e64feaa66b128fcb8a32b036bd9770ca12272..1758c411dad205f3f5f1cbc78497fc97f4b6b84e 100644 (file)
 /*     This is set when the -v command-line option is present.
 /* .IP \fBMAIL_DEBUG\fR
 /*     This is set when the -D command-line option is present.
+/* .PP
+/*     When the internal logging service is enabled (by setting a
+/*     non-empty maillog_file parameter value) the postfix(1)
+/*     command exports settings that are used by child processes
+/*     before they have processed main.cf or command-line settings.
+/* .IP \fBPOSTLOG_SERVICE
+/*     The name of the public postlog service endpoint.
+/* .IP \fBPOSTLOG_HOSTNAME
+/*     The hostname to prepend to internal logging.
 /* CONFIGURATION PARAMETERS
 /* .ad
 /* .fi
 /* .IP "\fBmulti_instance_enable (no)\fR"
 /*     Allow this Postfix instance to be started, stopped, etc., by a
 /*     multi-instance manager.
+/* .PP
+/*     Available in Postfix version 3.4 and later:
+/* .IP "\fBmaillog_file (empty)\fR"
+/*     The name of an optional logfile that is written by the Postfix
+/*     \fBpostlogd\fR(8) service.
+/* .IP "\fBpostlog_service_name (postlog)\fR"
+/*     The name of the \fBpostlogd\fR(8) service entry in master.cf.
 /* FILES
 /* .ad
 /* .fi
 /*     oqmgr(8), old Postfix queue manager
 /*     pickup(8), Postfix local mail pickup
 /*     pipe(8), deliver mail to non-Postfix command
+/*     postlogd(8), Postfix internal logging service
 /*     postscreen(8), Postfix zombie blocker
 /*     proxymap(8), Postfix lookup table proxy server
 /*     qmgr(8), Postfix queue manager
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
-#include <syslog.h>
 #ifdef USE_PATHS_H
 #include <paths.h>
 #endif
 
 #include <msg.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <stringops.h>
 #include <clean_env.h>
 #include <argv.h>
 #include <mail_params.h>
 #include <mail_version.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Additional installation parameters. */
 
@@ -476,7 +492,7 @@ int     main(int argc, char **argv)
        argv[0] = slash + 1;
     if (isatty(STDERR_FILENO))
        msg_vstream_init(argv[0], VSTREAM_ERR);
-    msg_syslog_init(argv[0], LOG_PID, LOG_FACILITY);
+    maillog_client_init(argv[0], MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
 
     /*
      * Check the Postfix library version as soon as we enable logging.
@@ -525,6 +541,22 @@ int     main(int argc, char **argv)
     mail_conf_read();
     get_mail_conf_str_table(str_table);
 
+    /*
+     * Environment import filter, to enforce consistent behavior whether this
+     * command is started by hand, or at system boot time. This is necessary
+     * because some shell scripts use environment settings to override
+     * main.cf settings.
+     */
+    import_env = mail_parm_split(VAR_IMPORT_ENVIRON, var_import_environ);
+    clean_env(import_env->argv);
+    argv_free(import_env);
+
+    /*
+     * This is after calling clean_env(), to ensure that POSTLOG_XXX exports
+     * will work, even if import_environment would remove them.
+     */
+    maillog_client_init(argv[0], MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
+
     /*
      * Alert the sysadmin that the backwards-compatible settings are still in
      * effect.
@@ -538,17 +570,6 @@ int     main(int argc, char **argv)
                 VAR_COMPAT_LEVEL "=%d\" and \"postfix reload\"",
                 CUR_COMPAT_LEVEL);
     }
-
-    /*
-     * Environment import filter, to enforce consistent behavior whether this
-     * command is started by hand, or at system boot time. This is necessary
-     * because some shell scripts use environment settings to override
-     * main.cf settings.
-     */
-    import_env = mail_parm_split(VAR_IMPORT_ENVIRON, var_import_environ);
-    clean_env(import_env->argv);
-    argv_free(import_env);
-
     check_setenv("PATH", ROOT_PATH);           /* sys_defs.h */
     check_setenv(CONF_ENV_PATH, var_config_dir);/* mail_conf.h */
 
index 4adcf848c5a4031b9fca9618120c06587c083458..dde3dbf9fdbe57dd9cd7827f32ac3152078cfa21 100644 (file)
@@ -88,7 +88,6 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
-#include <syslog.h>
 #include <string.h>
 #include <stdlib.h>
 
@@ -151,8 +150,8 @@ int     main(int argc, char **argv)
        msg_verbose = 1;
 
     /*
-     * Initialize. Set up logging, read the global configuration file and
-     * extract configuration information.
+     * Initialize. Set up logging. Read the global configuration file after
+     * parsing command-line arguments.
      */
     if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
        argv[0] = slash + 1;
index 28f7276c89bb437a2d57ccde4cdfa504e398e735..84ee53e4b602851bc163f0c5876ef773ec1fc7d8 100644 (file)
@@ -70,9 +70,9 @@ postlog.o: ../../include/mail_params.h
 postlog.o: ../../include/mail_parm_split.h
 postlog.o: ../../include/mail_task.h
 postlog.o: ../../include/mail_version.h
+postlog.o: ../../include/maillog_client.h
 postlog.o: ../../include/msg.h
 postlog.o: ../../include/msg_output.h
-postlog.o: ../../include/msg_syslog.h
 postlog.o: ../../include/msg_vstream.h
 postlog.o: ../../include/sys_defs.h
 postlog.o: ../../include/vbuf.h
index 9e3861a72c32031a3535055121614d6fc17b2fc9..e7bb9b41eef4c371681cd251cd18967cf4d9c22b 100644 (file)
 /*     line, \fBpostlog\fR(1) reads from standard input and logs each input
 /*     line as one record.
 /*
-/*     Logging is sent to \fBsyslogd\fR(8); when the standard error stream
-/*     is connected to a terminal, logging is sent there as well.
+/*     By default, logging is sent to \fBsyslogd\fR(8); when the
+/*     standard error stream is connected to a terminal, logging
+/*     is sent there as well.
 /*
 /*     The following options are implemented:
 /* .IP "\fB-c \fIconfig_dir\fR"
 /*     Read the \fBmain.cf\fR configuration file in the named directory
 /*     instead of the default configuration directory.
-/* .IP \fB-i\fR
-/*     Include the process ID in the logging tag.
+/* .IP "\fB-i\fR (obsolete)"
+/*     Include the process ID in the logging tag. This flag is ignored as
+/*     of Postfix 3.4, where the PID is always included.
 /* .IP "\fB-p \fIpriority\fR (default: \fBinfo\fR)"
 /*     Specifies the logging severity: \fBinfo\fR, \fBwarn\fR,
 /*     \fBerror\fR, \fBfatal\fR, or \fBpanic\fR. With Postfix 3.1
 /* .IP "\fBsyslog_name (see 'postconf -d' output)\fR"
 /*     A prefix that is prepended to the process name in syslog
 /*     records, so that, for example, "smtpd" becomes "prefix/smtpd".
+/* .PP
+/*     Available in Postfix 3.4 and later:
+/* .IP "\fBmaillog_file (empty)\fR"
+/*     The name of an optional logfile that is written by the Postfix
+/*     \fBpostlogd\fR(8) service.
+/* .IP "\fBpostlog_service_name (postlog)\fR"
+/*     The name of the \fBpostlogd\fR(8) service entry in master.cf.
 /* SEE ALSO
 /*     postconf(5), configuration parameters
 /*     syslogd(8), syslog daemon
+/*     postlogd(8), internal logging service
 /* LICENSE
 /* .ad
 /* .fi
@@ -88,7 +98,6 @@
 #include <sys_defs.h>
 #include <sys/stat.h>
 #include <string.h>
-#include <syslog.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <vstring_vstream.h>
 #include <msg_output.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <warn_stat.h>
 #include <clean_env.h>
 
 #include <mail_conf.h>
 #include <mail_task.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -162,7 +171,7 @@ static void log_argv(int level, char **argv)
        if (*argv)
            vstring_strcat(buf, " ");
     }
-    msg_text(level, vstring_str(buf));
+    msg_printf(level, "%s", vstring_str(buf));
     vstring_free(buf);
 }
 
@@ -173,7 +182,7 @@ static void log_stream(int level, VSTREAM *fp)
     VSTRING *buf = vstring_alloc(100);
 
     while (vstring_get_nonl(buf, fp) != VSTREAM_EOF)
-       msg_text(level, vstring_str(buf));
+       msg_printf(level, "%s", vstring_str(buf));
     vstring_free(buf);
 }
 
@@ -187,7 +196,6 @@ int     main(int argc, char **argv)
     int     fd;
     int     ch;
     const char *tag;
-    int     log_flags = 0;
     int     level = MSG_INFO;
     ARGV   *import_env;
 
@@ -217,7 +225,7 @@ int     main(int argc, char **argv)
     tag = mail_task(argv[0]);
     if (isatty(STDERR_FILENO))
        msg_vstream_init(tag, VSTREAM_ERR);
-    msg_syslog_init(tag, LOG_PID, LOG_FACILITY);
+    maillog_client_init(tag, MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
 
     /*
      * Check the Postfix library version as soon as we enable logging.
@@ -238,7 +246,6 @@ int     main(int argc, char **argv)
                msg_fatal("out of memory");
            break;
        case 'i':
-           log_flags |= LOG_PID;
            break;
        case 'p':
            level = level_map(optarg);
@@ -270,7 +277,7 @@ int     main(int argc, char **argv)
      */
     if (isatty(STDERR_FILENO))
        msg_vstream_init(tag, VSTREAM_ERR);
-    msg_syslog_init(tag, LOG_PID, LOG_FACILITY);
+    maillog_client_init(tag, MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
 
     /*
      * Log the command line or log lines from standard input.
diff --git a/postfix/src/postlogd/Makefile.in b/postfix/src/postlogd/Makefile.in
new file mode 100644 (file)
index 0000000..bdf7d05
--- /dev/null
@@ -0,0 +1,74 @@
+SHELL  = /bin/sh
+SRCS   = postlogd.c
+OBJS   = postlogd.o
+HDRS   = 
+TESTSRC        =
+DEFS   = -I. -I$(INC_DIR) -D$(SYSTYPE)
+CFLAGS = $(DEBUG) $(OPT) $(DEFS)
+TESTPROG= 
+PROG   = postlogd
+INC_DIR = ../../include
+LIBS   = ../../lib/lib$(LIB_PREFIX)dns$(LIB_SUFFIX) \
+       ../../lib/lib$(LIB_PREFIX)master$(LIB_SUFFIX) \
+       ../../lib/lib$(LIB_PREFIX)global$(LIB_SUFFIX) \
+       ../../lib/lib$(LIB_PREFIX)util$(LIB_SUFFIX)
+
+.c.o:; $(CC) $(CFLAGS) -c $*.c
+
+$(PROG): $(OBJS) $(LIBS)
+       $(CC) $(CFLAGS) $(SHLIB_RPATH) -o $@ $(OBJS) $(LIBS) $(SYSLIBS)
+
+$(OBJS): ../../conf/makedefs.out
+
+Makefile: Makefile.in
+       cat ../../conf/makedefs.out $? >$@
+
+test:  $(TESTPROG)
+
+tests: test
+
+root_tests:
+
+update: ../../libexec/$(PROG)
+
+../../libexec/$(PROG): $(PROG)
+       cp $(PROG) ../../libexec
+
+printfck: $(OBJS) $(PROG)
+       rm -rf printfck
+       mkdir printfck
+       sed '1,/^# do not edit/!d' Makefile >printfck/Makefile
+       set -e; for i in *.c; do printfck -f .printfck $$i >printfck/$$i; done
+       cd printfck; make "INC_DIR=../../../include" `cd ..; ls *.o`
+
+lint:
+       lint $(DEFS) $(SRCS) $(LINTFIX)
+
+clean:
+       rm -f *.o *core $(PROG) $(TESTPROG) junk 
+       rm -rf printfck
+
+tidy:  clean
+
+depend: $(MAKES)
+       (sed '1,/^# do not edit/!d' Makefile.in; \
+       set -e; for i in [a-z][a-z0-9]*.c; do \
+           $(CC) -E $(DEFS) $(INCL) $$i | grep -v '[<>]' | sed -n -e '/^# *1 *"\([^"]*\)".*/{' \
+           -e 's//'`echo $$i|sed 's/c$$/o/'`': \1/' \
+           -e 's/o: \.\//o: /' -e p -e '}' ; \
+       done | LANG=C sort -u) | grep -v '[.][o][:][ ][/]' >$$$$ && mv $$$$ Makefile.in
+       @$(EXPORT) make -f Makefile.in Makefile 1>&2
+
+# do not edit below this line - it is generated by 'make depend'
+postlogd.o: ../../include/check_arg.h
+postlogd.o: ../../include/logwriter.h
+postlogd.o: ../../include/mail_conf.h
+postlogd.o: ../../include/mail_params.h
+postlogd.o: ../../include/mail_server.h
+postlogd.o: ../../include/mail_version.h
+postlogd.o: ../../include/msg.h
+postlogd.o: ../../include/msg_logger.h
+postlogd.o: ../../include/sys_defs.h
+postlogd.o: ../../include/vbuf.h
+postlogd.o: ../../include/vstream.h
+postlogd.o: postlogd.c
diff --git a/postfix/src/postlogd/postlogd.c b/postfix/src/postlogd/postlogd.c
new file mode 100644 (file)
index 0000000..5461e1a
--- /dev/null
@@ -0,0 +1,251 @@
+/*++
+/* NAME
+/*     postlogd 8
+/* SUMMARY
+/*     Postfix internal log server
+/* SYNOPSIS
+/*     \fBpostlogd\fR [generic Postfix daemon options]
+/* DESCRIPTION
+/*     This program logs events on behalf of Postfix programs
+/*     when the maillog configuration parameter specifies a non-empty
+/*     value.
+/* BUGS
+/*     Non-daemon Postfix programs don't know that they should log
+/*     to the internal logging service before they have processed
+/*     command-line options and main.cf parameters. These programs
+/*     still log earlier events to the syslog service.
+/*
+/*     If Postfix is down, the non-daemon programs \fBpostfix\fR(1),
+/*     \fBpostsuper\fR(1), \fBpostmulti\fR(1), and \fBpostlog\fR(1),
+/*     will log directly to \fB$maillog_file\fR. These programs
+/*     expect to run with root privileges, for example during
+/*     Postfix start-up, reload, or shutdown.
+/*
+/*     Other non-daemon Postfix programs will never write directly to
+/*     \fB$maillog_file\fR (also, logging to stdout would interfere
+/*     with the operation of some of these programs). These programs
+/*     can log to \fBpostlogd\fR(8) if they are run by the super-user,
+/*     or if their executable file has set-gid permission. Do not
+/*     set this permision on programs other than \fBpostdrop\fR(1)
+/*     and \fBpostqueue\fR(1).
+/* CONFIGURATION PARAMETERS
+/* .ad
+/* .fi
+/*     Changes to \fBmain.cf\fR are picked up automatically, as
+/*     \fBpostlogd\fR(8) processes run for only a limited amount
+/*     of time. Use the command "\fBpostfix reload\fR" to speed
+/*     up a change.
+/*
+/*     The text below provides only a parameter summary. See
+/*     \fBpostconf\fR(5) for more details including examples.
+/* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
+/*     The default location of the Postfix main.cf and master.cf
+/*     configuration files.
+/* .IP "\fBmaillog_file (empty)\fR"
+/*     The name of an optional logfile that is written by the Postfix
+/*     \fBpostlogd\fR(8) service.
+/* .IP "\fBprocess_id (read-only)\fR"
+/*     The process ID of a Postfix command or daemon process.
+/* .IP "\fBprocess_name (read-only)\fR"
+/*     The process name of a Postfix command or daemon process.
+/* .IP "\fBsyslog_name (see 'postconf -d' output)\fR"
+/*     A prefix that is prepended to the process name in syslog
+/*     records, so that, for example, "smtpd" becomes "prefix/smtpd".
+/* .IP "\fBservice_name (read-only)\fR"
+/*     The master.cf service name of a Postfix daemon process.
+/* .IP "\fBpostlogd_watchdog_timeout (10s)\fR"
+/*     How much time a \fBpostlogd\fR(8) process may take to process a request
+/*     before it is terminated by a built-in watchdog timer.
+/* SEE ALSO
+/*     postconf(5), configuration parameters
+/*     syslogd(5), system logging
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* HISTORY
+/* .ad
+/* .fi
+/*     This service was introduced with Postfix version 3.4.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+ /*
+  * System library.
+  */
+#include <sys_defs.h>
+
+ /*
+  * Utility library.
+  */
+#include <logwriter.h>
+#include <msg.h>
+#include <msg_logger.h>
+#include <stringops.h>
+#include <vstream.h>
+
+ /*
+  * Global library.
+  */
+#include <mail_params.h>
+#include <mail_task.h>
+#include <mail_version.h>
+#include <maillog_client.h>
+
+ /*
+  * Server skeleton.
+  */
+#include <mail_server.h>
+
+ /*
+  * Tunable parameters.
+  */
+int     var_postlogd_watchdog;
+
+ /*
+  * Silly little macros.
+  */
+#define STR(x)                 vstring_str(x)
+#define LEN(x)                 VSTRING_LEN(x)
+
+ /*
+  * Logfile stream.
+  */
+static VSTREAM *postlogd_stream = 0;
+
+/* postlogd_fallback - log messages from postlogd(8) itself */
+
+static void postlogd_fallback(const char *buf)
+{
+    (void) logwriter_write(postlogd_stream, buf, strlen(buf));
+}
+
+/* postlogd_service - perform service for client */
+
+static void postlogd_service(char *buf, ssize_t len, char *unused_service,
+                                    char **unused_argv)
+{
+
+    if (postlogd_stream) {
+       (void) logwriter_write(postlogd_stream, buf, len);
+    }
+
+    /*
+     * After a configuration change that removes the maillog_file pathname,
+     * this service may still receive messages (after "postfix reload" or
+     * after process refresh) from programs that use the old maillog_file
+     * setting. Redirect those messages to the current logging mechanism.
+     */
+    else {
+       char   *bp = buf;
+       char   *progname_pid;
+
+       /*
+        * Avoid surprises: strip off the date, time, host, and program[pid]:
+        * prefix that were prepended by msg_logger(3). Then, hope that the
+        * current logging driver suppresses its own PID, when it sees that
+        * there is a PID embedded in the 'program name'.
+        */
+       (void) mystrtok(&bp, CHARS_SPACE);      /* month */
+       (void) mystrtok(&bp, CHARS_SPACE);      /* day */
+       (void) mystrtok(&bp, CHARS_SPACE);      /* time */
+       (void) mystrtok(&bp, CHARS_SPACE);      /* host */
+       progname_pid = mystrtok(&bp, ":" CHARS_SPACE);  /* name[pid] sans ':' */
+       bp += strspn(bp, CHARS_SPACE);
+       if (progname_pid)
+           maillog_client_init(progname_pid, MAILLOG_CLIENT_FLAG_NONE);
+       msg_info("%.*s", (int) (len - (bp - buf)), bp);
+
+       /*
+        * Restore the program name, in case postlogd(8) needs to log
+        * something about itself. We have to call maillog_client_init() in
+        * any case, because neither msg_syslog_init() nor openlog() make a
+        * copy of the name argument. We can't leave that pointing into the
+        * middle of the above message buffer.
+        */
+       maillog_client_init(mail_task((char *) 0), MAILLOG_CLIENT_FLAG_NONE);
+    }
+}
+
+/* pre_jail_init - pre-jail handling */
+
+static void pre_jail_init(char *unused_service_name, char **argv)
+{
+
+    /*
+     * During process initialization, the postlogd daemon will log events to
+     * the postlog socket, so that they can be logged to file later. Once the
+     * postlogd daemon is handling requests, it will stop logging to the
+     * postlog socket and will instead write to the logfile, to avoid
+     * infinite recursion.
+     */
+
+    /*
+     * Sanity check. This service takes no command-line arguments.
+     */
+    if (argv[0])
+       msg_fatal("unexpected command-line argument: %s", argv[0]);
+
+    /*
+     * After a configuration change that removes the maillog_file pathname,
+     * this service may still receive messages from processes that still use
+     * the old configuration. Those messages will have to be redirected to
+     * the current logging subsystem.
+     */
+    if (*var_maillog_file != 0) {
+
+       /*
+        * Instantiate the logwriter or bust.
+        */
+       postlogd_stream = logwriter_open_or_die(var_maillog_file);
+
+       /*
+        * Inform the msg_logger client to stop using the postlog socket, and
+        * to call our logwriter.
+        */
+       msg_logger_control(CA_MSG_LOGGER_CTL_FALLBACK_ONLY,
+                          CA_MSG_LOGGER_CTL_FALLBACK_FN(postlogd_fallback),
+                          CA_MSG_LOGGER_CTL_END);
+    }
+}
+
+/* post_jail_init - post-jail initialization */
+
+static void post_jail_init(char *unused_name, char **unused_argv)
+{
+
+    /*
+     * Prevent automatic process suicide after a limited number of client
+     * requests. It is OK to terminate after a limited amount of idle time.
+     */
+    var_use_limit = 0;
+}
+
+MAIL_VERSION_STAMP_DECLARE;
+
+/* main - pass control to the multi-threaded skeleton */
+
+int     main(int argc, char **argv)
+{
+    static const CONFIG_TIME_TABLE time_table[] = {
+       VAR_POSTLOGD_WATCHDOG, DEF_POSTLOGD_WATCHDOG, &var_postlogd_watchdog, 10, 0,
+       0,
+    };
+
+    /*
+     * Fingerprint executables and core dumps.
+     */
+    MAIL_VERSION_STAMP_ALLOCATE;
+
+    dgram_server_main(argc, argv, postlogd_service,
+                     CA_MAIL_SERVER_TIME_TABLE(time_table),
+                     CA_MAIL_SERVER_PRE_INIT(pre_jail_init),
+                     CA_MAIL_SERVER_POST_INIT(post_jail_init),
+                     CA_MAIL_SERVER_SOLITARY,
+                     CA_MAIL_SERVER_WATCHDOG(&var_postlogd_watchdog),
+                     0);
+}
index 6850eb7925429fa196f815d565e470dc01421f49..3667bb65b42f763f01a033a81fab4a730c74d427 100644 (file)
@@ -113,10 +113,10 @@ postmap.o: ../../include/mail_params.h
 postmap.o: ../../include/mail_parm_split.h
 postmap.o: ../../include/mail_task.h
 postmap.o: ../../include/mail_version.h
+postmap.o: ../../include/maillog_client.h
 postmap.o: ../../include/mime_state.h
 postmap.o: ../../include/mkmap.h
 postmap.o: ../../include/msg.h
-postmap.o: ../../include/msg_syslog.h
 postmap.o: ../../include/msg_vstream.h
 postmap.o: ../../include/myflock.h
 postmap.o: ../../include/mymalloc.h
index db40a38c3c21d10ea9accb423642bd0deb77d106..3b520e3bf503b10bc0fedcd86ff88a27f491993c 100644 (file)
 #include <vstring.h>
 #include <vstream.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <readlline.h>
 #include <stringops.h>
 #include <split_at.h>
 #include <mime_state.h>
 #include <rec_type.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -959,13 +959,13 @@ int     main(int argc, char **argv)
        msg_verbose = 1;
 
     /*
-     * Initialize. Set up logging, read the global configuration file and
-     * extract configuration information.
+     * Initialize. Set up logging. Read the global configuration file after
+     * parsing command-line arguments.
      */
     if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
        argv[0] = slash + 1;
     msg_vstream_init(argv[0], VSTREAM_ERR);
-    msg_syslog_init(mail_task(argv[0]), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(argv[0]), MAILLOG_CLIENT_FLAG_NONE);
 
     /*
      * Check the Postfix library version as soon as we enable logging.
@@ -1056,7 +1056,7 @@ int     main(int argc, char **argv)
     update_env(import_env->argv);
     argv_free(import_env);
     /* Re-evaluate mail_task() after reading main.cf. */
-    msg_syslog_init(mail_task(argv[0]), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(argv[0]), MAILLOG_CLIENT_FLAG_NONE);
     mail_dict_init();
     if ((query == 0 || strcmp(query, "-") != 0)
        && (postmap_flags & POSTMAP_FLAG_ANY_KEY))
index e6ea5d4fdee3c23acd1bf9c8b645b05f5f6abb64..f2e3680bf5d3f4f9837a00763da9f570dbee71e1 100644 (file)
@@ -70,8 +70,8 @@ postmulti.o: ../../include/mail_conf.h
 postmulti.o: ../../include/mail_params.h
 postmulti.o: ../../include/mail_parm_split.h
 postmulti.o: ../../include/mail_version.h
+postmulti.o: ../../include/maillog_client.h
 postmulti.o: ../../include/msg.h
-postmulti.o: ../../include/msg_syslog.h
 postmulti.o: ../../include/msg_vstream.h
 postmulti.o: ../../include/mymalloc.h
 postmulti.o: ../../include/name_code.h
index a6b132e4edbbd3c2c139cbe8a50ae6e9dd148472..bffb8edfa0c852c8795562e263e49dda7022b978 100644 (file)
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System library. */
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
-#include <syslog.h>
 #include <errno.h>
 #include <ctype.h>
 #ifdef USE_PATHS_H
 
 #include <msg.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <vstream.h>
 #include <vstring_vstream.h>
 #include <stringops.h>
 #include <mail_params.h>
 #include <mail_conf.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -1687,20 +1691,30 @@ int     main(int argc, char **argv)
        argv[0] = slash + 1;
     if (isatty(STDERR_FILENO))
        msg_vstream_init(argv[0], VSTREAM_ERR);
-    msg_syslog_init(argv[0], LOG_PID, LOG_FACILITY);
+    maillog_client_init(argv[0], MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
 
     /*
      * Check the Postfix library version as soon as we enable logging.
      */
     MAIL_VERSION_CHECK;
 
+    /*
+     * Process main.cf parameters. This is done before the GETOPT() loop to
+     * improve logging. This assumes that no command-line option can affect
+     * parameter processing.
+     */
+    mail_conf_read();
+    get_mail_conf_str_table(str_table);
+    maillog_client_init(argv[0], MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
+
     if ((config_dir = getenv(CONF_ENV_PATH)) != 0
        && strcmp(config_dir, DEF_CONFIG_DIR) != 0)
        msg_fatal("Non-default configuration directory: %s=%s",
                  CONF_ENV_PATH, config_dir);
 
     /*
-     * Parse switches.
+     * Parse switches. Move the above mail_conf_read() block after this loop,
+     * if any command-line option can affect parameter processing.
      */
     while ((ch = GETOPT(argc, argv, "ae:g:i:G:I:lpRvx")) > 0) {
        switch (ch) {
@@ -1814,12 +1828,6 @@ int     main(int argc, char **argv)
                      EDIT_CMD_STR(cmd_mode));
     }
 
-    /*
-     * Process main.cf parameters.
-     */
-    mail_conf_read();
-    get_mail_conf_str_table(str_table);
-
     /*
      * Sanity checks.
      */
index e9f2bf23a1251dad2b96956d0a7428a87bac403d..f01c3ae3d64afe7dfff79de72343013128a8a666 100644 (file)
@@ -77,8 +77,8 @@ postqueue.o: ../../include/mail_queue.h
 postqueue.o: ../../include/mail_run.h
 postqueue.o: ../../include/mail_task.h
 postqueue.o: ../../include/mail_version.h
+postqueue.o: ../../include/maillog_client.h
 postqueue.o: ../../include/msg.h
-postqueue.o: ../../include/msg_syslog.h
 postqueue.o: ../../include/msg_vstream.h
 postqueue.o: ../../include/mymalloc.h
 postqueue.o: ../../include/nvtable.h
index 2cde36391b5b86cfb96b5700d4c7a759189f3562..68d5b7342e1bd50a405c127b6a44d926e732e6cb 100644 (file)
 #include <clean_env.h>
 #include <vstream.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <argv.h>
 #include <safe.h>
 #include <connect.h>
 #include <valid_mailhost_addr.h>
 #include <mail_dict.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -566,15 +566,14 @@ int     main(int argc, char **argv)
            msg_fatal_status(EX_UNAVAILABLE, "open /dev/null: %m");
 
     /*
-     * Initialize. Set up logging, read the global configuration file and
-     * extract configuration information. Set up signal handlers so that we
-     * can clean up incomplete output.
-     * Censor the process name: it is provided by the user.
+     * Initialize. Set up logging. Read the global configuration file after
+     * parsing command-line arguments. Censor the process name: it is
+     * provided by the user.
      */
     argv[0] = "postqueue";
     msg_vstream_init(argv[0], VSTREAM_ERR);
     msg_cleanup(unavailable);
-    msg_syslog_init(mail_task("postqueue"), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task("postqueue"), MAILLOG_CLIENT_FLAG_NONE);
     set_mail_conf_str(VAR_PROCNAME, var_procname = mystrdup(argv[0]));
 
     /*
@@ -637,7 +636,7 @@ int     main(int argc, char **argv)
      */
     mail_conf_read();
     /* Re-evaluate mail_task() after reading main.cf. */
-    msg_syslog_init(mail_task("postqueue"), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task("postqueue"), MAILLOG_CLIENT_FLAG_NONE);
     mail_dict_init();                          /* proxy, sql, ldap */
     get_mail_conf_str_table(str_table);
 
index e130daa559a5f4bd7ecf20491dcb084524922fa0..38ae3a92fcb8ad5c725afeec89c0f8df0c5614ee 100644 (file)
@@ -69,8 +69,8 @@ postsuper.o: ../../include/mail_parm_split.h
 postsuper.o: ../../include/mail_queue.h
 postsuper.o: ../../include/mail_task.h
 postsuper.o: ../../include/mail_version.h
+postsuper.o: ../../include/maillog_client.h
 postsuper.o: ../../include/msg.h
-postsuper.o: ../../include/msg_syslog.h
 postsuper.o: ../../include/msg_vstream.h
 postsuper.o: ../../include/mymalloc.h
 postsuper.o: ../../include/myrand.h
index 2bad6f32084e7b30853ecbf57b05c1ae898130cf..3d356412e66ecf59429ca27508f2eca9690cb6fa 100644 (file)
 
 #include <mymalloc.h>
 #include <msg.h>
-#include <msg_syslog.h>
 #include <vstream.h>
 #include <msg_vstream.h>
 #include <scan_dir.h>
 #include <mail_open_ok.h>
 #include <file_id.h>
 #include <mail_parm_split.h>
+#include <maillog_client.h>
 
 /* Application-specific. */
 
@@ -1149,7 +1149,8 @@ int     main(int argc, char **argv)
     if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
        argv[0] = slash + 1;
     msg_vstream_init(argv[0], VSTREAM_ERR);
-    msg_syslog_init(mail_task(argv[0]), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(argv[0]),
+                       MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
     set_mail_conf_str(VAR_PROCNAME, var_procname = mystrdup(argv[0]));
 
     /*
@@ -1242,7 +1243,8 @@ int     main(int argc, char **argv)
     update_env(import_env->argv);
     argv_free(import_env);
     /* Re-evaluate mail_task() after reading main.cf. */
-    msg_syslog_init(mail_task(argv[0]), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task(argv[0]),
+                       MAILLOG_CLIENT_FLAG_LOGWRITER_FALLBACK);
     if (chdir(var_queue_dir))
        msg_fatal("chdir %s: %m", var_queue_dir);
 
index ee023f4345b73597c99f93b38aa8dbf7d679bb47..bb0298a2ae8450bda8875808d6a253f476379f79 100644 (file)
@@ -83,10 +83,10 @@ sendmail.o: ../../include/mail_run.h
 sendmail.o: ../../include/mail_stream.h
 sendmail.o: ../../include/mail_task.h
 sendmail.o: ../../include/mail_version.h
+sendmail.o: ../../include/maillog_client.h
 sendmail.o: ../../include/mime_state.h
 sendmail.o: ../../include/msg.h
 sendmail.o: ../../include/msg_stats.h
-sendmail.o: ../../include/msg_syslog.h
 sendmail.o: ../../include/msg_vstream.h
 sendmail.o: ../../include/mymalloc.h
 sendmail.o: ../../include/name_code.h
index 0f9e580b8193f3da51fff88e9453c48d51694629..f4f9d8df6e214cc4bfb623b14a48c24cc6878d91 100644 (file)
 #include <stdlib.h>
 #include <signal.h>
 #include <fcntl.h>
-#include <syslog.h>
 #include <time.h>
 #include <errno.h>
 #include <ctype.h>
 #include <mymalloc.h>
 #include <vstream.h>
 #include <msg_vstream.h>
-#include <msg_syslog.h>
 #include <vstring_vstream.h>
 #include <username.h>
 #include <fullname.h>
 #include <name_code.h>
 #include <warn_stat.h>
 #include <clean_env.h>
+#include <maillog_client.h>
 
 /* Global library. */
 
@@ -1049,15 +1048,15 @@ int     main(int argc, char **argv)
        debug_me = 1;
 
     /*
-     * Initialize. Set up logging, read the global configuration file and
-     * extract configuration information. Set up signal handlers so that we
-     * can clean up incomplete output.
+     * Initialize. Set up logging. Read the global configuration file after
+     * command-line processing. Set up signal handlers so that we can clean
+     * up incomplete output.
      */
     if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
        argv[0] = slash + 1;
     msg_vstream_init(argv[0], VSTREAM_ERR);
     msg_cleanup(tempfail);
-    msg_syslog_init(mail_task("sendmail"), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task("sendmail"), MAILLOG_CLIENT_FLAG_NONE);
     set_mail_conf_str(VAR_PROCNAME, var_procname = mystrdup(argv[0]));
 
     /*
@@ -1112,7 +1111,7 @@ int     main(int argc, char **argv)
     update_env(import_env->argv);
     argv_free(import_env);
     /* Re-evaluate mail_task() after reading main.cf. */
-    msg_syslog_init(mail_task("sendmail"), LOG_PID, LOG_FACILITY);
+    maillog_client_init(mail_task("sendmail"), MAILLOG_CLIENT_FLAG_NONE);
     get_mail_conf_str_table(str_table);
 
     mail_dict_init();
index f36c17a41fefbed0865ef68d4b7623516bda80ba..9f4a8f14497117c71f5d90f48f35cb46ea5bf820 100644 (file)
@@ -47,19 +47,18 @@ tests: tls_certkey_tests
 
 tls_certkey_tests: test
        @echo Testing loading of keys and certs
-       @export LD_LIBRARY_PATH=../../lib; \
-       for pem in goodchains.pem; do \
-           ./tls_certkey $$pem > $$pem.out 2>&1 || exit 1; \
+       @for pem in goodchains.pem; do \
+           $(SHLIB_ENV) $(VALGRIND) ./tls_certkey $$pem > $$pem.out 2>&1 || exit 1; \
            diff $$pem.ref $$pem.out || exit 1; \
            echo "  $$pem: OK"; \
        done; \
        for pem in *-mixed-*.pem ; do \
-           ./tls_certkey -m $$pem > $$pem.out 2>&1 || exit 1; \
+           $(SHLIB_ENV) $(VALGRIND) ./tls_certkey -m $$pem > $$pem.out 2>&1 || exit 1; \
            diff $$pem.ref $$pem.out || exit 1; \
            echo "  $$pem: OK"; \
        done; \
        for pem in bad-*.pem; do \
-           ./tls_certkey $$pem > $$pem.out 2>&1 && exit 1 || : ok; \
+           $(SHLIB_ENV) $(VALGRIND) ./tls_certkey $$pem > $$pem.out 2>&1 && exit 1 || : ok; \
            egrep -v 'TLS library problem' $$pem.out | diff $$pem.ref - || \
            exit 1; \
            echo "  $$pem: OK"; \
index dec308109f4284a7aee43c16104385a0e2584548..381bb6e1310fa027de9d665f012c27027a04cd8b 100644 (file)
@@ -40,7 +40,8 @@ SRCS  = alldig.c allprint.c argv.c argv_split.c attr_clnt.c attr_print0.c \
        poll_fd.c timecmp.c slmdb.c dict_pipe.c dict_random.c \
        valid_utf8_hostname.c midna_domain.c argv_splitq.c balpar.c dict_union.c \
        extpar.c dict_inline.c casefold.c dict_utf8.c strcasecmp_utf8.c \
-       split_qnameval.c argv_attr_print.c argv_attr_scan.c dict_file.c
+       split_qnameval.c argv_attr_print.c argv_attr_scan.c dict_file.c \
+       msg_logger.c logwriter.c unix_dgram_connect.c unix_dgram_listen.c
 OBJS   = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \
        attr_print64.o attr_print_plain.o attr_scan0.o attr_scan64.o \
        attr_scan_plain.o auto_clnt.o base64_code.o basename.o binhash.o \
@@ -82,7 +83,8 @@ OBJS  = alldig.o allprint.o argv.o argv_split.o attr_clnt.o attr_print0.o \
        poll_fd.o timecmp.o $(NON_PLUGIN_MAP_OBJ) dict_pipe.o dict_random.o \
        valid_utf8_hostname.o midna_domain.o argv_splitq.o balpar.o dict_union.o \
        extpar.o dict_inline.o casefold.o dict_utf8.o strcasecmp_utf8.o \
-       split_qnameval.o argv_attr_print.o argv_attr_scan.o dict_file.o
+       split_qnameval.o argv_attr_print.o argv_attr_scan.o dict_file.o \
+       msg_logger.o logwriter.o unix_dgram_connect.o unix_dgram_listen.o
 # MAP_OBJ is for maps that may be dynamically loaded with dynamicmaps.cf.
 # When hard-linking these, makedefs sets NON_PLUGIN_MAP_OBJ=$(MAP_OBJ),
 # otherwise it sets the PLUGIN_* macros.
@@ -112,7 +114,7 @@ HDRS        = argv.h attr.h attr_clnt.h auto_clnt.h base64_code.h binhash.h \
        dict_fail.h warn_stat.h dict_sockmap.h line_number.h timecmp.h \
        slmdb.h compat_va_copy.h dict_pipe.h dict_random.h \
        valid_utf8_hostname.h midna_domain.h dict_union.h dict_inline.h \
-       check_arg.h argv_attr.h
+       check_arg.h argv_attr.h msg_logger.h logwriter.h
 TESTSRC        = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
        stream_test.c dup2_pass_on_exec.c
 DEFS   = -I. -D$(SYSTYPE)
@@ -132,7 +134,7 @@ TESTPROG= dict_open dup2_pass_on_exec events exec_command fifo_open \
        myaddrinfo myaddrinfo4 inet_proto sane_basename format_tv \
        valid_utf8_string ip_match base32_code msg_rate_delay netstring \
        vstream timecmp dict_cache midna_domain casefold strcasecmp_utf8 \
-       vbuf_print split_qnameval vstream
+       vbuf_print split_qnameval vstream msg_logger
 PLUGIN_MAP_SO = $(LIB_PREFIX)pcre$(LIB_SUFFIX)
 
 LIB_DIR        = ../../lib
@@ -217,6 +219,11 @@ vstring: $(LIB)
        $(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
        mv junk $@.o
 
+msg_logger: msg_logger.c $(LIB)
+       mv $@.o junk
+       $(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
+       mv junk $@.o
+
 msg_syslog: msg_syslog.c $(LIB)
        mv $@.o junk
        $(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
@@ -1906,6 +1913,17 @@ load_lib.o: load_lib.c
 load_lib.o: load_lib.h
 load_lib.o: msg.h
 load_lib.o: sys_defs.h
+logwriter.o: check_arg.h
+logwriter.o: iostuff.h
+logwriter.o: logwriter.c
+logwriter.o: logwriter.h
+logwriter.o: msg.h
+logwriter.o: mymalloc.h
+logwriter.o: safe_open.h
+logwriter.o: sys_defs.h
+logwriter.o: vbuf.h
+logwriter.o: vstream.h
+logwriter.o: vstring.h
 lowercase.o: check_arg.h
 lowercase.o: lowercase.c
 lowercase.o: stringops.h
@@ -1996,6 +2014,20 @@ msg.o: msg.c
 msg.o: msg.h
 msg.o: msg_output.h
 msg.o: sys_defs.h
+msg_logger.o: check_arg.h
+msg_logger.o: connect.h
+msg_logger.o: iostuff.h
+msg_logger.o: logwriter.h
+msg_logger.o: msg.h
+msg_logger.o: msg_logger.c
+msg_logger.o: msg_logger.h
+msg_logger.o: msg_output.h
+msg_logger.o: mymalloc.h
+msg_logger.o: safe.h
+msg_logger.o: sys_defs.h
+msg_logger.o: vbuf.h
+msg_logger.o: vstream.h
+msg_logger.o: vstring.h
 msg_output.o: check_arg.h
 msg_output.o: msg_output.c
 msg_output.o: msg_output.h
@@ -2019,6 +2051,7 @@ msg_syslog.o: msg.h
 msg_syslog.o: msg_output.h
 msg_syslog.o: msg_syslog.c
 msg_syslog.o: msg_syslog.h
+msg_syslog.o: mymalloc.h
 msg_syslog.o: safe.h
 msg_syslog.o: stringops.h
 msg_syslog.o: sys_defs.h
@@ -2410,6 +2443,17 @@ unix_connect.o: sane_connect.h
 unix_connect.o: sys_defs.h
 unix_connect.o: timed_connect.h
 unix_connect.o: unix_connect.c
+unix_dgram_connect.o: connect.h
+unix_dgram_connect.o: iostuff.h
+unix_dgram_connect.o: msg.h
+unix_dgram_connect.o: sys_defs.h
+unix_dgram_connect.o: unix_dgram_connect.c
+unix_dgram_listen.o: htable.h
+unix_dgram_listen.o: iostuff.h
+unix_dgram_listen.o: listen.h
+unix_dgram_listen.o: msg.h
+unix_dgram_listen.o: sys_defs.h
+unix_dgram_listen.o: unix_dgram_listen.c
 unix_listen.o: htable.h
 unix_listen.o: iostuff.h
 unix_listen.o: listen.h
index 080b99c064a37826cb6ada39bb5ea36479889da8..1e8de1143503f06ecda92e8c56d39ba154f5e55c 100644 (file)
@@ -22,6 +22,7 @@
 extern int unix_connect(const char *, int, int);
 extern int inet_connect(const char *, int, int);
 extern int stream_connect(const char *, int, int);
+extern int unix_dgram_connect(const char *, int);
 
 /* LICENSE
 /* .ad
@@ -32,6 +33,11 @@ extern int stream_connect(const char *, int, int);
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 #endif
index cb73a33cf18c0c45da4f41a2b5742135dd0acfe7..131755c3032b74dfdbe292784dbac2b4e630e597 100644 (file)
@@ -24,6 +24,7 @@ extern int unix_listen(const char *, int, int);
 extern int inet_listen(const char *, int, int);
 extern int fifo_listen(const char *, int, int);
 extern int stream_listen(const char *, int, int);
+extern int unix_dgram_listen(const char *, int);
 
 extern int inet_accept(int);
 extern int unix_accept(int);
diff --git a/postfix/src/util/logwriter.c b/postfix/src/util/logwriter.c
new file mode 100644 (file)
index 0000000..aea2767
--- /dev/null
@@ -0,0 +1,124 @@
+/*++
+/* NAME
+/*     logwriter 3
+/* SUMMARY
+/*     logfile writer
+/* SYNOPSIS
+/*     #include <logwriter.h>
+/*
+/*     VSTREAM *logwriter_open_or_die(
+/*     const char *path)
+/*
+/*     int     logwriter_write(
+/*     VSTREAM *file,
+/*     const char *buffer.
+/*     ssize_t buflen)
+/*
+/*     int     logwriter_close(
+/*     VSTREAM *file)
+/*
+/*     int     logwriter_one_shot(
+/*     const char *path,
+/*     const char *buffer,
+/*     ssize_t buflen)
+/* DESCRIPTION
+/*     This module manages a logfile writer.
+/*
+/*     logwriter_open_or_die() safely opens the specified file in
+/*     write+append mode. File open/create errors are fatal.
+/*
+/*     logwriter_write() writes the buffer plus newline to the
+/*     open logfile. The result is zero if successful, VSTREAM_EOF
+/*     if the operation failed.
+/*
+/*     logwriter_close() closes the logfile and destroys the VSTREAM
+/*     instance. The result is zero if there were no errors writing
+/*     the file, VSTREAM_EOF otherwise.
+/*
+/*     logwriter_one_shot() combines all the above operations. The
+/*     result is zero if successful, VSTREAM_EOF if any operation
+/*     failed.
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+ /*
+  * System library.
+  */
+#include <sys_defs.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+ /*
+  * Utility library.
+  */
+#include <iostuff.h>
+#include <logwriter.h>
+#include <msg.h>
+#include <mymalloc.h>
+#include <safe_open.h>
+#include <vstream.h>
+
+ /*
+  * Application-specific.
+  */
+
+/* logwriter_open_or_die - open logfile */
+
+VSTREAM *logwriter_open_or_die(const char *path)
+{
+    VSTREAM *fp;
+    VSTRING *why = vstring_alloc(100);
+
+#define NO_STATP       ((struct stat *) 0)
+#define NO_CHOWN       (-1)
+#define NO_CHGRP       (-1)
+
+    fp = safe_open(path, O_CREAT | O_WRONLY | O_APPEND, 0644,
+                  NO_STATP, NO_CHOWN, NO_CHGRP, why);
+    if (fp == 0)
+       msg_fatal("open logfile '%s': %s", path, vstring_str(why));
+    close_on_exec(vstream_fileno(fp), CLOSE_ON_EXEC);
+    vstring_free(why);
+    return (fp);
+}
+
+/* logwriter_write - append to logfile */
+
+int     logwriter_write(VSTREAM *fp, const char *buf, ssize_t len)
+{
+    if (len < 0)
+       msg_panic("logwriter_write: negative length %ld", (long) len);
+    if (vstream_fwrite(fp, buf, len) != len)
+       return (VSTREAM_EOF);
+    VSTREAM_PUTC('\n', fp);
+    return (vstream_fflush(fp));
+}
+
+/* logwriter_close - close logfile */
+
+int     logwriter_close(VSTREAM *fp)
+{
+    return (vstream_fclose(fp));
+}
+
+/* logwriter_one_shot - one-shot logwriter */
+
+int     logwriter_one_shot(const char *path, const char *buf, ssize_t len)
+{
+    VSTREAM *fp;
+    int     err;
+
+    fp = logwriter_open_or_die(path);
+    err = logwriter_write(fp, buf, len);
+    err |= logwriter_close(fp);
+    return (err ? VSTREAM_EOF : 0);
+}
diff --git a/postfix/src/util/logwriter.h b/postfix/src/util/logwriter.h
new file mode 100644 (file)
index 0000000..f5266e4
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _LOGWRITER_H_INCLUDED_
+#define _LOGWRITER_H_INCLUDED_
+
+/*++
+/* NAME
+/*     logwriter 3h
+/* SUMMARY
+/*     logfile writer
+/* SYNOPSIS
+/*     #include <logwriter.h>
+/* DESCRIPTION
+/* .nf
+
+ /*
+  * Utility library.
+  */
+#include <vstream.h>
+
+ /*
+  * External interface.
+  */
+extern VSTREAM *logwriter_open_or_die(const char *);
+extern int logwriter_write(VSTREAM *, const char *, ssize_t);
+extern int logwriter_close(VSTREAM *);
+extern int logwriter_one_shot(const char *, const char *, ssize_t);
+
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+#endif
diff --git a/postfix/src/util/msg_logger.c b/postfix/src/util/msg_logger.c
new file mode 100644 (file)
index 0000000..7c8f34d
--- /dev/null
@@ -0,0 +1,347 @@
+/*++
+/* NAME
+/*     msg_logger 3
+/* SUMMARY
+/*     direct diagnostics to logger service
+/* SYNOPSIS
+/*     #include <msg_logger.h>
+/*
+/*     void    msg_logger_init(
+/*     const char *progname,
+/*     const char *hostname,
+/*     const char *unix_path,
+/*     void    (*fallback)(const char *))
+/*
+/*     void    msg_logger_control(
+/*     int     key,...)
+/* DESCRIPTION
+/*     This module implements support to report msg(3) diagnostics
+/*     through a logger daemon, with an optional fallback mechanism.
+/*     The log record format is like traditional syslog:
+/*
+/* .nf
+/*         Mmm dd host progname[pid]: text...
+/* .fi
+/*
+/*     msg_logger_init() arranges that subsequent msg(3) calls
+/*     will write to an internal logging service. This function
+/*     may also be used to update msg_logger settings.
+/*
+/*     Arguments:
+/* .IP progname
+/*     The program name that is prepended to a log record.
+/* .IP hostname
+/*     The host name that is prepended to a log record. Only the
+/*     first hostname label will be used.
+/* .IP unix_path
+/*     Pathname of a unix-domain datagram service endpoint. A
+/*     typical use case is the pathname of the postlog socket.
+/* .IP fallback
+/*     Null pointer, or pointer to function that will be called
+/*     with a formatted message when the logger service is not
+/*     (yet) available. A typical use case is to pass the record
+/*     to the logwriter(3) module.
+/* .PP
+/*     msg_logger_control() makes adjustments to the msg_logger
+/*     client. These adjustments remain in effect until the next
+/*     msg_logger_init() or msg_logger_control() call. The arguments
+/*     are a list of macros with zero or more arguments, terminated
+/*     with CA_MSG_LOGGER_CTL_END which has none. The following
+/*     lists the names and the types of the corresponding value
+/*     arguments.
+/*
+/*     Arguments:
+/* .IP CA_MSG_LOGGER_CTL_FALLBACK_ONLY
+/*     Disable the logging socket, and use the fallback function
+/*     only. This remains in effect until the next msg_logger_init()
+/*     call.
+/* .IP CA_MSG_LOGGER_CTL_FALLBACK(void (*)(const char *))
+/*     Override the fallback setting (see above) with the specified
+/*     function pointer. This remains in effect until the next
+/*     msg_logger_init() or msg_logger_control() call.
+/* .IP CA_MSG_LOGGER_CTL_DISABLE
+/*     Disable the msg_logger. This remains in effect until the
+/*     next msg_logger_init() call.
+/* SEE ALSO
+/*     msg(3)  diagnostics module
+/* BUGS
+/*     Output records are truncated to ~2000 characters, because
+/*     unlimited logging is a liability.
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+ /*
+  * System libraries.
+  */
+#include <sys_defs.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+ /*
+  * Application-specific.
+  */
+#include <connect.h>
+#include <logwriter.h>
+#include <msg.h>
+#include <msg_logger.h>
+#include <msg_output.h>
+#include <mymalloc.h>
+#include <safe.h>
+#include <vstream.h>
+#include <vstring.h>
+
+ /*
+  * Saved state from msg_logger_init().
+  */
+static char *msg_logger_progname;
+static char *msg_logger_hostname;
+static char *msg_logger_unix_path;
+static void (*msg_logger_fallback_fn) (const char *);
+static int msg_logger_fallback_only_override = 0;
+static int msg_logger_enable = 0;
+
+ /*
+  * Other state.
+  */
+#define MSG_LOGGER_SOCK_NONE   (-1)
+
+static VSTRING *msg_logger_buf;
+static int msg_logger_sock = MSG_LOGGER_SOCK_NONE;
+
+ /*
+  * Safety limit.
+  */
+#define MSG_LOGGER_RECLEN      2000
+
+ /*
+  * SLMs.
+  */
+#define STR(x) vstring_str(x)
+#define LEN(x) VSTRING_LEN(x)
+
+
+/* msg_logger_print - log info to service or file */
+
+static void msg_logger_print(int level, const char *text)
+{
+    time_t  now;
+    struct tm *lt;
+    ssize_t len;
+
+    /*
+     * This test is simple enough that we don't bother with unregistering the
+     * msg_logger_print() function.
+     */
+    if (msg_logger_enable == 0)
+       return;
+
+    /*
+     * TODO: this should be a reusable NAME_CODE table plus lookup function.
+     */
+    static int log_level[] = {
+       MSG_INFO, MSG_WARN, MSG_ERROR, MSG_FATAL, MSG_PANIC,
+    };
+    static char *severity_name[] = {
+       "info", "warning", "error", "fatal", "panic",
+    };
+
+    /*
+     * Note: there is code in postlogd(8) that attempts to strip off
+     * information that is prepended here. If the formatting below is
+     * changed, then postlogd needs to be updated as well.
+     */
+
+    /*
+     * Format the time stamp.
+     */
+    if (time(&now) < 0)
+       msg_fatal("no time: %m");
+    lt = localtime(&now);
+    VSTRING_RESET(msg_logger_buf);
+    if ((len = strftime(vstring_str(msg_logger_buf),
+                       vstring_avail(msg_logger_buf),
+                       "%b %d %H:%M:%S ", lt)) == 0)
+       msg_fatal("strftime: %m");
+    vstring_set_payload_size(msg_logger_buf, len);
+
+    /*
+     * Format the host name (first name label only).
+     */
+    vstring_sprintf_append(msg_logger_buf, "%.*s ",
+                          (int) strcspn(msg_logger_hostname, "."),
+                          msg_logger_hostname);
+
+    /*
+     * Format the message.
+     */
+    if (level < 0 || level >= (int) (sizeof(log_level) / sizeof(log_level[0])))
+       msg_panic("msg_logger_print: invalid severity level: %d", level);
+
+    if (level == MSG_INFO) {
+       vstring_sprintf_append(msg_logger_buf, "%s[%ld]: %.*s",
+                              msg_logger_progname, (long) getpid(),
+                              (int) MSG_LOGGER_RECLEN, text);
+    } else {
+       vstring_sprintf_append(msg_logger_buf, "%s[%ld]: %s: %.*s",
+                              msg_logger_progname, (long) getpid(),
+                      severity_name[level], (int) MSG_LOGGER_RECLEN, text);
+    }
+
+    /*
+     * Connect to logging service, or fall back to direct log. Many systems
+     * will report ENOENT if the endpoint does not exist, ECONNREFUSED if no
+     * server has opened the endpoint.
+     */
+    if (msg_logger_fallback_only_override == 0
+       && msg_logger_sock == MSG_LOGGER_SOCK_NONE) {
+       msg_logger_sock = unix_dgram_connect(msg_logger_unix_path, BLOCKING);
+       if (msg_logger_sock >= 0)
+           close_on_exec(msg_logger_sock, CLOSE_ON_EXEC);
+    }
+    if (msg_logger_sock != MSG_LOGGER_SOCK_NONE) {
+       send(msg_logger_sock, STR(msg_logger_buf), LEN(msg_logger_buf), 0);
+    } else if (msg_logger_fallback_fn) {
+       msg_logger_fallback_fn(STR(msg_logger_buf));
+    }
+}
+
+/* msg_logger_init - initialize */
+
+void    msg_logger_init(const char *progname, const char *hostname,
+                    const char *unix_path, void (*fallback) (const char *))
+{
+    static int first_call = 1;
+    extern char **environ;
+
+    /*
+     * XXX If this program is set-gid, then TZ must not be trusted. This
+     * scrubbing code is in the wrong place.
+     */
+    if (first_call) {
+       if (unsafe())
+           while (getenv("TZ"))                /* There may be multiple. */
+               if (unsetenv("TZ") < 0) {       /* Desperate measures. */
+                   environ[0] = 0;
+                   msg_fatal("unsetenv: %m");
+               }
+       tzset();
+    }
+
+    /*
+     * Save the request info. Use free-after-update because this data will be
+     * accessed when mystrdup() runs out of memory.
+     */
+#define UPDATE_AND_FREE(dst, src) do { \
+       if ((dst) == 0 || strcmp((dst), (src)) != 0) { \
+           char *_bak = (dst); \
+           (dst) = mystrdup(src); \
+           if ((_bak)) myfree(_bak); \
+       } \
+    } while (0)
+
+    UPDATE_AND_FREE(msg_logger_progname, progname);
+    UPDATE_AND_FREE(msg_logger_hostname, hostname);
+    UPDATE_AND_FREE(msg_logger_unix_path, unix_path);
+    msg_logger_fallback_fn = fallback;
+
+    /*
+     * One-time activity: register the output handler, and allocate a buffer.
+     */
+    if (first_call) {
+       first_call = 0;
+       msg_output(msg_logger_print);
+       msg_logger_buf = vstring_alloc(2048);
+    }
+
+    /*
+     * Always.
+     */
+    msg_logger_enable = 1;
+    msg_logger_fallback_only_override = 0;
+}
+
+/* msg_logger_control - tweak the client */
+
+void    msg_logger_control(int name,...)
+{
+    const char *myname = "msg_logger_control";
+    va_list ap;
+
+    /*
+     * Overrides remain in effect until the next msg_logger_init() or
+     * msg_logger_control() call,
+     */
+    for (va_start(ap, name); name != MSG_LOGGER_CTL_END; name = va_arg(ap, int)) {
+       switch (name) {
+       case MSG_LOGGER_CTL_FALLBACK_ONLY:
+           msg_logger_fallback_only_override = 1;
+           if (msg_logger_sock != MSG_LOGGER_SOCK_NONE) {
+               (void) close(msg_logger_sock);
+               msg_logger_sock = MSG_LOGGER_SOCK_NONE;
+           }
+           break;
+       case MSG_LOGGER_CTL_FALLBACK_FN:
+           msg_logger_fallback_fn = va_arg(ap, MSG_LOGGER_FALLBACK_FN);
+           break;
+       case MSG_LOGGER_CTL_DISABLE:
+           msg_logger_enable = 0;
+           break;
+       default:
+           msg_panic("%s: bad name %d", myname, name);
+       }
+    }
+    va_end(ap);
+}
+
+#ifdef TEST
+
+ /*
+  * Proof-of-concept program to test the msg_logger module.
+  * 
+  * Usage: msg_logger hostname unix_path fallback_path text...
+  */
+static char *fallback_path;
+
+static void fallback(const char *msg)
+{
+    if (logwriter_one_shot(fallback_path, msg) != 0)
+       msg_fatal("unable to fall back to directly write %s: %m",
+                 fallback_path);
+}
+
+int     main(int argc, char **argv)
+{
+    VSTRING *vp = vstring_alloc(256);
+
+    if (argc < 4)
+       msg_fatal("usage: %s host port path text to log", argv[0]);
+    msg_logger_init(argv[0], argv[1], argv[2], fallback);
+    fallback_path = argv[3];
+    argc -= 3;
+    argv += 3;
+    while (--argc && *++argv) {
+       vstring_strcat(vp, *argv);
+       if (argv[1])
+           vstring_strcat(vp, " ");
+    }
+    msg_warn("static text");
+    msg_warn("dynamic text: >%s<", vstring_str(vp));
+    msg_warn("dynamic numeric: >%d<", 42);
+    msg_warn("error text: >%m<");
+    msg_warn("dynamic: >%s<: error: >%m<", vstring_str(vp));
+    vstring_free(vp);
+    return (0);
+}
+
+#endif
diff --git a/postfix/src/util/msg_logger.h b/postfix/src/util/msg_logger.h
new file mode 100644 (file)
index 0000000..e135e7e
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef _MSG_LOGGER_H_INCLUDED_
+#define _MSG_LOGGER_H_INCLUDED_
+
+/*++
+/* NAME
+/*     msg_logger 3h
+/* SUMMARY
+/*     direct diagnostics to logger service
+/* SYNOPSIS
+/*     #include <msg_logger.h>
+/* DESCRIPTION
+/* .nf
+
+ /*
+  * System library.
+  */
+#include <stdarg.h>
+
+ /*
+  * Utility library.
+  */
+#include <check_arg.h>
+
+ /*
+  * External interface.
+  */
+typedef void (*MSG_LOGGER_FALLBACK_FN) (const char *);
+
+extern void msg_logger_init(const char *, const char *, const char *,
+                                   MSG_LOGGER_FALLBACK_FN);
+extern void msg_logger_control(int,...);
+
+/* Internal-only API: type-unchecked arguments. */
+#define MSG_LOGGER_CTL_END             0
+#define MSG_LOGGER_CTL_FALLBACK_ONLY   1
+#define MSG_LOGGER_CTL_FALLBACK_FN     2
+#define MSG_LOGGER_CTL_DISABLE         3
+
+/* Safer API: type-checked arguments, external use. */
+#define CA_MSG_LOGGER_CTL_END          MSG_LOGGER_CTL_END
+#define CA_MSG_LOGGER_CTL_FALLBACK_ONLY        MSG_LOGGER_CTL_FALLBACK_ONLY
+#define CA_MSG_LOGGER_CTL_FALLBACK_FN(v) \
+       MSG_LOGGER_CTL_FALLBACK_FN, CHECK_VAL(MSG_LOGGER_CTL, \
+               MSG_LOGGER_FALLBACK_FN, (v))
+#define CA_MSG_LOGGER_CTL_DISABLE      MSG_LOGGER_CTL_DISABLE
+
+CHECK_VAL_HELPER_DCL(MSG_LOGGER_CTL, MSG_LOGGER_FALLBACK_FN);
+
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+#endif
index 93164bc4f5f2515350ee82cf7d0adc4d3349d22b..7031089a98a20f6700044dfab1cd9dc9b66a7aa0 100644 (file)
 /*     int     level;
 /*     const char *format;
 /*     va_list ap;
-/*
-/*     void    msg_text(level, text)
-/*     int     level;
-/*     const char *text;
 /* DESCRIPTION
 /*     This module implements low-level output management for the
 /*     msg(3) diagnostics interface.
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System library. */
  /*
   * Global scope, to discourage the compiler from doing smart things.
   */
-volatile int msg_vprintf_lock;
-volatile int msg_text_lock;
+volatile int msg_vprintf_level;
 
  /*
-  * Private state.
+  * Private state. Allow one nested call, so that one logging error can be
+  * reported to stderr before bailing out.
   */
+#define MSG_OUT_NESTING_LIMIT  2
 static MSG_OUTPUT_FN *msg_output_fn = 0;
 static int msg_output_fn_count = 0;
-static VSTRING *msg_buffer = 0;
+static VSTRING *msg_buffers[MSG_OUT_NESTING_LIMIT];
 
 /* msg_output - specify output handler */
 
 void    msg_output(MSG_OUTPUT_FN output_fn)
 {
+    int     i;
 
     /*
-     * Allocate all resources during initialization.
+     * Allocate all resources during initialization. This may result in a
+     * recursive call due to memory allocation error.
      */
-    if (msg_buffer == 0)
-       msg_buffer = vstring_alloc(100);
+    if (msg_buffers[MSG_OUT_NESTING_LIMIT - 1] == 0) {
+       for (i = 0; i < MSG_OUT_NESTING_LIMIT; i++)
+           msg_buffers[i] = vstring_alloc(100);
+    }
 
     /*
      * We're not doing this often, so avoid complexity and allocate memory
@@ -149,40 +155,21 @@ void    msg_printf(int level, const char *format,...)
 void    msg_vprintf(int level, const char *format, va_list ap)
 {
     int     saved_errno = errno;
-
-    if (msg_vprintf_lock == 0) {
-       msg_vprintf_lock = 1;
-       /* On-the-fly initialization for debugging test programs only. */
-       if (msg_output_fn_count == 0)
-           msg_vstream_init("unknown", VSTREAM_ERR);
-       /* OK if terminating signal handler hijacks control before next stmt. */
-       vstring_vsprintf(msg_buffer, percentm(format, errno), ap);
-       msg_text(level, vstring_str(msg_buffer));
-       msg_vprintf_lock = 0;
-    }
-    errno = saved_errno;
-}
-
-/* msg_text - sanitize and log pre-formatted text */
-
-void    msg_text(int level, const char *text)
-{
+    VSTRING *vp;
     int     i;
 
-    /*
-     * Sanitize the text. Use a private copy if necessary.
-     */
-    if (msg_text_lock == 0) {
-       msg_text_lock = 1;
-       /* OK if terminating signal handler hijacks control before next stmt. */
-       if (text != vstring_str(msg_buffer))
-           vstring_strcpy(msg_buffer, text);
-       printable(vstring_str(msg_buffer), '?');
-       /* On-the-fly initialization for debugging test programs only. */
+    if (msg_vprintf_level < MSG_OUT_NESTING_LIMIT) {
+       msg_vprintf_level += 1;
+       /* On-the-fly initialization for test programs and startup errors. */
        if (msg_output_fn_count == 0)
            msg_vstream_init("unknown", VSTREAM_ERR);
+       vp = msg_buffers[msg_vprintf_level - 1];
+       /* OK if terminating signal handler hijacks control before next stmt. */
+       vstring_vsprintf(vp, percentm(format, errno), ap);
+       printable(vstring_str(vp), '?');
        for (i = 0; i < msg_output_fn_count; i++)
-           msg_output_fn[i] (level, vstring_str(msg_buffer));
-       msg_text_lock = 0;
+           msg_output_fn[i] (level, vstring_str(vp));
+       msg_vprintf_level -= 1;
     }
+    errno = saved_errno;
 }
index ede7aff41709ec6c0e3395133d35389153a29851..bd84276f6fd8065cdb24a7e7f2a0be9b27c05cf7 100644 (file)
@@ -23,7 +23,6 @@ typedef void (*MSG_OUTPUT_FN) (int, const char *);
 extern void msg_output(MSG_OUTPUT_FN);
 extern void PRINTFLIKE(2, 3) msg_printf(int, const char *,...);
 extern void msg_vprintf(int, const char *, va_list);
-extern void msg_text(int, const char *);
 
 #define MSG_INFO       0               /* informative */
 #define        MSG_WARN        1               /* warning (non-fatal) */
@@ -42,6 +41,11 @@ extern void msg_text(int, const char *);
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 #endif
index df3394b7bc1cb6df9d8691babad66d28b68b03df..7c979c66d02587fec47633175252eab79d0c8b89 100644 (file)
 /*     int     log_opt;
 /*     int     facility;
 /*
-/*     int     msg_syslog_facility(facility_name)
+/*     int     msg_syslog_set_facility(facility_name)
 /*     const char *facility_name;
+/*
+/*     void    msg_syslog_disable(void)
 /* DESCRIPTION
 /*     This module implements support to report msg(3) diagnostics
 /*     via the syslog daemon.
 /*
 /*     msg_syslog_init() is a wrapper around the openlog(3) routine
 /*     that directs subsequent msg(3) output to the syslog daemon.
+/*     This function may also be called to update msg_syslog
+/*     settings. If the program name appears to contain a process ID
+/*     then msg_syslog_init will attempt to suppress its own PID.
 /*
-/*     msg_syslog_facility() is a helper routine that overrides the
+/*     msg_syslog_set_facility() is a helper routine that overrides the
 /*     logging facility that is specified with msg_syslog_init().
 /*     The result is zero in case of an unknown facility name.
+/*
+/*     msg_syslog_disable() turns off the msg_syslog client,
+/*     until a subsequent msg_syslog_init() call.
 /* SEE ALSO
 /*     syslog(3) syslog library
 /*     msg(3)  diagnostics module
@@ -64,6 +72,7 @@
 #include "msg_output.h"
 #include "msg_syslog.h"
 #include "safe.h"
+#include <mymalloc.h>
 
  /*
   * Stay a little below the 2048-byte limit of older syslog()
@@ -143,7 +152,8 @@ static struct facility_list facility_list[] = {
     0,
 };
 
-static int syslog_facility;
+static int msg_syslog_facility;
+static int msg_syslog_enable;
 
 /* msg_syslog_print - log info to syslog daemon */
 
@@ -156,14 +166,17 @@ static void msg_syslog_print(int level, const char *text)
        "info", "warning", "error", "fatal", "panic",
     };
 
+    if (msg_syslog_enable == 0)
+       return;
+
     if (level < 0 || level >= (int) (sizeof(log_level) / sizeof(log_level[0])))
        msg_panic("msg_syslog_print: invalid severity level: %d", level);
 
     if (level == MSG_INFO) {
-       syslog(syslog_facility | log_level[level], "%.*s",
+       syslog(msg_syslog_facility | log_level[level], "%.*s",
               (int) MSG_SYSLOG_RECLEN, text);
     } else {
-       syslog(syslog_facility | log_level[level], "%s: %.*s",
+       syslog(msg_syslog_facility | log_level[level], "%s: %.*s",
               severity_name[level], (int) MSG_SYSLOG_RECLEN, text);
     }
 }
@@ -179,35 +192,48 @@ void    msg_syslog_init(const char *name, int logopt, int facility)
      * XXX If this program is set-gid, then TZ must not be trusted. This
      * scrubbing code is in the wrong place.
      */
-    if (unsafe())
-       while (getenv("TZ"))                    /* There may be multiple. */
-           if (unsetenv("TZ") < 0) {           /* Desperate measures. */
-               environ[0] = 0;
-               msg_fatal("unsetenv: %m");
-           }
-    tzset();
+    if (first_call) {
+       if (unsafe())
+           while (getenv("TZ"))                /* There may be multiple. */
+               if (unsetenv("TZ") < 0) {       /* Desperate measures. */
+                   environ[0] = 0;
+                   msg_fatal("unsetenv: %m");
+               }
+       tzset();
+    }
+    /* Hack for internal logging forwarding after config change. */
+    if (strchr(name, '[') != 0)
+       logopt &= ~LOG_PID;
     openlog(name, LOG_NDELAY | logopt, facility);
     if (first_call) {
        first_call = 0;
        msg_output(msg_syslog_print);
     }
+    msg_syslog_enable = 1;
 }
 
-/* msg_syslog_facility - set logging facility by name */
+/* msg_syslog_set_facility - set logging facility by name */
 
-int     msg_syslog_facility(const char *facility_name)
+int     msg_syslog_set_facility(const char *facility_name)
 {
     struct facility_list *fnp;
 
     for (fnp = facility_list; fnp->name; ++fnp) {
        if (!strcmp(fnp->name, facility_name)) {
-           syslog_facility = fnp->facility;
+           msg_syslog_facility = fnp->facility;
            return (1);
        }
     }
     return 0;
 }
 
+/* msg_syslog_disable - disable the msg_syslog client */
+
+void    msg_syslog_disable(void)
+{
+    msg_syslog_enable = 0;
+}
+
 #ifdef TEST
 
  /*
index 614daaecf81df4ea6970385647d7345f1b08e004..d0441bbd6c7abff030bfe689d8b76566c6a3adf1 100644 (file)
@@ -19,7 +19,8 @@
   * External interface.
   */
 extern void msg_syslog_init(const char *, int, int);
-extern int msg_syslog_facility(const char *);
+extern int msg_syslog_set_facility(const char *);
+extern void msg_syslog_disable(void);
 
 /* LICENSE
 /* .ad
@@ -30,6 +31,11 @@ extern int msg_syslog_facility(const char *);
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 #endif
diff --git a/postfix/src/util/unix_dgram_connect.c b/postfix/src/util/unix_dgram_connect.c
new file mode 100644 (file)
index 0000000..b3492f7
--- /dev/null
@@ -0,0 +1,90 @@
+/*++
+/* NAME
+/*     unix_dgram_connect 3
+/* SUMMARY
+/*     connect to UNIX-domain datagram server
+/* SYNOPSIS
+/*     #include <connect.h>
+/*
+/*     int     unix_dgram_connect(
+/*     const char *path,
+/*     int     block_mode)
+/* DESCRIPTION
+/*     unix_dgram_connect() connects to the specified UNIX-domain
+/*     datagram server, and returns the resulting file descriptor.
+/*
+/*     Arguments:
+/* .IP path
+/*     Null-terminated string with connection destination.`
+/* .IP block_mode
+/*     Either NON_BLOCKING for a non-blocking socket, or BLOCKING for
+/*     blocking mode.
+/* DIAGNOSIICS
+/*     Fatal errors: path too large, can't create socket.
+/*
+/*     Other errors result in a -1 result value, with errno indicating
+/*     why the service is unavailable.
+/* .sp
+/*     ENOENT: the named socket does not exist.
+/* .sp
+/*     ECONNREFUSED: the named socket is not open.
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+ /*
+  * System library.
+  */
+#include <sys_defs.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <string.h>
+
+ /*
+  * Utility library.
+  */
+#include <msg.h>
+#include <connect.h>
+#include <iostuff.h>
+
+/* unix_dgram_connect - connect to UNIX-domain datagram service */
+
+int     unix_dgram_connect(const char *path, int block_mode)
+{
+    const char myname[] = "unix_dgram_connect";
+    struct sockaddr_un sun;
+    ssize_t path_len;
+    int     sock;
+
+    /*
+     * Translate address information to internal form.
+     */
+    if ((path_len = strlen(path)) >= sizeof(sun.sun_path))
+       msg_fatal("%s: unix-domain name too long: %s", myname, path);
+    memset((void *) &sun, 0, sizeof(sun));
+    sun.sun_family = AF_UNIX;
+#ifdef HAS_SUN_LEN
+    sun.sun_len = path_len + 1;
+#endif
+    memcpy(sun.sun_path, path, path_len + 1);
+
+    /*
+     * Create a client socket.
+     */
+    if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
+       msg_fatal("%s: socket: %m", myname);
+    if (connect(sock, (struct sockaddr *) &sun, sizeof(sun)) < 0) {
+       close(sock);
+       return (-1);
+    }
+    non_blocking(sock, block_mode);
+    return (sock);
+}
diff --git a/postfix/src/util/unix_dgram_listen.c b/postfix/src/util/unix_dgram_listen.c
new file mode 100644 (file)
index 0000000..3dc677b
--- /dev/null
@@ -0,0 +1,93 @@
+/*++
+/* NAME
+/*     unix_dgram_listen 3
+/* SUMMARY
+/*     listen to UNIX-domain datagram server
+/* SYNOPSIS
+/*     #include <listen.h>
+/*
+/*     int     unix_dgram_listen(
+/*     const char *path,
+/*     int     block_mode)
+/* DESCRIPTION
+/*     unix_dgram_listen() binds to the specified UNIX-domain
+/*     datagram endpoint, and returns the resulting file descriptor.
+/*
+/*     Arguments:
+/* .IP path
+/*     Null-terminated string with connection destination.
+/* .IP backlog
+/*     Either NON_BLOCKING for a non-blocking socket, or BLOCKING for
+/*     blocking mode.
+/* DIAGNOSIICS
+/*     Fatal errors: path too large, can't create socket.
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
+/*--*/
+
+ /*
+  * System library.
+  */
+#include <sys_defs.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+ /*
+  * Utility library.
+  */
+#include <iostuff.h>
+#include <listen.h>
+#include <msg.h>
+
+/* unix_dgram_listen - bind to UNIX-domain datagram endpoint */
+
+int     unix_dgram_listen(const char *path, int block_mode)
+{
+    const char myname[] = "unix_dgram_listen";
+#undef sun
+    struct sockaddr_un sun;
+    ssize_t path_len;
+    int     sock;
+
+    /*
+     * Translate address information to internal form.
+     */
+    if ((path_len = strlen(path)) >= sizeof(sun.sun_path))
+       msg_fatal("%s: unix-domain name too long: %s", myname, path);
+    memset((void *) &sun, 0, sizeof(sun));
+    sun.sun_family = AF_UNIX;
+#ifdef HAS_SUN_LEN
+    sun.sun_len = path_len + 1;
+#endif
+    memcpy(sun.sun_path, path, path_len + 1);
+
+    /*
+     * Create a 'server' socket.
+     */
+    if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
+       msg_fatal("%s: socket: %m", myname);
+    if (unlink(path) < 0 && errno != ENOENT) 
+        msg_fatal( "remove %s: %m", path);
+    if (bind(sock, (struct sockaddr *) & sun, sizeof(sun)) < 0) 
+        msg_fatal( "bind: %s: %m", path);
+#ifdef FCHMOD_UNIX_SOCKETS
+    if (fchmod(sock, 0666) < 0)
+        msg_fatal("fchmod socket %s: %m", path);
+#else
+    if (chmod(path, 0666) < 0)
+        msg_fatal("chmod socket %s: %m", path);
+#endif
+    non_blocking(sock, block_mode);
+    return (sock);
+}
index 187932a48269a2b37b2e343c2ab2c769627502a4..3ec1fbc5f0b4bf631ff420567414c973bdcbb7a6 100644 (file)
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
+/*
+/*     Wietse Venema
+/*     Google, Inc.
+/*     111 8th Avenue
+/*     New York, NY 10011, USA
 /*--*/
 
 /* System library. */
@@ -216,6 +221,8 @@ WATCHDOG *watchdog_create(unsigned timeout, WATCHDOG_FN action, char *context)
            msg_fatal("%s: pipe: %m", myname);
        non_blocking(watchdog_pipe[0], NON_BLOCKING);
        non_blocking(watchdog_pipe[1], NON_BLOCKING);
+       close_on_exec(watchdog_pipe[0], CLOSE_ON_EXEC); /* Fix 20190126 */
+       close_on_exec(watchdog_pipe[1], CLOSE_ON_EXEC); /* Fix 20190126 */
        event_enable_read(watchdog_pipe[0], watchdog_read, (void *) 0);
     }
 #endif