]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
snapshot-20000505
authorWietse Venema <wietse@porcupine.org>
Fri, 5 May 2000 00:00:00 +0000 (00:00 +0000)
committerWietse Venema <wietse@porcupine.org>
Thu, 17 Jan 2013 23:10:45 +0000 (18:10 -0500)
31 files changed:
postfix/HISTORY
postfix/Makefile.in
postfix/conf/master.cf
postfix/global/mail_params.h
postfix/global/mail_version.h
postfix/html/Makefile.in
postfix/html/delivering.html
postfix/html/lmtp.8.html [new file with mode: 0644]
postfix/html/smtp.8.html
postfix/lmtp/Makefile.in
postfix/lmtp/fixnames
postfix/lmtp/global-patch [deleted file]
postfix/lmtp/lmtp.c
postfix/lmtp/lmtp.h
postfix/lmtp/lmtp_addr.c
postfix/lmtp/lmtp_chat.c
postfix/lmtp/lmtp_connect.c
postfix/lmtp/lmtp_proto.c
postfix/lmtp/lmtp_session.c
postfix/lmtp/lmtp_state.c
postfix/lmtp/lmtp_trouble.c
postfix/lmtp/man-patch [deleted file]
postfix/man/Makefile.in
postfix/man/man8/lmtp.8 [new file with mode: 0644]
postfix/man/man8/smtp.8
postfix/master/multi_server.c
postfix/master/single_server.c
postfix/master/trigger_server.c
postfix/smtp/Makefile.in
postfix/smtpd/smtpd_chat.c
postfix/spawn/Makefile.in

index 055ee7b0938574b515686e24635ee55ffe05ba7d..78ebaa4923f3efa041405204eea8be8a6a598edc 100644 (file)
@@ -3879,3 +3879,9 @@ Apologies for any names omitted.
        Cleaned up the smtp_stream module further and got rid of
        the global state that limited the use of this module to
        one stream per process. Files: global/smtp_stream.[hc].
+
+20000505
+
+       Bugfix: flush output in-between tarpit delays, in case the
+       client causes many, many, errors. Found by Lamont Jones,
+       HP. File: smtpd/smtpd_chat.c.
index dcaddeb9945353403e768f57653d06eb8b879b11..af831c7678288ddff1875b6baabe604881c5fe56 100644 (file)
@@ -2,9 +2,9 @@ SHELL   = /bin/sh
 WARN    = -Wmissing-prototypes
 OPTS   = "CC=$(CC)"
 DIRS   = util global dns master postfix smtpstone sendmail error \
-       pickup cleanup smtpd local trivial-rewrite qmgr smtp bounce pipe \
+       pickup cleanup smtpd local lmtp trivial-rewrite qmgr smtp bounce pipe \
        showq postalias postcat postconf postdrop postkick postlock postlog \
-       postmap postsuper # base64 spawn proto man html
+       postmap postsuper spawn # base64 proto man html
 
 default: update
 
index 399d59093f0449ca1265e6279507c11557d438ba..34e222855f6da1a130d02ef18f112f79b95b68f9 100644 (file)
@@ -70,6 +70,7 @@ smtp    unix  -       -       n       -       -       smtp
 showq     unix n       -       n       -       -       showq
 error     unix -       -       n       -       -       error
 local    unix  -       n       n       -       -       local
+lmtp     unix  -       -       n       -       -       lmtp server=localhost
 cyrus    unix  -       n       n       -       -       pipe
     flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
 uucp     unix  -       n       n       -       -       pipe
index 22b8c6d969e8462341e9ffe58135af89da4614b3..d5a73e7a87b55b47b6d0dcbdad03b49633366547 100644 (file)
@@ -670,6 +670,60 @@ extern char *var_smtp_sasl_opts;
 
 #define PERMIT_SASL_AUTH       "permit_sasl_authenticated"
 
+ /*
+  * LMTP client. Timeouts inspired by RFC 1123. The LMTP recipient limit
+  * determines how many recipient addresses the LMTP client sends along with
+  * each message. Unfortunately, some mailers misbehave and disconnect (smap)
+  * when given more recipients than they are willing to handle.
+  */
+#define VAR_LMTP_TCP_PORT      "lmtp_tcp_port"
+#define DEF_LMTP_TCP_PORT      24
+extern int var_lmtp_tcp_port;
+
+#define VAR_LMTP_CACHE_CONN    "lmtp_cache_connection"
+#define DEF_LMTP_CACHE_CONN    1
+extern bool var_lmtp_cache_conn;
+
+#define VAR_LMTP_SKIP_QUIT_RESP        "lmtp_skip_quit_response"
+#define DEF_LMTP_SKIP_QUIT_RESP        0
+extern bool var_lmtp_skip_quit_resp;
+
+#define VAR_LMTP_CONN_TMOUT    "lmtp_connect_timeout"
+#define DEF_LMTP_CONN_TMOUT    0
+extern int var_lmtp_conn_tmout;
+
+#define VAR_LMTP_RSET_TMOUT    "lmtp_rset_timeout"
+#define DEF_LMTP_RSET_TMOUT    300
+extern int var_lmtp_rset_tmout;
+
+#define VAR_LMTP_LHLO_TMOUT    "lmtp_lhlo_timeout"
+#define DEF_LMTP_LHLO_TMOUT    300
+extern int var_lmtp_lhlo_tmout;
+
+#define VAR_LMTP_MAIL_TMOUT    "lmtp_mail_timeout"
+#define DEF_LMTP_MAIL_TMOUT    300
+extern int var_lmtp_mail_tmout;
+
+#define VAR_LMTP_RCPT_TMOUT    "lmtp_rcpt_timeout"
+#define DEF_LMTP_RCPT_TMOUT    300
+extern int var_lmtp_rcpt_tmout;
+
+#define VAR_LMTP_DATA0_TMOUT   "lmtp_data_init_timeout"
+#define DEF_LMTP_DATA0_TMOUT   120
+extern int var_lmtp_data0_tmout;
+
+#define VAR_LMTP_DATA1_TMOUT   "lmtp_data_xfer_timeout"
+#define DEF_LMTP_DATA1_TMOUT   180
+extern int var_lmtp_data1_tmout;
+
+#define VAR_LMTP_DATA2_TMOUT   "lmtp_data_done_timeout"
+#define DEF_LMTP_DATA2_TMOUT   600
+extern int var_lmtp_data2_tmout;
+
+#define VAR_LMTP_QUIT_TMOUT    "lmtp_quit_timeout"
+#define DEF_LMTP_QUIT_TMOUT    300
+extern int var_lmtp_quit_tmout;
+
  /*
   * Cleanup service. Header info that exceeds $header_size_limit bytes forces
   * the start of the message body.
index 24fb39cc1ddd6f9c2ac0e7703f7036f9671f68b8..28b522ed25f8f004260376e9064dd6d153c210bb 100644 (file)
@@ -15,7 +15,7 @@
   * Version of this program.
   */
 #define VAR_MAIL_VERSION       "mail_version"
-#define DEF_MAIL_VERSION       "Snapshot-20000504"
+#define DEF_MAIL_VERSION       "Snapshot-20000505"
 extern char *var_mail_version;
 
 /* LICENSE
index 9637661100eea8e0f82aa2fc4ed22e47bdccf610..63f98693aaf905a65c7a305eda40a615c5383eba 100644 (file)
@@ -3,8 +3,8 @@ SHELL   = /bin/sh
 # For now, just hard-coded rules for daemons, commands, config files.
 
 DAEMONS        =  bounce.8.html cleanup.8.html defer.8.html error.8.html local.8.html \
-       master.8.html pickup.8.html pipe.8.html qmgr.8.html showq.8.html \
-       smtp.8.html smtpd.8.html trivial-rewrite.8.html
+       lmtp.8.html master.8.html pickup.8.html pipe.8.html qmgr.8.html \
+       showq.8.html smtp.8.html smtpd.8.html trivial-rewrite.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 sendmail.1.html \
@@ -38,6 +38,9 @@ error.8.html: ../error/error.c
 cleanup.8.html: ../cleanup/cleanup.c
        srctoman $? | nroff -man | man2html | postlink >$@
 
+lmtp.8.html: ../lmtp/lmtp.c
+       srctoman $? | nroff -man | man2html | postlink >$@
+
 local.8.html: ../local/local.c
        srctoman $? | nroff -man | man2html | postlink >$@
 
index 12036a192ebe66bf074879738c7e237a0030499f..a39b603afaf05c38ab7e3e8bf9ed0b862f3e2f3b 100644 (file)
@@ -39,11 +39,11 @@ click on the icon in the upper left-hand corner of this page.
 
 <li>The <a href="qmgr.8.html">queue manager</a> is the heart of
 the Postfix mail system. It contacts the <a href="local.8.html">local</a>,
-<a href="smtp.8.html">smtp</a>, or <a href="pipe.8.html">pipe</a>
-delivery agents, and sends a delivery request with queue file
-pathname information, the message sender address, the host to
-deliver to if the destination is remote, and one or more message
-recipient addresses.
+<a href="smtp.8.html">smtp</a>, <a href="lmtp.8.html">lmtp</a>, or
+<a href="pipe.8.html">pipe</a> delivery agents, and sends a delivery
+request with queue file pathname information, the message sender
+address, the host to deliver to if the destination is remote, and
+one or more message recipient addresses.
 
 <p>
 
diff --git a/postfix/html/lmtp.8.html b/postfix/html/lmtp.8.html
new file mode 100644 (file)
index 0000000..1313f10
--- /dev/null
@@ -0,0 +1,332 @@
+<html> <head> </head> <body> <pre>
+
+
+
+LMTP(8)                                                   LMTP(8)
+
+
+<b>NAME</b>
+       lmtp - Postfix local delivery via LMTP
+
+<b>SYNOPSIS</b>
+       <b>lmtp</b> [generic Postfix daemon options] [server attributes...]
+
+<b>DESCRIPTION</b>
+       The  LMTP  client processes message delivery requests from
+       the queue manager. Each request specifies a queue file,  a
+       sender address, a domain or host to deliver to, and recip-
+       ient information.  This program expects to be run from the
+       <a href="master.8.html"><b>master</b>(8)</a> process manager.
+
+       The  LMTP  client updates the queue file and marks recipi-
+       ents as finished, or it informs  the  queue  manager  that
+       delivery  should  be tried again at a later time. Delivery
+       problem reports are sent to the <a href="bounce.8.html"><b>bounce</b>(8)</a> or <a href="defer.8.html"><b>defer</b>(8)</a> dae-
+       mon as appropriate.
+
+       If no server is given on the command line, the LMTP client
+       connects to  the  destination  specified  in  the  message
+       delivery  request  and  to the TCP port defined as <b>lmtp</b> in
+       <b>services</b>(4).   If  no   such   service   is   found,   the
+       <b>lmtp</b><i>_</i><b>tcp</b><i>_</i><b>port</b>  configuration  parameter  (default value of
+       24) will be used. The LMTP  client  does  not  perform  MX
+       (mail  exchanger) lookups since those are defined only for
+       SMTP.
+
+<b>SERVER</b> <b>ATTRIBUTE</b> <b>SYNTAX</b>
+       The server attributes are given in the <b>master.cf</b>  file  at
+       the  end  of  a service definition.  The syntax is as fol-
+       lows:
+
+       <b>server=</b><i>host</i>
+
+       <b>server=</b><i>host</i><b>:</b><i>port</i>
+
+       <b>server=[</b><i>ipaddr</i><b>]</b>
+
+       <b>server=[</b><i>ipaddr</i><b>]:</b><i>port</i>
+              Connect to the specified host or IP address and TCP
+              port  (default:  the  <b>lmtp</b> port as specified in the
+              <b>services</b> database).
+
+
+<b>SECURITY</b>
+       The LMTP client is moderately security-sensitive. It talks
+       to  LMTP  servers  and  to DNS servers on the network. The
+       LMTP client can be run chrooted at fixed low privilege.
+
+<b>STANDARDS</b>
+       <a href="http://www.faqs.org/rfcs/rfc821.html">RFC 821</a> (SMTP protocol)
+       <a href="http://www.faqs.org/rfcs/rfc1651.html">RFC 1651</a> (SMTP service extensions)
+       <a href="http://www.faqs.org/rfcs/rfc1870.html">RFC 1870</a> (Message Size Declaration)
+
+
+
+                                                                1
+
+
+
+
+
+LMTP(8)                                                   LMTP(8)
+
+
+       <a href="http://www.faqs.org/rfcs/rfc2033.html">RFC 2033</a> (LMTP protocol)
+       <a href="http://www.faqs.org/rfcs/rfc2197.html">RFC 2197</a> (Pipelining)
+
+<b>DIAGNOSTICS</b>
+       Problems and transactions are logged to <b>syslogd</b>(8).   Cor-
+       rupted  message files are marked so that the queue manager
+       can move them to the <b>corrupt</b> queue for further inspection.
+
+       Depending  on the setting of the <b>notify</b><i>_</i><b>classes</b> parameter,
+       the postmaster is notified of bounces, protocol  problems,
+       and of other trouble.
+
+<b>BUGS</b>
+<b>CONFIGURATION</b> <b>PARAMETERS</b>
+       The  following  <b>main.cf</b> parameters are especially relevant
+       to this program. See the Postfix <b>main.cf</b> file  for  syntax
+       details  and  for  default  values. Use the <b>postfix</b> <b>reload</b>
+       command after a configuration change.
+
+<b>Miscellaneous</b>
+       <b>debug</b><i>_</i><b>peer</b><i>_</i><b>level</b>
+              Verbose logging  level  increment  for  hosts  that
+              match a pattern in the <b>debug</b><i>_</i><b>peer</b><i>_</i><b>list</b> parameter.
+
+       <b>debug</b><i>_</i><b>peer</b><i>_</i><b>list</b>
+              List  of  domain or network patterns. When a remote
+              host matches a pattern, increase the  verbose  log-
+              ging   level   by   the  amount  specified  in  the
+              <b>debug</b><i>_</i><b>peer</b><i>_</i><b>level</b> parameter.
+
+       <b>error</b><i>_</i><b>notice</b><i>_</i><b>recipient</b>
+              Recipient   of    protocol/policy/resource/software
+              error notices.
+
+       <b>notify</b><i>_</i><b>classes</b>
+              When  this  parameter  includes the <b>protocol</b> class,
+              send mail to the  postmaster  with  transcripts  of
+              LMTP sessions with protocol errors.
+
+       <b>lmtp</b><i>_</i><b>skip</b><i>_</i><b>quit</b><i>_</i><b>response</b>
+              Do  not  wait for the server response after sending
+              QUIT.
+
+       <b>lmtp</b><i>_</i><b>tcp</b><i>_</i><b>port</b>
+              The TCP port to be used when connecting to  a  LMTP
+              server.   Used as backup if the <b>lmtp</b> service is not
+              found in <b>services</b>(4).
+
+<b>Resource</b> <b>controls</b>
+       <b>lmtp</b><i>_</i><b>cache</b><i>_</i><b>connection</b>
+              Should we cache the connection to the LMTP  server?
+              The  effectiveness  of  cached  connections will be
+              determined by the number of LMTP  servers  in  use,
+              and  the  concurrency  limit specified for the LMTP
+
+
+
+                                                                2
+
+
+
+
+
+LMTP(8)                                                   LMTP(8)
+
+
+              client.  Cached connections are closed under any of
+              the following conditions:
+
+              <b>o</b>      The  LMTP client idle time limit is reached.
+                     This limit is  specified  with  the  Postfix
+                     <b>max</b><i>_</i><b>idle</b> configuration parameter.
+
+              <b>o</b>      A  delivery  request  specifies  a different
+                     destination than the one currently cached.
+
+              <b>o</b>      The  per-process  limit  on  the  number  of
+                     delivery requests is reached.  This limit is
+                     specified with the Postfix <b>max</b><i>_</i><b>use</b>  configu-
+                     ration parameter.
+
+              <b>o</b>      Upon  the onset of another delivery request,
+                     the LMTP server associated with the  current
+                     session  does  not  respond to the <b>RSET</b> com-
+                     mand.
+
+       <i>transport_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b>
+              Limit the number of parallel deliveries to the same
+              destination   via  this  mail  delivery  transport.
+              <i>transport</i> is the name of the service  as  specified
+              in  the <b>master.cf</b> file.  The default limit is taken
+              from   the    <b>default</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b>
+              parameter.
+
+       <i>transport_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
+              Limit the number of recipients per message delivery
+              via this mail delivery transport. <i>transport</i> is  the
+              name  of  the service as specified in the <b>master.cf</b>
+              file.   The  default  limit  is  taken   from   the
+              <b>default</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b> parameter.
+
+              This  parameter  becomes  significant  if  the LMTP
+              client is  used  for  local  delivery.   Some  LMTP
+              servers  can  optimize delivery of the same message
+              to multiple recipients. The default limit for local
+              mail delivery is 1.
+
+              Setting  this  parameter  to  0  will  lead  to  an
+              unbounded number of recipients per delivery.   How-
+              ever,  this  could  be  risky since it may make the
+              machine vulnerable to running out of  resources  if
+              messages  are encountered with an inordinate number
+              of recipients.  Exercise  care  when  setting  this
+              parameter.
+
+<b>Timeout</b> <b>controls</b>
+       <b>lmtp</b><i>_</i><b>connect</b><i>_</i><b>timeout</b>
+              Timeout  in seconds for opening a connection to the
+              LMTP server.  If no connection can be  made  within
+              the deadline, the message is deferred.
+
+
+
+                                                                3
+
+
+
+
+
+LMTP(8)                                                   LMTP(8)
+
+
+       <b>lmtp</b><i>_</i><b>lhlo</b><i>_</i><b>timeout</b>
+              Timeout  in  seconds  for sending the <b>LHLO</b> command,
+              and for receiving the server response.
+
+       <b>lmtp</b><i>_</i><b>mail</b><i>_</i><b>timeout</b>
+              Timeout in seconds for sending the <b>MAIL</b>  <b>FROM</b>  com-
+              mand, and for receiving the server response.
+
+       <b>lmtp</b><i>_</i><b>rcpt</b><i>_</i><b>timeout</b>
+              Timeout in seconds for sending the <b>RCPT</b> <b>TO</b> command,
+              and for receiving the server response.
+
+       <b>lmtp</b><i>_</i><b>data</b><i>_</i><b>init</b><i>_</i><b>timeout</b>
+              Timeout in seconds for sending  the  <b>DATA</b>  command,
+              and for receiving the server response.
+
+       <b>lmtp</b><i>_</i><b>data</b><i>_</i><b>xfer</b><i>_</i><b>timeout</b>
+              Timeout in seconds for sending the message content.
+
+       <b>lmtp</b><i>_</i><b>data</b><i>_</i><b>done</b><i>_</i><b>timeout</b>
+              Timeout in seconds for sending the "<b>.</b>" command, and
+              for receiving the server response. When no response
+              is received, a warning is logged that the mail  may
+              be delivered multiple times.
+
+       <b>lmtp</b><i>_</i><b>rset</b><i>_</i><b>timeout</b>
+              Timeout  in  seconds  for sending the <b>RSET</b> command,
+              and for receiving the server response.
+
+       <b>lmtp</b><i>_</i><b>quit</b><i>_</i><b>timeout</b>
+              Timeout in seconds for sending  the  <b>QUIT</b>  command,
+              and for receiving the server response.
+
+<b>SEE</b> <b>ALSO</b>
+       <a href="bounce.8.html">bounce(8)</a> non-delivery status reports
+       <a href="local.8.html">local(8)</a> local mail delivery
+       <a href="master.8.html">master(8)</a> process manager
+       <a href="qmgr.8.html">qmgr(8)</a> queue manager
+       services(4) Internet services and aliases
+       spawn(8) auxiliary command spawner
+       syslogd(8) system logging
+
+<b>LICENSE</b>
+       The  Secure  Mailer  license must be distributed with this
+       software.
+
+<b>AUTHOR(S)</b>
+       Wietse Venema
+       IBM T.J. Watson Research
+       P.O. Box 704
+       Yorktown Heights, NY 10598, USA
+
+       Alterations for LMTP by:
+       Philip A. Prindeville
+
+
+
+                                                                4
+
+
+
+
+
+LMTP(8)                                                   LMTP(8)
+
+
+       Mirapoint, Inc.
+       USA.
+
+       Additional work on LMTP by:
+       Amos Gouaux
+       University of Texas at Dallas
+       P.O. Box 830688, MC34
+       Richardson, TX 75083, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                                                5
+
+
+</pre> </body> </html>
index 13b77d672628003bb52618c92bc0bf1f50e83c56..46c25fe2389c601ab0edf58183b3db13dd98954d 100644 (file)
@@ -147,11 +147,12 @@ SMTP(8)                                                   SMTP(8)
 <b>Authentication</b> <b>controls</b>
        <b>smtp</b><i>_</i><b>enable</b><i>_</i><b>sasl</b><i>_</i><b>auth</b>
               Enable per-session authentication as per  <a href="http://www.faqs.org/rfcs/rfc2554.html">RFC  2554</a>
-              (SASL).
+              (SASL).   By default, Postfix is built without SASL
+              support.
 
        <b>smtp</b><i>_</i><b>sasl</b><i>_</i><b>password</b><i>_</i><b>maps</b>
-              Lookup  tables with per-host <i>name</i>:<i>password</i> entries.
-              No entry for a host means no attempt  to  authenti-
+              Lookup tables with per-host <i>name</i>:<i>password</i>  entries.
+              No  entry  for a host means no attempt to authenti-
               cate.
 
        <b>smtp</b><i>_</i><b>sasl</b><i>_</i><b>security</b><i>_</i><b>options</b>
@@ -175,25 +176,24 @@ SMTP(8)                                                   SMTP(8)
 <b>Resource</b> <b>controls</b>
        <b>smtp</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b>
               Limit the number of parallel deliveries to the same
-              destination.  The default limit is taken  from  the
+              destination.   The  default limit is taken from the
               <b>default</b><i>_</i><b>destination</b><i>_</i><b>concurrency</b><i>_</i><b>limit</b> parameter.
 
        <b>smtp</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b>
-              Limit  the  number of recipients per message deliv-
-              ery.   The  default  limit  is   taken   from   the
+              Limit the number of recipients per  message  deliv-
+              ery.    The   default   limit  is  taken  from  the
               <b>default</b><i>_</i><b>destination</b><i>_</i><b>recipient</b><i>_</i><b>limit</b> parameter.
 
 <b>Timeout</b> <b>controls</b>
        <b>smtp</b><i>_</i><b>connect</b><i>_</i><b>timeout</b>
               Timeout in seconds for completing a TCP connection.
               When no connection can be made within the deadline,
-              the  SMTP client tries the next address on the mail
+              the SMTP client tries the next address on the  mail
               exchanger list.
 
 
 
 
-
                                                                 3
 
 
@@ -204,19 +204,19 @@ SMTP(8)                                                   SMTP(8)
 
 
        <b>smtp</b><i>_</i><b>helo</b><i>_</i><b>timeout</b>
-              Timeout in seconds for receiving the SMTP  greeting
+              Timeout  in seconds for receiving the SMTP greeting
               banner.  When the server drops the connection with-
-              out sending a greeting banner, or when it sends  no
+              out  sending a greeting banner, or when it sends no
               greeting  banner  within  the  deadline,  the  SMTP
               client tries the next address on the mail exchanger
               list.
 
        <b>smtp</b><i>_</i><b>helo</b><i>_</i><b>timeout</b>
-              Timeout  in  seconds  for sending the <b>HELO</b> command,
+              Timeout in seconds for sending  the  <b>HELO</b>  command,
               and for receiving the server response.
 
        <b>smtp</b><i>_</i><b>mail</b><i>_</i><b>timeout</b>
-              Timeout in seconds for sending the <b>MAIL</b>  <b>FROM</b>  com-
+              Timeout  in  seconds for sending the <b>MAIL</b> <b>FROM</b> com-
               mand, and for receiving the server response.
 
        <b>smtp</b><i>_</i><b>rcpt</b><i>_</i><b>timeout</b>
@@ -224,7 +224,7 @@ SMTP(8)                                                   SMTP(8)
               and for receiving the server response.
 
        <b>smtp</b><i>_</i><b>data</b><i>_</i><b>init</b><i>_</i><b>timeout</b>
-              Timeout in seconds for sending  the  <b>DATA</b>  command,
+              Timeout  in  seconds  for sending the <b>DATA</b> command,
               and for receiving the server response.
 
        <b>smtp</b><i>_</i><b>data</b><i>_</i><b>xfer</b><i>_</i><b>timeout</b>
@@ -233,11 +233,11 @@ SMTP(8)                                                   SMTP(8)
        <b>smtp</b><i>_</i><b>data</b><i>_</i><b>done</b><i>_</i><b>timeout</b>
               Timeout in seconds for sending the "<b>.</b>" command, and
               for receiving the server response. When no response
-              is received, a warning is logged that the mail  may
+              is  received, a warning is logged that the mail may
               be delivered multiple times.
 
        <b>smtp</b><i>_</i><b>quit</b><i>_</i><b>timeout</b>
-              Timeout  in  seconds  for sending the <b>QUIT</b> command,
+              Timeout in seconds for sending  the  <b>QUIT</b>  command,
               and for receiving the server response.
 
 <b>SEE</b> <b>ALSO</b>
@@ -247,7 +247,7 @@ SMTP(8)                                                   SMTP(8)
        syslogd(8) system logging
 
 <b>LICENSE</b>
-       The Secure Mailer license must be  distributed  with  this
+       The  Secure  Mailer  license must be distributed with this
        software.
 
 <b>AUTHOR(S)</b>
index 60c904e2d9eecd6e86a6fd3d48fc1ab47f0d0862..a342037b07952c495399f28e9751dbbad32468fc 100644 (file)
@@ -59,3 +59,156 @@ depend: $(MAKES)
        @make -f Makefile.in Makefile
 
 # do not edit below this line - it is generated by 'make depend'
+lmtp.o: lmtp.c
+lmtp.o: ../include/sys_defs.h
+lmtp.o: ../include/dict.h
+lmtp.o: ../include/vstream.h
+lmtp.o: ../include/vbuf.h
+lmtp.o: ../include/binattr.h
+lmtp.o: ../include/argv.h
+lmtp.o: ../include/msg.h
+lmtp.o: ../include/mymalloc.h
+lmtp.o: ../include/name_mask.h
+lmtp.o: ../include/split_at.h
+lmtp.o: ../include/deliver_request.h
+lmtp.o: ../include/vstring.h
+lmtp.o: ../include/recipient_list.h
+lmtp.o: ../include/mail_queue.h
+lmtp.o: ../include/mail_params.h
+lmtp.o: ../include/mail_conf.h
+lmtp.o: ../include/debug_peer.h
+lmtp.o: ../include/mail_error.h
+lmtp.o: ../include/mail_server.h
+lmtp.o: lmtp.h
+lmtp_addr.o: lmtp_addr.c
+lmtp_addr.o: ../include/sys_defs.h
+lmtp_addr.o: ../include/msg.h
+lmtp_addr.o: ../include/vstring.h
+lmtp_addr.o: ../include/vbuf.h
+lmtp_addr.o: ../include/mymalloc.h
+lmtp_addr.o: ../include/inet_addr_list.h
+lmtp_addr.o: ../include/stringops.h
+lmtp_addr.o: ../include/mail_params.h
+lmtp_addr.o: ../include/own_inet_addr.h
+lmtp_addr.o: ../include/dns.h
+lmtp_addr.o: lmtp.h
+lmtp_addr.o: ../include/vstream.h
+lmtp_addr.o: ../include/binattr.h
+lmtp_addr.o: ../include/argv.h
+lmtp_addr.o: ../include/deliver_request.h
+lmtp_addr.o: ../include/recipient_list.h
+lmtp_addr.o: lmtp_addr.h
+lmtp_chat.o: lmtp_chat.c
+lmtp_chat.o: ../include/sys_defs.h
+lmtp_chat.o: ../include/msg.h
+lmtp_chat.o: ../include/vstring.h
+lmtp_chat.o: ../include/vbuf.h
+lmtp_chat.o: ../include/vstream.h
+lmtp_chat.o: ../include/binattr.h
+lmtp_chat.o: ../include/argv.h
+lmtp_chat.o: ../include/stringops.h
+lmtp_chat.o: ../include/line_wrap.h
+lmtp_chat.o: ../include/mymalloc.h
+lmtp_chat.o: ../include/recipient_list.h
+lmtp_chat.o: ../include/deliver_request.h
+lmtp_chat.o: ../include/smtp_stream.h
+lmtp_chat.o: ../include/mail_params.h
+lmtp_chat.o: ../include/mail_addr.h
+lmtp_chat.o: ../include/post_mail.h
+lmtp_chat.o: ../include/cleanup_user.h
+lmtp_chat.o: lmtp.h
+lmtp_connect.o: lmtp_connect.c
+lmtp_connect.o: ../include/sys_defs.h
+lmtp_connect.o: ../include/msg.h
+lmtp_connect.o: ../include/vstream.h
+lmtp_connect.o: ../include/vbuf.h
+lmtp_connect.o: ../include/binattr.h
+lmtp_connect.o: ../include/vstring.h
+lmtp_connect.o: ../include/split_at.h
+lmtp_connect.o: ../include/mymalloc.h
+lmtp_connect.o: ../include/iostuff.h
+lmtp_connect.o: ../include/timed_connect.h
+lmtp_connect.o: ../include/stringops.h
+lmtp_connect.o: ../include/mail_params.h
+lmtp_connect.o: ../include/mail_proto.h
+lmtp_connect.o: ../include/dns.h
+lmtp_connect.o: lmtp.h
+lmtp_connect.o: ../include/argv.h
+lmtp_connect.o: ../include/deliver_request.h
+lmtp_connect.o: ../include/recipient_list.h
+lmtp_connect.o: lmtp_addr.h
+lmtp_proto.o: lmtp_proto.c
+lmtp_proto.o: ../include/sys_defs.h
+lmtp_proto.o: ../include/msg.h
+lmtp_proto.o: ../include/vstring.h
+lmtp_proto.o: ../include/vbuf.h
+lmtp_proto.o: ../include/vstream.h
+lmtp_proto.o: ../include/binattr.h
+lmtp_proto.o: ../include/vstring_vstream.h
+lmtp_proto.o: ../include/stringops.h
+lmtp_proto.o: ../include/mymalloc.h
+lmtp_proto.o: ../include/mail_params.h
+lmtp_proto.o: ../include/smtp_stream.h
+lmtp_proto.o: ../include/mail_queue.h
+lmtp_proto.o: ../include/recipient_list.h
+lmtp_proto.o: ../include/deliver_request.h
+lmtp_proto.o: ../include/deliver_completed.h
+lmtp_proto.o: ../include/defer.h
+lmtp_proto.o: ../include/bounce.h
+lmtp_proto.o: ../include/sent.h
+lmtp_proto.o: ../include/record.h
+lmtp_proto.o: ../include/rec_type.h
+lmtp_proto.o: ../include/off_cvt.h
+lmtp_proto.o: ../include/mark_corrupt.h
+lmtp_proto.o: lmtp.h
+lmtp_proto.o: ../include/argv.h
+lmtp_proto.o: quote_821_local.h
+lmtp_session.o: lmtp_session.c
+lmtp_session.o: ../include/sys_defs.h
+lmtp_session.o: ../include/mymalloc.h
+lmtp_session.o: ../include/vstream.h
+lmtp_session.o: ../include/vbuf.h
+lmtp_session.o: ../include/binattr.h
+lmtp_session.o: ../include/debug_peer.h
+lmtp_session.o: lmtp.h
+lmtp_session.o: ../include/vstring.h
+lmtp_session.o: ../include/argv.h
+lmtp_session.o: ../include/deliver_request.h
+lmtp_session.o: ../include/recipient_list.h
+lmtp_state.o: lmtp_state.c
+lmtp_state.o: ../include/sys_defs.h
+lmtp_state.o: ../include/mymalloc.h
+lmtp_state.o: ../include/vstring.h
+lmtp_state.o: ../include/vbuf.h
+lmtp_state.o: ../include/vstream.h
+lmtp_state.o: ../include/binattr.h
+lmtp_state.o: ../include/config.h
+lmtp_state.o: ../include/mail_conf.h
+lmtp_state.o: lmtp.h
+lmtp_state.o: ../include/argv.h
+lmtp_state.o: ../include/deliver_request.h
+lmtp_state.o: ../include/recipient_list.h
+lmtp_trouble.o: lmtp_trouble.c
+lmtp_trouble.o: ../include/sys_defs.h
+lmtp_trouble.o: ../include/msg.h
+lmtp_trouble.o: ../include/vstring.h
+lmtp_trouble.o: ../include/vbuf.h
+lmtp_trouble.o: ../include/stringops.h
+lmtp_trouble.o: ../include/mymalloc.h
+lmtp_trouble.o: ../include/smtp_stream.h
+lmtp_trouble.o: ../include/vstream.h
+lmtp_trouble.o: ../include/binattr.h
+lmtp_trouble.o: ../include/deliver_request.h
+lmtp_trouble.o: ../include/recipient_list.h
+lmtp_trouble.o: ../include/deliver_completed.h
+lmtp_trouble.o: ../include/bounce.h
+lmtp_trouble.o: ../include/defer.h
+lmtp_trouble.o: ../include/mail_error.h
+lmtp_trouble.o: ../include/name_mask.h
+lmtp_trouble.o: lmtp.h
+lmtp_trouble.o: ../include/argv.h
+quote_821_local.o: quote_821_local.c
+quote_821_local.o: ../include/sys_defs.h
+quote_821_local.o: ../include/vstring.h
+quote_821_local.o: ../include/vbuf.h
+quote_821_local.o: quote_821_local.h
index e6545ff75fc17334360a4e41c844fe0dee688219..e19e590116f308ba272f2386cd85b84d3b6eba70 100644 (file)
@@ -1,5 +1,4 @@
 sed '
-       s/LMTP/SMTP/g
-       s/lmtp/smtp/g
-       s/host/namaddr/g
+       s/SMTP/LMTP/g
+       s/smtp/lmtp/g
 ' $*
diff --git a/postfix/lmtp/global-patch b/postfix/lmtp/global-patch
deleted file mode 100644 (file)
index cf604b9..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-*** ../../orig/global/mail_params.h    Thu Jan 27 20:05:29 2000
---- global/mail_params.h       Wed Feb 23 01:26:01 2000
-***************
-*** 624,629 ****
---- 624,683 ----
-  extern int var_smtpd_err_sleep;
-  
-   /*
-+   * LMTP client. Timeouts inspired by RFC 1123. The LMTP recipient limit
-+   * determines how many recipient addresses the LMTP client sends along with
-+   * each message. Unfortunately, some mailers misbehave and disconnect (smap)
-+   * when given more recipients than they are willing to handle.
-+   */
-+ #define VAR_LMTP_TCP_PORT    "lmtp_tcp_port"
-+ #define DEF_LMTP_TCP_PORT    24
-+ extern int var_lmtp_tcp_port;
-+ 
-+ #define VAR_LMTP_CACHE_CONN  "lmtp_cache_connection"
-+ #define DEF_LMTP_CACHE_CONN  1
-+ extern bool var_lmtp_cache_conn;
-+ 
-+ #define VAR_LMTP_SKIP_QUIT_RESP      "lmtp_skip_quit_response"
-+ #define DEF_LMTP_SKIP_QUIT_RESP      0
-+ extern bool var_lmtp_skip_quit_resp;
-+ 
-+ #define VAR_LMTP_CONN_TMOUT  "lmtp_connect_timeout"
-+ #define DEF_LMTP_CONN_TMOUT  0
-+ extern int var_lmtp_conn_tmout;
-+ 
-+ #define VAR_LMTP_RSET_TMOUT  "lmtp_rset_timeout"
-+ #define DEF_LMTP_RSET_TMOUT  300
-+ extern int var_lmtp_rset_tmout;
-+ 
-+ #define VAR_LMTP_LHLO_TMOUT  "lmtp_lhlo_timeout"
-+ #define DEF_LMTP_LHLO_TMOUT  300
-+ extern int var_lmtp_lhlo_tmout;
-+ 
-+ #define VAR_LMTP_MAIL_TMOUT  "lmtp_mail_timeout"
-+ #define DEF_LMTP_MAIL_TMOUT  300
-+ extern int var_lmtp_mail_tmout;
-+ 
-+ #define VAR_LMTP_RCPT_TMOUT  "lmtp_rcpt_timeout"
-+ #define DEF_LMTP_RCPT_TMOUT  300
-+ extern int var_lmtp_rcpt_tmout;
-+ 
-+ #define VAR_LMTP_DATA0_TMOUT "lmtp_data_init_timeout"
-+ #define DEF_LMTP_DATA0_TMOUT 120
-+ extern int var_lmtp_data0_tmout;
-+ 
-+ #define VAR_LMTP_DATA1_TMOUT "lmtp_data_xfer_timeout"
-+ #define DEF_LMTP_DATA1_TMOUT 180
-+ extern int var_lmtp_data1_tmout;
-+ 
-+ #define VAR_LMTP_DATA2_TMOUT "lmtp_data_done_timeout"
-+ #define DEF_LMTP_DATA2_TMOUT 600
-+ extern int var_lmtp_data2_tmout;
-+ 
-+ #define VAR_LMTP_QUIT_TMOUT  "lmtp_quit_timeout"
-+ #define DEF_LMTP_QUIT_TMOUT  300
-+ extern int var_lmtp_quit_tmout;
-+ 
-+  /*
-    * Cleanup service. Header info that exceeds $header_size_limit bytes forces
-    * the start of the message body.
-    */
index 3ed78e8304bef547a1d5551a7a7739c1c54e38c7..34cf6f24066c2c6876cfe720d2ab13eb7f5b50c8 100644 (file)
 /*     be tried again at a later time. Delivery problem reports are sent
 /*     to the \fBbounce\fR(8) or \fBdefer\fR(8) daemon as appropriate.
 /*
-/*     There are two basic modes of operation for the LMTP client:
-/* .IP \(bu
-/*     Communication with a local LMTP server via UNIX domain sockets.
-/* .IP \(bu
-/*     Communication with a (possibly remote) LMTP server via
-/*     Internet sockets.
-/* .PP
-/*     If no server attributes are specified, the LMTP client will contact
-/*     the destination host derived from the message delivery request using
+/*     If no server is given on the command line, the LMTP client connects
+/*     to the destination specified in the message delivery request and to
 /*     the TCP port defined as \fBlmtp\fR in \fBservices\fR(4).  If no such
 /*     service is found, the \fBlmtp_tcp_port\fR configuration parameter
-/*     (default value of 24) will be used.
-/*
-/*     In order to use a local LMTP server, this LMTP server will need to
-/*     be specified via the server attributes described in the following
-/*     section.  Typically, the LMTP client would also be configured as the
-/*     \fBlocal\fR delivery agent in the \fBmaster.cf\fR file.
+/*     (default value of 24) will be used. The LMTP client does not perform
+/*     MX (mail exchanger) lookups since those are defined only for SMTP.
 /* SERVER ATTRIBUTE SYNTAX
 /* .ad
 /* .fi
 /*     The server attributes are given in the \fBmaster.cf\fR file at
 /*     the end of a service definition.  The syntax is as follows:
-/* .IP "\fBserv\fR=\fItype\fR:\fIserver\fR"
-/*     The LMTP server to connect to for final delivery.  The \fItype\fR
-/*     portion can be either \fBunix\fR or \fBinet\fR. The \fIserver\fR
-/*     portion is the path or address of the LMTP server, depending on the
-/*     value of \fItype\fR, as shown below:
-/* .RS
-/* .IP "\fBserv=unix:\fR\fIclass\fR\fB/\fR\fIservname\fR"
-/*     This specifies that the local LMTP server \fIservname\fR should be
-/*     contacted for final delivery.  Both \fIclass\fR (either \fBpublic\fR
-/*     or \fBprivate\fR) and \fIservname\fR correspond to the LMTP server
-/*     entry in the \fBmaster.cf\fR file.  This LMTP server will likely
-/*     be defined as a \fBspawn\fR(8) service.
-/* .IP "\fBserv=inet:"
-/*     If nothing follows the \fBinet:\fR type specifier, a connection will
-/*     be attempted to the destination host indicated in the delivery request.
-/*     This simplest case is identical to defining the LMTP client without
-/*     any server attributes at all.
-/* .IP "\fBserv=inet:\fR\fIaddress\fR"
-/*     In this case, an Internet socket will be made to the server
-/*     specified by \fIaddress\fR.  The connection will use a destination
-/*     port as described in the previous section.
-/* .IP "\fBserv=inet:\fR\fIaddress\fR\fB:\fR\fIport\fR"
-/*     Connect to the LMTP server at \fIaddress\fR, but this time use port
-/*     \fIport\fR instead of the default \fBlmtp\fR port.
-/* .IP "\fBserv=inet:[\fR\fIipaddr\fR\fB]\fR"
-/*     The LMTP server to contact is specified using an Internet address
-/*     in the "dot notation".  That is, the numeric IP address rather
-/*     than the DNS name for the server.  The default \fBlmtp\fR port
-/*     is used.
-/* .IP "\fBserv=inet:[\fR\fIipaddr\fR\fB]:\fR\fIport\fR"
-/*     The LMTP server to contact is specified using the numeric IP address,
-/*     at the port specified.
-/* .RE
+/* .IP "\fBserver=\fR\fIhost\fR"
+/* .IP "\fBserver=\fR\fIhost\fR\fB:\fR\fIport\fR"
+/* .IP "\fBserver=[\fR\fIipaddr\fR\fB]\fR"
+/* .IP "\fBserver=[\fR\fIipaddr\fR\fB]:\fR\fIport\fR"
+/*     Connect to the specified host or IP address and TCP port (default: the
+/*     \fBlmtp\fR port as specified in the \fBservices\fR database).
 /* .PP
 /* SECURITY
 /* .ad
 /*     servers and to DNS servers on the network. The LMTP client can be
 /*     run chrooted at fixed low privilege.
 /* STANDARDS
-/*     RFC 2033 (LMTP protocol)
 /*     RFC 821 (SMTP protocol)
 /*     RFC 1651 (SMTP service extensions)
 /*     RFC 1870 (Message Size Declaration)
+/*     RFC 2033 (LMTP protocol)
 /*     RFC 2197 (Pipelining)
 /* DIAGNOSTICS
 /*     Problems and transactions are logged to \fBsyslogd\fR(8).
 /*     Cached connections are closed under any of the following conditions:
 /* .RS
 /* .IP \(bu
-/*     The idle timeout for the LMTP client is reached. This limit is
-/*     enforced by \fBmaster\fR(8).
+/*     The LMTP client idle time limit is reached. This limit is specified
+/*     with the Postfix \fBmax_idle\fR configuration parameter.
 /* .IP \(bu
-/*     A message request to a different destination than the one currently
-/*     cached.
+/*     A delivery request specifies a different destination than the one
+/*     currently cached.
 /* .IP \(bu
-/*     The maximum number of requests per session is reached. This limit is
-/*     enforced by \fBmaster\fR(8).
+/*     The per-process limit on the number of delivery requests is reached.
+/*     This limit is specified with the Postfix \fBmax_use\fR configuration
+/*     parameter.
 /* .IP \(bu
 /*     Upon the onset of another delivery request, the LMTP server associated
 /*     with the current session does not respond to the \fBRSET\fR command.
 /* .RE
-/* .IP \fBlmtp_destination_concurrency_limit\fR
-/*     Limit the number of parallel deliveries to the same destination.
+/* .IP \fItransport_\fBdestination_concurrency_limit\fR
+/*     Limit the number of parallel deliveries to the same destination
+/*     via this mail delivery transport. \fItransport\fR is the name
+/*     of the service as specified in the \fBmaster.cf\fR file.
 /*     The default limit is taken from the
 /*     \fBdefault_destination_concurrency_limit\fR parameter.
-/* .IP \fBlmtp_destination_recipient_limit\fR
-/*     Limit the number of recipients per message delivery.
-/*     The default limit is taken from the
-/*     \fBdefault_destination_recipient_limit\fR parameter.
-/* .IP \fBlocal_destination_recipient_limit\fR
-/*     Limit the number of recipients per message delivery.
+/* .IP \fItransport_\fBdestination_recipient_limit\fR
+/*     Limit the number of recipients per message delivery via this mail
+/*     delivery transport. \fItransport\fR is the name
+/*     of the service as specified in the \fBmaster.cf\fR file.
 /*     The default limit is taken from the
 /*     \fBdefault_destination_recipient_limit\fR parameter.
 /*
 /*     This parameter becomes significant if the LMTP client is used
-/*     for local delivery.  Some LMTP servers can optimize final delivery
-/*     if multiple recipients are allowed.  Therefore, it may be advantageous
-/*     to set this to some number greater than one, depending on the capabilities
-/*     of the machine.
+/*     for local delivery.  Some LMTP servers can optimize delivery of
+/*     the same message to multiple recipients. The default limit for
+/*     local mail delivery is 1.
 /*
-/*     Setting this parameter to 0 will lead to an unlimited number of
+/*     Setting this parameter to 0 will lead to an unbounded number of
 /*     recipients per delivery.  However, this could be risky since it may
 /*     make the machine vulnerable to running out of resources if messages
 /*     are encountered with an inordinate number of recipients.  Exercise
 #include <argv.h>
 #include <mymalloc.h>
 #include <name_mask.h>
+#include <split_at.h>
 
 /* Global library. */
 
@@ -295,23 +258,11 @@ char   *var_error_rcpt;
 int     lmtp_errno;
 static LMTP_STATE *state = 0;
 
-
 /* get_service_attr - get command-line attributes */
 
-static LMTP_ATTR *get_service_attr(char **argv)
+static void get_service_attr(LMTP_STATE *state, char **argv)
 {
     char   *myname = "get_service_attr";
-    LMTP_ATTR *attr = (LMTP_ATTR *) mymalloc(sizeof(*attr));
-    char   *type;
-    char   *dest;
-    char   *name;
-
-    /*
-     * Initialize.
-     */
-    attr->type = 0;
-    attr->class = "";
-    attr->name = "";
 
     /*
      * Iterate over the command-line attribute list.
@@ -322,73 +273,37 @@ static LMTP_ATTR *get_service_attr(char **argv)
     for ( /* void */ ; *argv != 0; argv++) {
 
        /*
-        * Are we configured to speak to a particular LMTP server?
+        * Connect to a fixed LMTP server.
         */
-       if (strncasecmp("serv=", *argv, sizeof("serv=") - 1) == 0) {
-           type = *argv + sizeof("serv=") - 1;
-           if ((dest = split_at(type, ':')) == 0)      /* XXX clobbers argv */
-               msg_fatal("%s: invalid serv= arguments: %s", myname, *argv);
-
-           /*
-            * What kind of socket connection are we to make?
-            */
-           if (strcasecmp("unix", type) == 0) {
-               attr->type = LMTP_SERV_TYPE_UNIX;
-               attr->class = dest;
-               if ((name = split_at(dest, '/')) == 0)  /* XXX clobbers argv */
-                   msg_fatal("%s: invalid serv= arguments: %s", myname, *argv);
-               attr->name = name;
-           } else if (strcasecmp("inet", type) == 0) {
-               attr->type = LMTP_SERV_TYPE_INET;
-               attr->name = dest;
-           } else
-               msg_fatal("%s: invalid serv= arguments: %s", myname, *argv);
-           break;
+       if (strncasecmp("server=", *argv, sizeof("server=") - 1) == 0) {
+           state->fixed_dest = *argv + sizeof("server=") - 1;
+           if (state->fixed_dest[0] == 0)
+               msg_fatal("invalid destination: %s", *argv);
        }
 
        /*
         * Bad.
         */
        else
-           msg_fatal("%s: unknown attribute name: %s", myname, *argv);
+           msg_fatal("unknown attribute name: %s", *argv);
     }
-
-    /*
-     * Give the poor tester a clue of what is going on.
-     */
-    if (msg_verbose)
-       msg_info("%s: type %d, class \"%s\", name \"%s\".", myname,
-                attr->type, attr->class, attr->name);
-    return (attr);
 }
 
 /* deliver_message - deliver message with extreme prejudice */
 
-static int deliver_message(DELIVER_REQUEST *request, char **argv)
+static int deliver_message(DELIVER_REQUEST *request, char **unused_argv)
 {
     char   *myname = "deliver_message";
-    static LMTP_ATTR *attr = 0;
+    char   *destination;
     VSTRING *why;
     int     result;
 
-    /*
-     * Macro for readability.  We're going to the same destination if the
-     * destination was specified on the command line (attr->name is not
-     * null), or if the destination of the current session is the same as
-     * request->nexthop.
-     */
-#define SAME_DESTINATION() \
-    (*(attr)->name \
-     || strcasecmp(state->session->destination, request->nexthop) == 0)
-
     if (msg_verbose)
        msg_info("%s: from %s", myname, request->sender);
 
     /*
      * Sanity checks.
      */
-    if (attr == 0)
-       attr = get_service_attr(argv);
     if (request->rcpt_list.len <= 0)
        msg_fatal("%s: recipient count: %d", myname, request->rcpt_list.len);
 
@@ -397,14 +312,16 @@ static int deliver_message(DELIVER_REQUEST *request, char **argv)
      * we can produce understandable diagnostics when something goes wrong
      * many levels below. The alternative would be to make everything global.
      * 
-     * Note: `state' is global (to this file) so that we can close a cached
-     * connection via the MAIL_SERVER_EXIT function (cleanup). The alloc for
-     * `state' is performed in the MAIL_SERVER_PRE_INIT function (pre_init).
+     * Note: `state' was made global (to this file) so that we can cache
+     * connections and so that we can close a cached connection via the
+     * MAIL_SERVER_EXIT function (cleanup). The alloc for `state' is
+     * performed in the MAIL_SERVER_PRE_INIT function (pre_init).
      * 
      */
     why = vstring_alloc(100);
     state->request = request;
     state->src = request->fp;
+    destination = state->fixed_dest ? state->fixed_dest : request->nexthop;
 
     /*
      * See if we can reuse an existing connection.
@@ -412,29 +329,29 @@ static int deliver_message(DELIVER_REQUEST *request, char **argv)
     if (state->session != 0) {
 
        /*
-        * Session already exists from a previous delivery. If we're not
-        * going to the same destination as before, disconnect and establish
-        * a connection to the specified destination.
+        * Disconnect if we're going to a different destination. Discard
+        * transcript and status information from sending QUIT.
         */
-       if (!SAME_DESTINATION()) {
+       if (strcasecmp(state->session->dest, destination) != 0) {
            lmtp_quit(state);
            lmtp_chat_reset(state);
-           lmtp_session_reset(state);
-           debug_peer_restore();
+           state->session = lmtp_session_free(state->session);
        }
 
        /*
-        * Probe the session by sending RSET. If the connection is broken,
-        * clean up our side of the connection.
+        * Disconnect if RSET can't be sent over an existing connection.
+        * Discard transcript and status information from sending RSET.
         */
        else if (lmtp_rset(state) != 0) {
            lmtp_chat_reset(state);
-           lmtp_session_reset(state);
-           debug_peer_restore();
+           state->session = lmtp_session_free(state->session);
        }
 
        /*
-        * Ready to go with another load.
+        * Ready to go with another load. The reuse counter is logged for
+        * statistical analysis purposes. Given the Postfix architecture,
+        * connection cacheing makes sense only for dedicated transports.
+        * Logging the reuse count can help to convince people.
         */
        else {
            ++state->reuse;
@@ -445,56 +362,51 @@ static int deliver_message(DELIVER_REQUEST *request, char **argv)
     }
 
     /*
-     * If no LMTP session exists, establish one.
+     * See if we need to establish an LMTP connection.
      */
     if (state->session == 0) {
 
        /*
         * Bounce or defer the recipients if no connection can be made.
         */
-       state->session = lmtp_connect(attr, request, why);
-       if (state->session == 0) {
+       if ((state->session = lmtp_connect(destination, why)) == 0) {
            lmtp_site_fail(state, lmtp_errno == LMTP_RETRY ? 450 : 550,
                           "%s", vstring_str(why));
        }
 
        /*
-        * Further check connection by sending the LHLO greeting. If we
-        * cannot talk LMTP to this destination give up, at least for now.
+        * Bounce or defer the recipients if the LMTP handshake fails.
         */
-       else {
-           debug_peer_check(state->session->host, state->session->addr);
-           if (lmtp_lhlo(state) != 0) {
-               lmtp_session_reset(state);
-               debug_peer_restore();
-           }
+       else if (lmtp_lhlo(state) != 0) {
+           state->session = lmtp_session_free(state->session);
        }
 
+       /*
+        * Congratulations. We just established a new LMTP connection.
+        */
+       else
+           state->reuse = 0;
     }
 
     /*
      * If a session exists, deliver this message to all requested recipients.
-     * 
      */
     if (state->session != 0)
        lmtp_xfer(state);
 
     /*
-     * At the end, notify the postmaster of any protocol errors.
+     * Optionally, notify the postmaster of problems.
      */
     if (state->history != 0
-       && (state->error_mask
-           & name_mask(mail_error_masks, var_notify_classes)))
+    && (state->error_mask & name_mask(mail_error_masks, var_notify_classes)))
        lmtp_chat_notify(state);
 
     /*
-     * Disconnect if we're not cacheing connections.
+     * Disconnect if we're not cacheing connections. The pipelined protocol
+     * state machine knows to send QUIT as appropriate.
      */
-    if (!var_lmtp_cache_conn && state->session != 0) {
-       lmtp_quit(state);
-       lmtp_session_reset(state);
-       debug_peer_restore();
-    }
+    if (!var_lmtp_cache_conn && state->session != 0)
+       state->session = lmtp_session_free(state->session);
 
     /*
      * Clean up.
@@ -527,33 +439,36 @@ static void lmtp_service(VSTREAM *client_stream, char *unused_service, char **ar
     }
 }
 
+/* post_init - post-jail initialization */
+
+static void post_init(char *unused_name, char **argv)
+{
+    state = lmtp_state_alloc();
+    get_service_attr(state, argv);
+}
+
 /* pre_init - pre-jail initialization */
 
 static void pre_init(char *unused_name, char **unused_argv)
 {
     debug_peer_init();
-    state = lmtp_state_alloc();
 }
 
 /* cleanup - close any open connections, etc. */
 
-static void cleanup()
+static void cleanup(void)
 {
-    if (state == 0)
-       return;
-
     if (state->session != 0) {
        lmtp_quit(state);
        lmtp_chat_reset(state);
-       lmtp_session_free(state->session);
-       debug_peer_restore();
+       state->session = lmtp_session_free(state->session);
        if (msg_verbose)
            msg_info("cleanup: just closed down session");
     }
     lmtp_state_free(state);
 }
 
-/* pre_accept - see if tables have changed
+/* pre_accept - see if tables have changed */
 
 static void pre_accept(char *unused_name, char **unused_argv)
 {
@@ -564,10 +479,7 @@ static void pre_accept(char *unused_name, char **unused_argv)
     }
 }
 
-
-/*
-   main - pass control to the single-threaded skeleton
-*/
+/* main - pass control to the single-threaded skeleton */
 
 int     main(int argc, char **argv)
 {
@@ -602,6 +514,7 @@ int     main(int argc, char **argv)
                       MAIL_SERVER_STR_TABLE, str_table,
                       MAIL_SERVER_BOOL_TABLE, bool_table,
                       MAIL_SERVER_PRE_INIT, pre_init,
+                      MAIL_SERVER_POST_INIT, post_init,
                       MAIL_SERVER_PRE_ACCEPT, pre_accept,
                       MAIL_SERVER_EXIT, cleanup,
                       0);
index b93d53e9f7db11803fbbc141aa1e03b135b094e9..04faa6e8be33cdbab21658b23aa1bcd9411e6fd9 100644 (file)
@@ -38,6 +38,7 @@ typedef struct LMTP_STATE {
     int     sndbufsize;                        /* total window size */
     int     sndbuffree;                        /* remaining window */
     int     reuse;                     /* connection being reused */
+    char   *fixed_dest;                        /* fixed remote server */
 } LMTP_STATE;
 
 #define LMTP_FEATURE_ESMTP     (1<<0)
@@ -50,42 +51,24 @@ typedef struct LMTP_STATE {
   */
 extern int lmtp_errno;                 /* XXX can we get rid of this? */
 
- /*
-  * Structure for connection to LMTP server.
-  */
-typedef struct LMTP_ATTR {
-    int     type;                      /* UNIX-domain, INET, etc. */
-    char   *class;                     /* class ("public" or "private") */
-    char   *name;                      /* service endpoint name */
-} LMTP_ATTR;
-
- /*
-  * Service types.
-  */
-#define LMTP_SERV_TYPE_UNIX   1                /* AF_UNIX domain socket */
-#define LMTP_SERV_TYPE_INET   2                /* AF_INET domain socket */
-
  /*
   * lmtp_session.c
   */
 typedef struct LMTP_SESSION {
     VSTREAM *stream;                   /* network connection */
-    char   *host;                      /* mail exchanger */
-    char   *addr;                      /* mail exchanger */
-    char   *destination;               /* domain originally sent to */
-    int     type;                      /* type of connection */
+    char   *host;                      /* mail exchanger, name */
+    char   *addr;                      /* mail exchanger, address */
+    char   *namaddr;                   /* mail exchanger, for logging */
+    char   *dest;                      /* remote endpoint name */
 } LMTP_SESSION;
 
-extern LMTP_SESSION *lmtp_session_alloc(VSTREAM *, char *, char *);
-extern void lmtp_session_free(LMTP_SESSION *);
-extern void lmtp_session_reset(LMTP_STATE *);
+extern LMTP_SESSION *lmtp_session_alloc(VSTREAM *, const char *, const char *, const char *);
+extern LMTP_SESSION *lmtp_session_free(LMTP_SESSION *);
 
  /*
   * lmtp_connect.c
   */
-extern LMTP_SESSION *lmtp_connect(LMTP_ATTR *, DELIVER_REQUEST *request, VSTRING *);
-extern LMTP_SESSION *lmtp_connect_host(char *, unsigned, VSTRING *);
-extern LMTP_SESSION *lmtp_connect_local(const char *, const char *, VSTRING *);
+extern LMTP_SESSION *lmtp_connect(const char *, VSTRING *);
 
  /*
   * lmtp_proto.c
index 69c49a510d40cdcd18f229a7a020231e43112173..72bc77db33ab5a407a89d4537f673fce5c5ebf97 100644 (file)
@@ -18,8 +18,8 @@
 /*     host.  The host can be specified as a numerical Internet network
 /*     address, or as a symbolic host name.
 /*
-/*      Fortunately, we don't have to worry about MX records because
-/*      those are for SMTP servers, not LMTP servers.
+/*     Fortunately, we don't have to worry about MX records because
+/*     those are for SMTP servers, not LMTP servers.
 /*
 /*     Results from lmtp_host_addr() are destroyed by dns_rr_free(),
 /*     including null lists.
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
 /*
-/*      Alterations for LMTP by:
-/*      Philip A. Prindeville
-/*      Mirapoint, Inc.
-/*      USA.
+/*     Alterations for LMTP by:
+/*     Philip A. Prindeville
+/*     Mirapoint, Inc.
+/*     USA.
 /*
-/*      Additional work on LMTP by:
-/*      Amos Gouaux
-/*      University of Texas at Dallas
-/*      P.O. Box 830688, MC34
-/*      Richardson, TX 75083, USA
+/*     Additional work on LMTP by:
+/*     Amos Gouaux
+/*     University of Texas at Dallas
+/*     P.O. Box 830688, MC34
+/*     Richardson, TX 75083, USA
 /*--*/
 
 /* System library. */
@@ -199,4 +199,3 @@ DNS_RR *lmtp_host_addr(char *host, VSTRING *why)
        lmtp_print_addr(host, addr_list);
     return (addr_list);
 }
-
index 097169b76a525518adc7af403be58c00e4cfd194..9fd23f2bf04629fe2e56c880379cc057b4464c05 100644 (file)
@@ -46,6 +46,8 @@
 /*     lmtp_chat_reset() resets the transaction log. This is
 /*     typically done at the beginning or end of an LMTP session,
 /*     or within a session to discard non-error information.
+/*     In addition, lmtp_chat_reset() resets the per-session error
+/*     status bits and flags.
 /* DIAGNOSTICS
 /*     Fatal errors: memory allocation problem, server response exceeds
 /*     configurable limit.
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
 /*
-/*      Alterations for LMTP by:
-/*      Philip A. Prindeville
-/*      Mirapoint, Inc.
-/*      USA.
+/*     Alterations for LMTP by:
+/*     Philip A. Prindeville
+/*     Mirapoint, Inc.
+/*     USA.
 /*
-/*      Additional work on LMTP by:
-/*      Amos Gouaux
-/*      University of Texas at Dallas
-/*      P.O. Box 830688, MC34
-/*      Richardson, TX 75083, USA
+/*     Additional work on LMTP by:
+/*     Amos Gouaux
+/*     University of Texas at Dallas
+/*     P.O. Box 830688, MC34
+/*     Richardson, TX 75083, USA
 /*--*/
 
 /* System library. */
@@ -118,7 +120,6 @@ void    lmtp_chat_reset(LMTP_STATE *state)
        argv_free(state->history);
        state->history = 0;
     }
-
     /* What's status without history? */
     state->status = 0;
     state->error_mask = 0;
@@ -157,7 +158,7 @@ void    lmtp_chat_cmd(LMTP_STATE *state, char *fmt,...)
      * program is trying to do.
      */
     if (msg_verbose)
-       msg_info("> %s: %s", session->host, STR(state->buffer));
+       msg_info("> %s: %s", session->namaddr, STR(state->buffer));
 
     /*
      * Send the command to the LMTP server.
@@ -192,9 +193,9 @@ LMTP_RESP *lmtp_chat_resp(LMTP_STATE *state)
        cp = printable(STR(state->buffer), '?');
        if (last_char != '\n')
            msg_warn("%s: response longer than %d: %.30s...",
-                    session->host, var_line_limit, cp);
+                    session->namaddr, var_line_limit, cp);
        if (msg_verbose)
-           msg_info("< %s: %s", session->host, cp);
+           msg_info("< %s: %s", session->namaddr, cp);
        while (ISDIGIT(*cp))
            cp++;
        rdata.code = (cp - STR(state->buffer) == 3 ?
@@ -261,7 +262,7 @@ void    lmtp_chat_notify(LMTP_STATE *state)
 #define INDENT 4
 
     notice = post_mail_fopen_nowait(mail_addr_double_bounce(),
-                                    var_error_rcpt,
+                                   var_error_rcpt,
                                    NULL_CLEANUP_FLAGS, "NOTICE");
     if (notice == 0) {
        msg_warn("postmaster notify: %m");
@@ -271,9 +272,9 @@ void    lmtp_chat_notify(LMTP_STATE *state)
                      mail_addr_mail_daemon());
     post_mail_fprintf(notice, "To: %s (Postmaster)", var_error_rcpt);
     post_mail_fprintf(notice, "Subject: %s LMTP client: errors from %s",
-                     var_mail_name, session->host);
+                     var_mail_name, session->namaddr);
     post_mail_fputs(notice, "");
-    post_mail_fprintf(notice, "Unexpected response from %s.", session->host);
+    post_mail_fprintf(notice, "Unexpected response from %s.", session->namaddr);
     post_mail_fputs(notice, "");
     post_mail_fputs(notice, "Transcript of session follows.");
     post_mail_fputs(notice, "");
index dcf5733ec10a1e45e99fef0d103d3cd2d3beaf90..28d64e953b4c2dc4bcbcdbaf0d2dd483aafe99b0 100644 (file)
@@ -1,6 +1,6 @@
 /*++
 /* NAME
-/*     lmtp_connect 3
+/*     lmtp_connect_inet 3
 /* SUMMARY
 /*     connect to LMTP server
 /* SYNOPSIS
@@ -19,7 +19,6 @@
 /*     separated by a colon (":").
 /*
 /*     Numerical address information should always be quoted with `[]'.
-/*
 /* DIAGNOSTICS
 /*     This routine either returns an LMTP_SESSION pointer, or
 /*     returns a null pointer and set the \fIlmtp_errno\fR
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
 /*
-/*      Alterations for LMTP by:
-/*      Philip A. Prindeville
-/*      Mirapoint, Inc.
-/*      USA.
+/*     Alterations for LMTP by:
+/*     Philip A. Prindeville
+/*     Mirapoint, Inc.
+/*     USA.
 /*
-/*      Additional work on LMTP by:
-/*      Amos Gouaux
-/*      University of Texas at Dallas
-/*      P.O. Box 830688, MC34
-/*      Richardson, TX 75083, USA
+/*     Additional work on LMTP by:
+/*     Amos Gouaux
+/*     University of Texas at Dallas
+/*     P.O. Box 830688, MC34
+/*     Richardson, TX 75083, USA
 /*--*/
 
 /* System library. */
@@ -80,7 +79,6 @@
 #include <vstring.h>
 #include <split_at.h>
 #include <mymalloc.h>
-#include <inet_addr_list.h>
 #include <iostuff.h>
 #include <timed_connect.h>
 #include <stringops.h>
@@ -88,7 +86,7 @@
 /* Global library. */
 
 #include <mail_params.h>
-#include <own_inet_addr.h>
+#include <mail_proto.h>
 
 /* DNS library. */
 
 /* lmtp_connect_addr - connect to explicit address */
 
 static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
-                                              VSTRING *why)
+                                     const char *destination, VSTRING *why)
 {
     char   *myname = "lmtp_connect_addr";
     struct sockaddr_in sin;
     int     sock;
-    INET_ADDR_LIST *addr_list;
     int     conn_stat;
     int     saved_errno;
     VSTREAM *stream;
     int     ch;
-    unsigned long inaddr;
 
     /*
      * Sanity checks.
@@ -132,21 +128,6 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
     if ((sock = socket(sin.sin_family, SOCK_STREAM, 0)) < 0)
        msg_fatal("%s: socket: %m", myname);
 
-    /* do we still need this if? */
-    addr_list = own_inet_addr_list();
-    if (addr_list->used == 1) {
-       sin.sin_port = 0;
-       memcpy((char *) &sin.sin_addr, addr_list->addrs, sizeof(sin.sin_addr));
-       inaddr = ntohl(sin.sin_addr.s_addr);
-       if (!IN_CLASSA(inaddr)
-           || !(((inaddr & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)) {
-           if (bind(sock, (struct sockaddr *) & sin, sizeof(sin)) < 0)
-               msg_warn("%s: bind %s: %m", myname, inet_ntoa(sin.sin_addr));
-           if (msg_verbose)
-               msg_info("%s: bind %s", myname, inet_ntoa(sin.sin_addr));
-       }
-    }
-
     /*
      * Connect to the LMTP server.
      */
@@ -196,24 +177,26 @@ static LMTP_SESSION *lmtp_connect_addr(DNS_RR *addr, unsigned port,
        vstream_fclose(stream);
        return (0);
     }
+    vstream_ungetc(stream, ch);
 
     /*
-     * Skip this host if it sends a 4xx greeting.
+     * Skip this host if it sends a 4xx or 5xx greeting.
      */
-    if (ch == '4') {
+    if (ch == '4' || ch == '5') {
        vstring_sprintf(why, "connect to %s[%s]: server refused mail service",
                        addr->name, inet_ntoa(sin.sin_addr));
        lmtp_errno = LMTP_RETRY;
        vstream_fclose(stream);
        return (0);
     }
-    vstream_ungetc(stream, ch);
-    return (lmtp_session_alloc(stream, addr->name, inet_ntoa(sin.sin_addr)));
+    return (lmtp_session_alloc(stream, addr->name, inet_ntoa(sin.sin_addr),
+                              destination));
 }
 
 /* lmtp_connect_host - direct connection to host */
 
-LMTP_SESSION *lmtp_connect_host(char *host, unsigned port, VSTRING *why)
+static LMTP_SESSION *lmtp_connect_host(char *host, unsigned port,
+                                     const char *destination, VSTRING *why)
 {
     LMTP_SESSION *session = 0;
     DNS_RR *addr_list;
@@ -226,7 +209,7 @@ LMTP_SESSION *lmtp_connect_host(char *host, unsigned port, VSTRING *why)
      */
     addr_list = lmtp_host_addr(host, why);
     for (addr = addr_list; addr; addr = addr->next) {
-       if ((session = lmtp_connect_addr(addr, port, why)) != 0) {
+       if ((session = lmtp_connect_addr(addr, port, destination, why)) != 0) {
            break;
        }
     }
@@ -236,8 +219,8 @@ LMTP_SESSION *lmtp_connect_host(char *host, unsigned port, VSTRING *why)
 
 /* lmtp_parse_destination - parse destination */
 
-static char *lmtp_parse_destination(char *destination, char *def_service,
-                                           char **hostp, unsigned *portp)
+static char *lmtp_parse_destination(const char *destination, char *def_service,
+                                             char **hostp, unsigned *portp)
 {
     char   *myname = "lmtp_parse_destination";
     char   *buf = mystrdup(destination);
@@ -272,80 +255,24 @@ static char *lmtp_parse_destination(char *destination, char *def_service,
     *hostp = host;
 
     /*
-     * Convert service to port number, network byte order.
+     * Convert service to port number, network byte order. Since most folks
+     * aren't going to have lmtp defined as a service, use a default value
+     * instead of just blowing up.
      */
-    if ((port = atoi(service)) != 0) {
+    if ((port = atoi(service)) != 0)
        *portp = htons(port);
-    } else {
-        /* 
-         * Since most folks aren't going to have lmtp defined as a service,
-         * use a default value instead of just blowing up.
-         */
-       if ((sp = getservbyname(service, protocol)) == 0)
-            *portp = htons(var_lmtp_tcp_port);
-        else 
-            *portp = sp->s_port;
-    }
+    else if ((sp = getservbyname(service, protocol)) != 0)
+       *portp = sp->s_port;
+    else
+       *portp = htons(var_lmtp_tcp_port);
     return (buf);
 }
 
-/* lmtp_connect_local - local connect to unix domain socket */
-
-LMTP_SESSION *lmtp_connect_local(const char *class, const char *name, VSTRING *why)
-{
-    char   *myname = "lmtp_connect_local";
-    VSTREAM *stream;
-    int     ch;
-
-    /*
-     * Connect to the LMTP server.
-     */
-    if (msg_verbose)
-       msg_info("%s: trying: %s/%s...", myname, class, name);
-    if ((stream = mail_connect_wait(class, name)) == 0) {
-        vstring_sprintf(why, "connect to %s: connection failed.", name);
-        lmtp_errno = LMTP_RETRY;
-        return (0);
-    }
-
-    /*
-     * Skip this process if it takes no action within some time limit.
-     */
-    if (read_wait(vstream_fileno(stream), var_lmtp_lhlo_tmout) < 0) {
-        vstring_sprintf(why, "connect to %s: read timeout", name);
-        lmtp_errno = LMTP_RETRY;
-        vstream_fclose(stream);
-        return (0);
-    }
-
-    /*
-     * Skip this process if it disconnects without talking to us.
-     */
-    if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) {
-       vstring_sprintf(why, "connect to %s: server dropped connection", name);
-       lmtp_errno = LMTP_RETRY;
-       vstream_fclose(stream);
-       return (0);
-    }
-
-    /*
-     * Skip this host if it sends a 4xx greeting.
-     */
-    if (ch == '4') {
-       vstring_sprintf(why, "connect to %s: server refused mail service", name);
-       lmtp_errno = LMTP_RETRY;
-       vstream_fclose(stream);
-       return (0);
-    }
-    vstream_ungetc(stream, ch);
-    return (lmtp_session_alloc(stream, name, ""));
-}
-
 /* lmtp_connect - establish LMTP connection */
 
-LMTP_SESSION *lmtp_connect(LMTP_ATTR *attr, DELIVER_REQUEST *request, VSTRING *why)
+LMTP_SESSION *lmtp_connect(const char *destination, VSTRING *why)
 {
-    char   *myname = "lmtp_connect";
+    char   *myname = "lmtp_connect_inet";
     LMTP_SESSION *session;
     char   *dest_buf;
     char   *host;
@@ -353,43 +280,13 @@ LMTP_SESSION *lmtp_connect(LMTP_ATTR *attr, DELIVER_REQUEST *request, VSTRING *w
     char   *def_service = "lmtp";      /* XXX configurable? */
 
     /*
-     * Are we connecting to a local or inet socket?
+     * Connect to the LMTP server.
      */
-    if (attr->type == LMTP_SERV_TYPE_UNIX) {
-        /*
-         * Connect to local LMTP server.
-         */
-        if (msg_verbose)
-            msg_info("%s: connecting to %s", myname, attr->name);
-        session = lmtp_connect_local(attr->class, attr->name, why);
-        if (session != 0) {
-            session->destination = mystrdup(attr->name);
-            session->type = attr->type;
-        }
-    } else {
-        /*
-         * Connect to LMTP server via inet socket, but where?
-         */
-        if (!*(attr)->name) {
-            if (msg_verbose)
-                msg_info("%s: attr->name not set; using request->nexthop", myname);
-            attr->name = request->nexthop;
-        }
-        dest_buf = lmtp_parse_destination(attr->name, def_service, 
-                                          &host, &port);
-        
-        /*
-         * Now that the inet LMTP server has been determined, connect to it.
-         */
-        if (msg_verbose)
-            msg_info("%s: connecting to %s port %d", myname, host, ntohs(port));
-        session = lmtp_connect_host(host, port, why);
-        if (session != 0) {
-            session->destination = mystrdup(attr->name);
-            session->type = attr->type;
-        }
-        myfree(dest_buf);
-    }
+    dest_buf = lmtp_parse_destination(destination, def_service,
+                                     &host, &port);
+    if (msg_verbose)
+       msg_info("%s: connecting to %s port %d", myname, host, ntohs(port));
+    session = lmtp_connect_host(host, port, destination, why);
+    myfree(dest_buf);
     return (session);
 }
-
index 76ae3805ab41c2904981ee288cd41a3491df9e5f..e4396bf8a353d3ce3e31af070b5a1a6747f3f3c6 100644 (file)
 /*     lmtp_lhlo() performs the initial handshake with the LMTP server.
 /*
 /*     lmtp_xfer() sends message envelope information followed by the
-/*     message data, but does not finish the conversation. These operations
-/*     are combined in one function, in order to implement LMTP pipelining.
+/*     message data and sends QUIT when connection cacheing is disabled.
+/*     These operations are combined in one function, in order to implement
+/*     LMTP pipelining.
 /*     Recipients are marked as "done" in the mail queue file when
 /*     bounced or delivered. The message delivery status is updated
 /*     accordingly.
 /*
-/*     lmtp_rset() sends an RSET command and waits for the response.
+/*     lmtp_rset() sends a lone RSET command and waits for the response.
 /*
-/*     lmtp_quit() sends a QUIT command and waits for the response.
+/*     lmtp_quit() sends a lone QUIT command and waits for the response.
 /* DIAGNOSTICS
 /*     lmtp_lhlo(), lmtp_xfer(), lmtp_rset() and lmtp_quit() return 0 in
 /*     case of success, -1 in case of failure. For lmtp_xfer(), lmtp_rset()
  /*
   * Sender and receiver state. A session does not necessarily go through a
   * linear progression, but states are guaranteed to not jump backwards.
-  * Normal sessions go from MAIL->RCPT->DATA->DOT->LAST. The states MAIL,
-  * RCPT, and DATA may also be followed by ABORT->LAST.
+  * Normal sessions go from MAIL->RCPT->DATA->DOT->QUIT->LAST. The states
+  * MAIL, RCPT, and DATA may also be followed by ABORT->QUIT->LAST.
   * 
-  * In order to support connection cacheing, no QUIT is send at the end of mail
-  * delivery. Instead, at the start of the next mail delivery, the client
-  * sends RSET to find out if the server is still there, and sends QUIT only
-  * when closing a connection. The RSET and QUIT commands are sent all by
-  * themselves in non-pipelining mode. The respective state transitions are
-  * RSET->LAST and QUIT->LAST.
+  * When connection cacheing is turned on, the transition diagram changes as
+  * follows. Before sending mail over an existing connection, the client
+  * sends a lone RSET command to find out if the connection still works. The
+  * client sends QUIT only when closing a connection. The respective state
+  * transitions are RSET->LAST and QUIT->LAST.
   * 
-  * For the sake of code reuse, the non-pipelined RSET and QUIT commands are
-  * sent by the same code that implements command pipelining, so that we can
-  * borrow from the existing code for exception handling and error reporting.
+  * For the sake of code reuse, the non-pipelined RSET command is sent by the
+  * same code that implements command pipelining, so that we can borrow from
+  * the existing code for exception handling and error reporting.
   * 
   */
 #define LMTP_STATE_MAIL                0
@@ -172,13 +172,11 @@ int     lmtp_lhlo(LMTP_STATE *state)
 {
     char   *myname = "lmtp_lhlo";
     LMTP_SESSION *session = state->session;
-    DELIVER_REQUEST *request = state->request;
     LMTP_RESP *resp;
     int     except;
     char   *lines;
     char   *words;
     char   *word;
-    int     n;
     SOCKOPT_SIZE optlen = sizeof(state->sndbufsize);
 
     /*
@@ -194,15 +192,7 @@ int     lmtp_lhlo(LMTP_STATE *state)
     if (((resp = lmtp_chat_resp(state))->code / 100) != 2)
        return (lmtp_site_fail(state, resp->code,
                               "%s refused to talk to me: %s",
-                           session->host, translit(resp->str, "\n", " ")));
-
-    /*
-     * See if we are talking to ourself. This should not be possible with the
-     * way we implement DNS lookups. However, people are known to sometimes
-     * screw up the naming service. And, mailer loops are still possible when
-     * our own mailer routing tables are mis-configured.
-     */
-    words = resp->str;
+                        session->namaddr, translit(resp->str, "\n", " ")));
 
     /*
      * Return the compliment.
@@ -211,7 +201,7 @@ int     lmtp_lhlo(LMTP_STATE *state)
     if ((resp = lmtp_chat_resp(state))->code / 100 != 2)
        return (lmtp_site_fail(state, resp->code,
                               "%s refused to talk to me: %s",
-                              session->host,
+                              session->namaddr,
                               translit(resp->str, "\n", " ")));
 
     /*
@@ -249,10 +239,11 @@ int     lmtp_lhlo(LMTP_STATE *state)
      * to be aware of application-level buffering by the vstream module,
      * which is limited to a couple kbytes.
      * 
-     * Don't worry about command pipelining for local connections.
+     * XXX Apparently, the getsockopt() call causes trouble with UNIX-domain
+     * sockets. Don't worry about command pipelining for local connections,
+     * because they benefit little from pipelining.
      */
-    if (state->features & LMTP_FEATURE_PIPELINING
-       && state->session->type != LMTP_SERV_TYPE_UNIX) {
+    if (state->features & LMTP_FEATURE_PIPELINING) {
        if (getsockopt(vstream_fileno(state->session->stream), SOL_SOCKET,
                       SO_SNDBUF, (char *) &state->sndbufsize, &optlen) < 0)
            msg_fatal("%s: getsockopt: %m", myname);
@@ -261,7 +252,6 @@ int     lmtp_lhlo(LMTP_STATE *state)
                     state->sndbufsize);
     } else
        state->sndbufsize = 0;
-    state->sndbuffree = state->sndbufsize;
 
     return (0);
 }
@@ -287,11 +277,12 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
     int     except;
     int     rec_type;
     int     prev_type = 0;
+    int     sndbuffree;
     int     mail_from_rejected;
     int     recv_dot;
 
     /*
-     * Macros for readability. XXX Isn't LMTP supposed to be case
+     * Macros for readability. XXX Aren't LMTP addresses supposed to be case
      * insensitive?
      */
 #define REWRITE_ADDRESS(addr) do { \
@@ -336,6 +327,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
     recv_state = send_state = init_state;
     next_rcpt = send_rcpt = recv_rcpt = recv_dot = 0;
     mail_from_rejected = 0;
+    sndbuffree = state->sndbufsize;
 
     while (recv_state != LMTP_STATE_LAST) {
 
@@ -389,7 +381,8 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
             */
        case LMTP_STATE_DOT:
            vstring_strcpy(next_command, ".");
-           next_state = LMTP_STATE_LAST;
+           next_state = var_lmtp_cache_conn ?
+               LMTP_STATE_LAST : LMTP_STATE_QUIT;
            break;
 
            /*
@@ -400,9 +393,10 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
            msg_panic("%s: sender abort state", myname);
 
            /*
-            * Build the RSET command. XXX This command does not belong here
-            * because it will be sent in non-pipelining mode. But having it
-            * here means that we can reuse existing code for error handling.
+            * Build the RSET command.  This command does not really belong
+            * here because it is always sent without pipelining, but having
+            * it here means that we can reuse a lot of error handling code
+            * that already exists.
             */
        case LMTP_STATE_RSET:
            vstring_strcpy(next_command, "RSET");
@@ -410,9 +404,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
            break;
 
            /*
-            * Build the QUIT command. XXX This command does not belong here
-            * because it will be sent in non-pipelining mode. But having it
-            * here means that we can reuse existing code for error handling.
+            * Build the QUIT command.
             */
        case LMTP_STATE_QUIT:
            vstring_strcpy(next_command, "QUIT");
@@ -433,8 +425,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
         * automatically flush buffered output when reading new data.
         */
        if (SENDER_IN_WAIT_STATE
-           || (SENDER_IS_AHEAD
-               && VSTRING_LEN(next_command) + 2 > state->sndbuffree)) {
+       || (SENDER_IS_AHEAD && VSTRING_LEN(next_command) + 2 > sndbuffree)) {
            while (SENDER_IS_AHEAD) {
 
                /*
@@ -469,7 +460,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                case LMTP_STATE_MAIL:
                    if (resp->code / 100 != 2) {
                        lmtp_mesg_fail(state, resp->code,
-                                      "%s said: %s", session->host,
+                                      "%s said: %s", session->namaddr,
                                       translit(resp->str, "\n", " "));
                        mail_from_rejected = 1;
                    }
@@ -493,7 +484,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                            survivors[nrcpt++] = recv_rcpt;
                        } else {
                            lmtp_rcpt_fail(state, resp->code, rcpt,
-                                          "%s said: %s", session->host,
+                                          "%s said: %s", session->namaddr,
                                           translit(resp->str, "\n", " "));
                            rcpt->offset = 0;   /* in case deferred */
                        }
@@ -511,7 +502,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                    if (resp->code / 100 != 3) {
                        if (nrcpt > 0)
                            lmtp_mesg_fail(state, resp->code,
-                                          "%s said: %s", session->host,
+                                          "%s said: %s", session->namaddr,
                                           translit(resp->str, "\n", " "));
                        nrcpt = -1;
                    }
@@ -533,14 +524,14 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                        if (resp->code / 100 == 2) {
                            if (rcpt->offset) {
                                sent(request->queue_id, rcpt->address,
-                                    session->host, request->arrival_time,
+                                    session->namaddr, request->arrival_time,
                                     "%s", resp->str);
                                deliver_completed(state->src, rcpt->offset);
                                rcpt->offset = 0;
                            }
                        } else {
                            lmtp_rcpt_fail(state, resp->code, rcpt,
-                                          "%s said: %s", session->host,
+                                          "%s said: %s", session->namaddr,
                                           translit(resp->str, "\n", " "));
                            rcpt->offset = 0;   /* in case deferred */
                        }
@@ -554,7 +545,8 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                    if (++recv_dot >= nrcpt) {
                        if (msg_verbose)
                            msg_info("%s: finished . command", myname);
-                       recv_state = LMTP_STATE_LAST;
+                       recv_state = var_lmtp_cache_conn ?
+                           LMTP_STATE_LAST : LMTP_STATE_QUIT;
                    }
                    break;
 
@@ -562,7 +554,8 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                     * Ignore the RSET response.
                     */
                case LMTP_STATE_ABORT:
-                   recv_state = LMTP_STATE_LAST;
+                   recv_state = var_lmtp_cache_conn ?
+                       LMTP_STATE_LAST : LMTP_STATE_QUIT;
                    break;
 
                    /*
@@ -585,7 +578,7 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
             * At this point, the sender and receiver are fully synchronized,
             * so that the entire TCP send buffer becomes available again.
             */
-           state->sndbuffree = state->sndbufsize;
+           sndbuffree = state->sndbufsize;
 
            /*
             * We know the server response to every command that was sent.
@@ -600,7 +593,8 @@ static int lmtp_loop(LMTP_STATE *state, int init_state)
                send_state = recv_state = LMTP_STATE_ABORT;
                send_rcpt = recv_rcpt = 0;
                vstring_strcpy(next_command, "RSET");
-               next_state = LMTP_STATE_LAST;
+               next_state = var_lmtp_cache_conn ?
+                   LMTP_STATE_LAST : LMTP_STATE_QUIT;
                next_rcpt = 0;
            }
        }
@@ -671,14 +665,14 @@ int     lmtp_xfer(LMTP_STATE *state)
     return (lmtp_loop(state, LMTP_STATE_MAIL));
 }
 
-/* lmtp_rset - reset dialog with peer */
+/* lmtp_rset - send a lone RSET command */
 
 int     lmtp_rset(LMTP_STATE *state)
 {
     return (lmtp_loop(state, LMTP_STATE_RSET));
 }
 
-/* lmtp_quit - say goodbye to peer */
+/* lmtp_quit - send a lone QUIT command */
 
 int     lmtp_quit(LMTP_STATE *state)
 {
index 80471dff0cb705acb5cdaa89c8594404561d716e..3f08533b5c37dbec5828ed1179b3e12da240ab23 100644 (file)
@@ -6,48 +6,54 @@
 /* SYNOPSIS
 /*     #include "lmtp.h"
 /*
-/*     LMTP_SESSION *lmtp_session_alloc(stream, host, addr)
+/*     LMTP_SESSION *lmtp_session_alloc(stream, host, addr, dest, type)
 /*     VSTREAM *stream;
-/*     char    *host;
-/*     char    *addr;
+/*     const char *host;
+/*     const char *addr;
+/*     const char *dest;
+/*     int     type;
 /*
-/*     void    lmtp_session_free(session)
+/*     LMTP_SESSION *lmtp_session_free(session)
 /*     LMTP_SESSION *session;
-/*
-/*     void    lmtp_session_reset(state)
-/*     LMTP_STATE *state;
 /* DESCRIPTION
+/*     This module maintains information about connections, including
+/*     per-peer debugging.
+/*
 /*     lmtp_session_alloc() allocates memory for an LMTP_SESSION structure
 /*     and initializes it with the given stream and host name and address
-/*     information.  The host name and address strings are copied. The code
-/*     assumes that the stream is connected to the "best" alternative.
+/*     information.  The host name and address strings are copied.
+/*     The type argument specifies the transport type. The dest argument
+/*     specifies a string-valued name for the remote endpoint.
+/*     If the peer name or address matches the debug-peer_list configuration
+/*     parameter, the debugging level is incremented by the amount specified
+/*     in the debug_peer_level parameter.
 /*
 /*     lmtp_session_free() destroys an LMTP_SESSION structure and its
-/*     members, making memory available for reuse.
-/*
-/*      lmtp_session_reset() is just a little helper to make sure everything
-/*      is set to zero after the session has been freed.  This means I don't
-/*      have to keep repeating the same chunks of code for cached connections.
+/*     members, making memory available for reuse. The result value is
+/*     convenient null pointer. The debugging level is restored to the
+/*     value prior to the lmtp_session_alloc() call.
 /* LICENSE
 /* .ad
 /* .fi
 /*     The Secure Mailer license must be distributed with this software.
+/* SEE ALSO
+/*     debug_peer(3), increase logging for selected peers
 /* AUTHOR(S)
 /*     Wietse Venema
 /*     IBM T.J. Watson Research
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
 /*
-/*      Alterations for LMTP by:
-/*      Philip A. Prindeville
-/*      Mirapoint, Inc.
-/*      USA.
+/*     Alterations for LMTP by:
+/*     Philip A. Prindeville
+/*     Mirapoint, Inc.
+/*     USA.
 /*
-/*      Additional work on LMTP by:
-/*      Amos Gouaux
-/*      University of Texas at Dallas
-/*      P.O. Box 830688, MC34
-/*      Richardson, TX 75083, USA
+/*     Additional work on LMTP by:
+/*     Amos Gouaux
+/*     University of Texas at Dallas
+/*     P.O. Box 830688, MC34
+/*     Richardson, TX 75083, USA
 /*--*/
 
 /* System library. */
 
 #include <mymalloc.h>
 #include <vstream.h>
+#include <stringops.h>
+
+/* Global library. */
+
+#include <debug_peer.h>
 
 /* Application-specific. */
 
@@ -65,7 +76,8 @@
 
 /* lmtp_session_alloc - allocate and initialize LMTP_SESSION structure */
 
-LMTP_SESSION *lmtp_session_alloc(VSTREAM *stream, char *host, char *addr)
+LMTP_SESSION *lmtp_session_alloc(VSTREAM *stream, const char *host,
+                              const char *addr, const char *dest)
 {
     LMTP_SESSION *session;
 
@@ -73,33 +85,22 @@ LMTP_SESSION *lmtp_session_alloc(VSTREAM *stream, char *host, char *addr)
     session->stream = stream;
     session->host = mystrdup(host);
     session->addr = mystrdup(addr);
-    session->destination = 0;
+    session->namaddr = concatenate(host, "[", addr, "]", (char *) 0);
+    session->dest = mystrdup(dest);
+    debug_peer_check(host, addr);
     return (session);
 }
 
 /* lmtp_session_free - destroy LMTP_SESSION structure and contents */
 
-void    lmtp_session_free(LMTP_SESSION *session)
+LMTP_SESSION *lmtp_session_free(LMTP_SESSION *session)
 {
-    if (vstream_ispipe(session->stream))
-       vstream_pclose(session->stream);
-    else
-       vstream_fclose(session->stream);
+    debug_peer_restore();
+    vstream_fclose(session->stream);
     myfree(session->host);
     myfree(session->addr);
-    if (session->destination)
-       myfree(session->destination);
+    myfree(session->namaddr);
+    myfree(session->dest);
     myfree((char *) session);
+    return (0);
 }
-
-/* lmtp_session_reset - clean things up so a new session can be created */
-
-void    lmtp_session_reset(LMTP_STATE *state)
-{
-    if (state->session) {
-        lmtp_session_free(state->session);
-        state->session = 0;
-    }
-    state->reuse = 0;
-}
-
index c52bfb94ff0a0e0cb5314d1990131160a75b31ba..c0ae6a45b70860a0cf5493c5782bbc07b4c225fa 100644 (file)
 /*     P.O. Box 704
 /*     Yorktown Heights, NY 10598, USA
 /*
-/*      Alterations for LMTP by:
-/*      Philip A. Prindeville
-/*      Mirapoint, Inc.
-/*      USA.
+/*     Alterations for LMTP by:
+/*     Philip A. Prindeville
+/*     Mirapoint, Inc.
+/*     USA.
 /*
-/*      Additional work on LMTP by:
-/*      Amos Gouaux
-/*      University of Texas at Dallas
-/*      P.O. Box 830688, MC34
-/*      Richardson, TX 75083, USA
+/*     Additional work on LMTP by:
+/*     Amos Gouaux
+/*     University of Texas at Dallas
+/*     P.O. Box 830688, MC34
+/*     Richardson, TX 75083, USA
 /*--*/
 
 /* System library. */
@@ -78,6 +78,7 @@ LMTP_STATE *lmtp_state_alloc(void)
     state->sndbufsize = 0;
     state->sndbuffree = 0;
     state->reuse = 0;
+    state->fixed_dest = 0;
     return (state);
 }
 
index 9a13b69d1801ef657d3038d5c0bfd4f581e63167..713e4d89b698ad88fcc24f3c0fd98dc0abf69512 100644 (file)
@@ -179,7 +179,7 @@ int     lmtp_site_fail(LMTP_STATE *state, int code, char *format,...)
            continue;
        status = (soft_error ? defer_append : bounce_append)
            (KEEP, request->queue_id, rcpt->address,
-            session ? session->host : "none",
+            session ? session->namaddr : "none",
             request->arrival_time, "%s", vstring_str(why));
        if (status == 0) {
            deliver_completed(state->src, rcpt->offset);
@@ -226,7 +226,7 @@ int     lmtp_mesg_fail(LMTP_STATE *state, int code, char *format,...)
            continue;
        status = (LMTP_SOFT(code) ? defer_append : bounce_append)
            (KEEP, request->queue_id, rcpt->address,
-            session->host, request->arrival_time,
+            session->namaddr, request->arrival_time,
             "%s", vstring_str(why));
        if (status == 0) {
            deliver_completed(state->src, rcpt->offset);
@@ -259,7 +259,7 @@ void    lmtp_rcpt_fail(LMTP_STATE *state, int code, RECIPIENT *rcpt,
      */
     va_start(ap, format);
     status = (LMTP_SOFT(code) ? vdefer_append : vbounce_append)
-       (KEEP, request->queue_id, rcpt->address, session->host,
+       (KEEP, request->queue_id, rcpt->address, session->namaddr,
         request->arrival_time, format, ap);
     va_end(ap);
     if (status == 0) {
@@ -288,11 +288,11 @@ int     lmtp_stream_except(LMTP_STATE *state, int code, char *description)
        msg_panic("lmtp_stream_except: unknown exception %d", code);
     case SMTP_ERR_EOF:
        vstring_sprintf(why, "lost connection with %s while %s",
-                       session->host, description);
+                       session->namaddr, description);
        break;
     case SMTP_ERR_TIME:
        vstring_sprintf(why, "conversation with %s timed out while %s",
-                       session->host, description);
+                       session->namaddr, description);
        break;
     }
 
@@ -305,7 +305,7 @@ int     lmtp_stream_except(LMTP_STATE *state, int code, char *description)
        if (rcpt->offset == 0)
            continue;
        state->status |= defer_append(KEEP, request->queue_id,
-                                     rcpt->address, session->host,
+                                     rcpt->address, session->namaddr,
                                      request->arrival_time,
                                      "%s", vstring_str(why));
     }
diff --git a/postfix/lmtp/man-patch b/postfix/lmtp/man-patch
deleted file mode 100644 (file)
index 551002f..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-*** ../../orig/man/Makefile.in Thu Jun 24 18:39:22 1999
---- man/Makefile.in    Fri Feb 25 16:35:53 2000
-***************
-*** 2,8 ****
-  
-  DAEMONS      = man8/bounce.8 man8/defer.8 man8/cleanup.8 man8/error.8 man8/local.8 \
-       man8/master.8 man8/pickup.8 man8/pipe.8 man8/qmgr.8 man8/showq.8 \
-!      man8/smtp.8 man8/smtpd.8 man8/trivial-rewrite.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/sendmail.1 man1/mailq.1 man1/newaliases.1 \
---- 2,8 ----
-  
-  DAEMONS      = man8/bounce.8 man8/defer.8 man8/cleanup.8 man8/error.8 man8/local.8 \
-       man8/master.8 man8/pickup.8 man8/pipe.8 man8/qmgr.8 man8/showq.8 \
-!      man8/smtp.8 man8/smtpd.8 man8/trivial-rewrite.8 man8/lmtp.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/sendmail.1 man1/mailq.1 man1/newaliases.1 \
-***************
-*** 24,99 ****
-       rm -f $(DAEMONS) $(COMMANDS) $(CONFIG)
-  
-  man8/bounce.8: ../bounce/bounce.c
-!      srctoman $? >$@
-  
-  man8/defer.8:
-       echo .so man8/bounce.8 >$@
-  
-  man8/cleanup.8: ../cleanup/cleanup.c
-!      srctoman $? >$@
-  
-  man8/error.8: ../error/error.c
-!      srctoman $? >$@
-  
-  man8/local.8: ../local/local.c
-!      srctoman $? >$@
-  
-  man8/master.8: ../master/master.c
-!      srctoman $? >$@
-  
-  man8/pickup.8: ../pickup/pickup.c
-!      srctoman $? >$@
-  
-  man8/pipe.8: ../pipe/pipe.c
-!      srctoman $? >$@
-  
-  man8/qmgr.8: ../qmgr/qmgr.c
-!      srctoman $? >$@
-  
-  man8/showq.8: ../showq/showq.c
-!      srctoman $? >$@
-  
-  man8/smtp.8: ../smtp/smtp.c
-!      srctoman $? >$@
-  
-  man8/smtpd.8: ../smtpd/smtpd.c
-!      srctoman $? >$@
-  
-  man8/trivial-rewrite.8: ../trivial-rewrite/trivial-rewrite.c
-!      srctoman $? >$@
-  
-  man1/postalias.1: ../postalias/postalias.c
-!      srctoman $? >$@
-  
-  man1/postcat.1: ../postcat/postcat.c
-!      srctoman $? >$@
-  
-  man1/postconf.1: ../postconf/postconf.c
-!      srctoman $? >$@
-  
-  man1/postdrop.1: ../postdrop/postdrop.c
-!      srctoman $? >$@
-  
-  man1/postfix.1: ../postfix/postfix.c
-!      srctoman $? >$@
-  
-  man1/postkick.1: ../postkick/postkick.c
-!      srctoman $? >$@
-  
-  man1/postlock.1: ../postlock/postlock.c
-!      srctoman $? >$@
-  
-  man1/postlog.1: ../postlog/postlog.c
-!      srctoman $? >$@
-  
-  man1/postmap.1: ../postmap/postmap.c
-!      srctoman $? >$@
-  
-  man1/postsuper.1: ../postsuper/postsuper.c
-!      srctoman $? >$@
-  
-  man1/sendmail.1: ../sendmail/sendmail.c
-!      srctoman $? >$@
-  
-  man1/mailq.1:
-       echo .so man1/sendmail.1 >$@
---- 24,102 ----
-       rm -f $(DAEMONS) $(COMMANDS) $(CONFIG)
-  
-  man8/bounce.8: ../bounce/bounce.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/defer.8:
-       echo .so man8/bounce.8 >$@
-  
-  man8/cleanup.8: ../cleanup/cleanup.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/error.8: ../error/error.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/local.8: ../local/local.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/master.8: ../master/master.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/pickup.8: ../pickup/pickup.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/pipe.8: ../pipe/pipe.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/qmgr.8: ../qmgr/qmgr.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/showq.8: ../showq/showq.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/smtp.8: ../smtp/smtp.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/smtpd.8: ../smtpd/smtpd.c
-!      ../mantools/srctoman $? >$@
-  
-  man8/trivial-rewrite.8: ../trivial-rewrite/trivial-rewrite.c
-!      ../mantools/srctoman $? >$@
-  
-+ man8/lmtp.8: ../lmtp/lmtp.c
-+      ../mantools/srctoman $? >$@
-+ 
-  man1/postalias.1: ../postalias/postalias.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postcat.1: ../postcat/postcat.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postconf.1: ../postconf/postconf.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postdrop.1: ../postdrop/postdrop.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postfix.1: ../postfix/postfix.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postkick.1: ../postkick/postkick.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postlock.1: ../postlock/postlock.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postlog.1: ../postlog/postlog.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postmap.1: ../postmap/postmap.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/postsuper.1: ../postsuper/postsuper.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/sendmail.1: ../sendmail/sendmail.c
-!      ../mantools/srctoman $? >$@
-  
-  man1/mailq.1:
-       echo .so man1/sendmail.1 >$@
-***************
-*** 102,120 ****
-       echo .so man1/sendmail.1 >$@
-  
-  man5/access.5: ../conf/access
-!      srctoman - $? >$@
-  
-  man5/aliases.5: ../conf/aliases
-!      srctoman - $? >$@
-  
-  man5/canonical.5: ../conf/canonical
-!      srctoman - $? >$@
-  
-  man5/relocated.5: ../conf/relocated
-!      srctoman - $? >$@
-  
-  man5/transport.5: ../conf/transport
-!      srctoman - $? >$@
-  
-  man5/virtual.5: ../conf/virtual
-!      srctoman - $? >$@
---- 105,123 ----
-       echo .so man1/sendmail.1 >$@
-  
-  man5/access.5: ../conf/access
-!      ../mantools/srctoman - $? >$@
-  
-  man5/aliases.5: ../conf/aliases
-!      ../mantools/srctoman - $? >$@
-  
-  man5/canonical.5: ../conf/canonical
-!      ../mantools/srctoman - $? >$@
-  
-  man5/relocated.5: ../conf/relocated
-!      ../mantools/srctoman - $? >$@
-  
-  man5/transport.5: ../conf/transport
-!      ../mantools/srctoman - $? >$@
-  
-  man5/virtual.5: ../conf/virtual
-!      ../mantools/srctoman - $? >$@
index 008206c8b31556a3e3ae6625cd4353256f8554ea..23514312501fd35d391598344592fae64b975175 100644 (file)
@@ -3,8 +3,8 @@ SHELL   = /bin/sh
 # For now, just hard-coded rules for daemons, commands, config files.
 
 DAEMONS        = man8/bounce.8 man8/defer.8 man8/cleanup.8 man8/error.8 man8/local.8 \
-       man8/master.8 man8/pickup.8 man8/pipe.8 man8/qmgr.8 man8/showq.8 \
-       man8/smtp.8 man8/smtpd.8 man8/trivial-rewrite.8
+       man8/lmtp.8 man8/master.8 man8/pickup.8 man8/pipe.8 man8/qmgr.8 \
+       man8/showq.8 man8/smtp.8 man8/smtpd.8 man8/trivial-rewrite.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/sendmail.1 man1/mailq.1 man1/newaliases.1 \
@@ -26,76 +26,79 @@ clobber:
        rm -f $(DAEMONS) $(COMMANDS) $(CONFIG)
 
 man8/bounce.8: ../bounce/bounce.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/defer.8:
        echo .so man8/bounce.8 >$@
 
 man8/cleanup.8: ../cleanup/cleanup.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/error.8: ../error/error.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/local.8: ../local/local.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
+
+man8/lmtp.8: ../lmtp/lmtp.c
+       ../mantools/srctoman $? >$@
 
 man8/master.8: ../master/master.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/pickup.8: ../pickup/pickup.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/pipe.8: ../pipe/pipe.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/qmgr.8: ../qmgr/qmgr.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/showq.8: ../showq/showq.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/smtp.8: ../smtp/smtp.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/smtpd.8: ../smtpd/smtpd.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man8/trivial-rewrite.8: ../trivial-rewrite/trivial-rewrite.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postalias.1: ../postalias/postalias.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postcat.1: ../postcat/postcat.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postconf.1: ../postconf/postconf.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postdrop.1: ../postdrop/postdrop.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postfix.1: ../postfix/postfix.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postkick.1: ../postkick/postkick.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postlock.1: ../postlock/postlock.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postlog.1: ../postlog/postlog.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postmap.1: ../postmap/postmap.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/postsuper.1: ../postsuper/postsuper.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/sendmail.1: ../sendmail/sendmail.c
-       srctoman $? >$@
+       ../mantools/srctoman $? >$@
 
 man1/mailq.1:
        echo .so man1/sendmail.1 >$@
@@ -104,25 +107,25 @@ man1/newaliases.1:
        echo .so man1/sendmail.1 >$@
 
 man5/access.5: ../proto/access
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/aliases.5: ../proto/aliases
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/canonical.5: ../proto/canonical
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/pcre_table.5: ../proto/pcre_table
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/regexp_table.5: ../proto/regexp_table
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/relocated.5: ../proto/relocated
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/transport.5: ../proto/transport
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
 
 man5/virtual.5: ../proto/virtual
-       srctoman - $? >$@
+       ../mantools/srctoman - $? >$@
diff --git a/postfix/man/man8/lmtp.8 b/postfix/man/man8/lmtp.8
new file mode 100644 (file)
index 0000000..294234e
--- /dev/null
@@ -0,0 +1,214 @@
+.TH LMTP 8 
+.ad
+.fi
+.SH NAME
+lmtp
+\-
+Postfix local delivery via LMTP
+.SH SYNOPSIS
+.na
+.nf
+\fBlmtp\fR [generic Postfix daemon options] [server attributes...]
+.SH DESCRIPTION
+.ad
+.fi
+The LMTP client processes message delivery requests from
+the queue manager. Each request specifies a queue file, a sender
+address, a domain or host to deliver to, and recipient information.
+This program expects to be run from the \fBmaster\fR(8) process
+manager.
+
+The LMTP client updates the queue file and marks recipients
+as finished, or it informs the queue manager that delivery should
+be tried again at a later time. Delivery problem reports are sent
+to the \fBbounce\fR(8) or \fBdefer\fR(8) daemon as appropriate.
+
+If no server is given on the command line, the LMTP client connects
+to the destination specified in the message delivery request and to
+the TCP port defined as \fBlmtp\fR in \fBservices\fR(4).  If no such
+service is found, the \fBlmtp_tcp_port\fR configuration parameter
+(default value of 24) will be used. The LMTP client does not perform
+MX (mail exchanger) lookups since those are defined only for SMTP.
+.SH SERVER ATTRIBUTE SYNTAX
+.na
+.nf
+.ad
+.fi
+The server attributes are given in the \fBmaster.cf\fR file at
+the end of a service definition.  The syntax is as follows:
+.IP "\fBserver=\fR\fIhost\fR"
+.IP "\fBserver=\fR\fIhost\fR\fB:\fR\fIport\fR"
+.IP "\fBserver=[\fR\fIipaddr\fR\fB]\fR"
+.IP "\fBserver=[\fR\fIipaddr\fR\fB]:\fR\fIport\fR"
+Connect to the specified host or IP address and TCP port (default: the
+\fBlmtp\fR port as specified in the \fBservices\fR database).
+.PP
+.SH SECURITY
+.na
+.nf
+.ad
+.fi
+The LMTP client is moderately security-sensitive. It talks to LMTP
+servers and to DNS servers on the network. The LMTP client can be
+run chrooted at fixed low privilege.
+.SH STANDARDS
+.na
+.nf
+RFC 821 (SMTP protocol)
+RFC 1651 (SMTP service extensions)
+RFC 1870 (Message Size Declaration)
+RFC 2033 (LMTP protocol)
+RFC 2197 (Pipelining)
+.SH DIAGNOSTICS
+.ad
+.fi
+Problems and transactions are logged to \fBsyslogd\fR(8).
+Corrupted message files are marked so that the queue manager can
+move them to the \fBcorrupt\fR queue for further inspection.
+
+Depending on the setting of the \fBnotify_classes\fR parameter,
+the postmaster is notified of bounces, protocol problems, and of
+other trouble.
+.SH BUGS
+.ad
+.fi
+.SH CONFIGURATION PARAMETERS
+.na
+.nf
+.ad
+.fi
+The following \fBmain.cf\fR parameters are especially relevant to
+this program. See the Postfix \fBmain.cf\fR file for syntax details
+and for default values. Use the \fBpostfix reload\fR command after
+a configuration change.
+.SH Miscellaneous
+.ad
+.fi
+.IP \fBdebug_peer_level\fR
+Verbose logging level increment for hosts that match a
+pattern in the \fBdebug_peer_list\fR parameter.
+.IP \fBdebug_peer_list\fR
+List of domain or network patterns. When a remote host matches
+a pattern, increase the verbose logging level by the amount
+specified in the \fBdebug_peer_level\fR parameter.
+.IP \fBerror_notice_recipient\fR
+Recipient of protocol/policy/resource/software error notices.
+.IP \fBnotify_classes\fR
+When this parameter includes the \fBprotocol\fR class, send mail to the
+postmaster with transcripts of LMTP sessions with protocol errors.
+.IP \fBlmtp_skip_quit_response\fR
+Do not wait for the server response after sending QUIT.
+.IP \fBlmtp_tcp_port\fR
+The TCP port to be used when connecting to a LMTP server.  Used as
+backup if the \fBlmtp\fR service is not found in \fBservices\fR(4).
+.SH "Resource controls"
+.ad
+.fi
+.IP \fBlmtp_cache_connection\fR
+Should we cache the connection to the LMTP server? The effectiveness
+of cached connections will be determined by the number of LMTP servers
+in use, and the concurrency limit specified for the LMTP client.
+Cached connections are closed under any of the following conditions:
+.RS
+.IP \(bu
+The LMTP client idle time limit is reached. This limit is specified
+with the Postfix \fBmax_idle\fR configuration parameter.
+.IP \(bu
+A delivery request specifies a different destination than the one
+currently cached.
+.IP \(bu
+The per-process limit on the number of delivery requests is reached.
+This limit is specified with the Postfix \fBmax_use\fR configuration
+parameter.
+.IP \(bu
+Upon the onset of another delivery request, the LMTP server associated
+with the current session does not respond to the \fBRSET\fR command.
+.RE
+.IP \fItransport_\fBdestination_concurrency_limit\fR
+Limit the number of parallel deliveries to the same destination
+via this mail delivery transport. \fItransport\fR is the name
+of the service as specified in the \fBmaster.cf\fR file.
+The default limit is taken from the
+\fBdefault_destination_concurrency_limit\fR parameter.
+.IP \fItransport_\fBdestination_recipient_limit\fR
+Limit the number of recipients per message delivery via this mail
+delivery transport. \fItransport\fR is the name
+of the service as specified in the \fBmaster.cf\fR file.
+The default limit is taken from the
+\fBdefault_destination_recipient_limit\fR parameter.
+
+This parameter becomes significant if the LMTP client is used
+for local delivery.  Some LMTP servers can optimize delivery of
+the same message to multiple recipients. The default limit for
+local mail delivery is 1.
+
+Setting this parameter to 0 will lead to an unbounded number of
+recipients per delivery.  However, this could be risky since it may
+make the machine vulnerable to running out of resources if messages
+are encountered with an inordinate number of recipients.  Exercise
+care when setting this parameter.
+.SH "Timeout controls"
+.ad
+.fi
+.IP \fBlmtp_connect_timeout\fR
+Timeout in seconds for opening a connection to the LMTP server.
+If no connection can be made within the deadline, the message
+is deferred.
+.IP \fBlmtp_lhlo_timeout\fR
+Timeout in seconds for sending the \fBLHLO\fR command, and for
+receiving the server response.
+.IP \fBlmtp_mail_timeout\fR
+Timeout in seconds for sending the \fBMAIL FROM\fR command, and for
+receiving the server response.
+.IP \fBlmtp_rcpt_timeout\fR
+Timeout in seconds for sending the \fBRCPT TO\fR command, and for
+receiving the server response.
+.IP \fBlmtp_data_init_timeout\fR
+Timeout in seconds for sending the \fBDATA\fR command, and for
+receiving the server response.
+.IP \fBlmtp_data_xfer_timeout\fR
+Timeout in seconds for sending the message content.
+.IP \fBlmtp_data_done_timeout\fR
+Timeout in seconds for sending the "\fB.\fR" command, and for
+receiving the server response. When no response is received, a
+warning is logged that the mail may be delivered multiple times.
+.IP \fBlmtp_rset_timeout\fR
+Timeout in seconds for sending the \fBRSET\fR command, and for
+receiving the server response.
+.IP \fBlmtp_quit_timeout\fR
+Timeout in seconds for sending the \fBQUIT\fR command, and for
+receiving the server response.
+.SH SEE ALSO
+.na
+.nf
+bounce(8) non-delivery status reports
+local(8) local mail delivery
+master(8) process manager
+qmgr(8) queue manager
+services(4) Internet services and aliases
+spawn(8) auxiliary command spawner
+syslogd(8) system logging
+.SH LICENSE
+.na
+.nf
+.ad
+.fi
+The Secure Mailer license must be distributed with this software.
+.SH AUTHOR(S)
+.na
+.nf
+Wietse Venema
+IBM T.J. Watson Research
+P.O. Box 704
+Yorktown Heights, NY 10598, USA
+
+Alterations for LMTP by:
+Philip A. Prindeville
+Mirapoint, Inc.
+USA.
+
+Additional work on LMTP by:
+Amos Gouaux
+University of Texas at Dallas
+P.O. Box 830688, MC34
+Richardson, TX 75083, USA
index c3f53dd80471776659d980342a884471cc762f83..b69e90b5c494708d4fc8f4555ff31c799641caf7 100644 (file)
@@ -113,6 +113,7 @@ Do not wait for the server response after sending QUIT.
 .SH "Authentication controls"
 .IP \fBsmtp_enable_sasl_auth\fR
 Enable per-session authentication as per RFC 2554 (SASL).
+By default, Postfix is built without SASL support.
 .IP \fBsmtp_sasl_password_maps\fR
 Lookup tables with per-host \fIname\fR:\fIpassword\fR entries.
 No entry for a host means no attempt to authenticate.
index fb87793fd4012924af055d8264c888502bc78c3c..7f12ae301a7086d31a6a0813677b5b7e1f5eee85 100644 (file)
@@ -532,6 +532,13 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
        vstring_free(why);
     }
 
+    /*
+     * Set up call-back info.
+     */
+    multi_server_service = service;
+    multi_server_name = service_name;
+    multi_server_argv = argv + optind;
+
     /*
      * Run pre-jail initialization.
      */
@@ -562,7 +569,7 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
                        VSTREAM_CTL_DOUBLE,
                        VSTREAM_CTL_WRITE_FD, STDOUT_FILENO,
                        VSTREAM_CTL_END);
-       service(stream, service_name, argv + optind);
+       service(stream, multi_server_name, multi_server_argv);
        vstream_fflush(stream);
        multi_server_exit();
     }
@@ -573,9 +580,6 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
      * no-one has been talking to us for a configurable amount of time, or
      * when the master process terminated abnormally.
      */
-    multi_server_service = service;
-    multi_server_name = service_name;
-    multi_server_argv = argv + optind;
     if (var_idle_limit > 0)
        event_request_timer(multi_server_timeout, (char *) 0, var_idle_limit);
     for (fd = MASTER_LISTEN_FD; fd < MASTER_LISTEN_FD + socket_count; fd++) {
index 70424a95fd5ab84c6aa894040d468491a8a4188a..fc39204a9cb9bf578470cc5e3f7ecea003dcf8f5 100644 (file)
@@ -504,6 +504,13 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
        vstring_free(why);
     }
 
+    /*
+     * Set up call-back info.
+     */
+    single_server_service = service;
+    single_server_name = service_name;
+    single_server_argv = argv + optind;
+
     /*
      * Run pre-jail initialization.
      */
@@ -534,7 +541,7 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
                        VSTREAM_CTL_DOUBLE,
                        VSTREAM_CTL_WRITE_FD, STDOUT_FILENO,
                        VSTREAM_CTL_END);
-       service(stream, service_name, argv + optind);
+       service(stream, single_server_name, single_server_argv);
        vstream_fflush(stream);
        single_server_exit();
     }
@@ -545,9 +552,6 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
      * no-one has been talking to us for a configurable amount of time, or
      * when the master process terminated abnormally.
      */
-    single_server_service = service;
-    single_server_name = service_name;
-    single_server_argv = argv + optind;
     if (var_idle_limit > 0)
        event_request_timer(single_server_timeout, (char *) 0, var_idle_limit);
     for (fd = MASTER_LISTEN_FD; fd < MASTER_LISTEN_FD + socket_count; fd++) {
index 340977f4c7bb8dbffbe3f832ee87ea790ac1017f..3a1b9d89b0fec819dd0f52a74aacde1d61eb81e7 100644 (file)
@@ -519,6 +519,13 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
        vstring_free(why);
     }
 
+    /*
+     * Set up call-back info.
+     */
+    trigger_server_service = service;
+    trigger_server_name = service_name;
+    trigger_server_argv = argv + optind;
+
     /*
      * Run pre-jail initialization.
      */
@@ -546,7 +553,7 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
     if (stream != 0) {
        if ((len = read(vstream_fileno(stream), buf, sizeof(buf))) <= 0)
            msg_fatal("read: %m");
-       service(buf, len, service_name, argv + optind);
+       service(buf, len, trigger_server_name, trigger_server_argv);
        vstream_fflush(stream);
        trigger_server_exit();
     }
@@ -557,9 +564,6 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
      * no-one has been talking to us for a configurable amount of time, or
      * when the master process terminated abnormally.
      */
-    trigger_server_service = service;
-    trigger_server_name = service_name;
-    trigger_server_argv = argv + optind;
     if (var_idle_limit > 0)
        event_request_timer(trigger_server_timeout, (char *) 0, var_idle_limit);
     for (fd = MASTER_LISTEN_FD; fd < MASTER_LISTEN_FD + socket_count; fd++) {
index d35b6a382ff269c80da8988b88e6891c27088a82..f5afaf01a1e1d2537e9d04fa6876aee1e7c4b4ca 100644 (file)
@@ -89,7 +89,6 @@ smtp.o: ../include/mail_error.h
 smtp.o: ../include/deliver_pass.h
 smtp.o: ../include/mail_proto.h
 smtp.o: ../include/iostuff.h
-smtp.o: ../include/smtp_stream.h
 smtp.o: ../include/mail_server.h
 smtp.o: smtp.h
 smtp.o: smtp_sasl.h
index 95d9d9b11670609f16be270e907d682d7504eb32..cd1009b2533cda3809bec056fb858adfd4947477 100644 (file)
@@ -149,9 +149,9 @@ void    smtpd_chat_reply(SMTPD_STATE *state, char *format,...)
      * errors within a session.
      */
     if (state->error_count > var_smtpd_soft_erlim)
-       sleep(state->error_count);
+       sleep(state->error_count), vstream_fflush(state->client);
     else if (STR(state->buffer)[0] == '4' || STR(state->buffer)[0] == '5')
-       sleep(var_smtpd_err_sleep);
+       sleep(var_smtpd_err_sleep), vstream_fflush(state->client);
 
     smtp_fputs(STR(state->buffer), LEN(state->buffer), state->client);
 }
index d535d6df0b20d64438faea114fd48f8ab1966e17..536edc19d51ebcee5647470ffb320092fef57a70 100644 (file)
@@ -60,6 +60,7 @@ spawn.o: ../include/argv.h
 spawn.o: ../include/dict.h
 spawn.o: ../include/vstream.h
 spawn.o: ../include/vbuf.h
+spawn.o: ../include/binattr.h
 spawn.o: ../include/mymalloc.h
 spawn.o: ../include/spawn_command.h
 spawn.o: ../include/split_at.h