the support by Charles Palmer under whose leadership I began this
project, and who had the privilege to name the software, twice.
+Postcards
+=========
+
If you wish to express your appreciation for the Postfix software,
you are welcome to send a postcard to:
Wietse Venema
- IBM T.J Watson Research Center
- P.O. Box 704,
- Yorktown Heights, NY 10598
+ Google
+ 111 8th Avenue, 4th floor
+ New York, NY 10011
USA
Roadmap of the Postfix source distribution
20170207
- Cleanup: rephrased the precondition paranoia. File:
- global/mail_conf.c.
+ Cleanup: rephrased paranoia precondition. File: global/mail_conf.c.
20170211
- Cleanup: rephrased the precondition for paranoia. File:
- util/unsafe.c.
+ Cleanup: rephrased paranoia precondition. File: util/unsafe.c.
+
+20170218
+
+ Cleanup: typofixes from klemens. The only change in compiled
+ code is in one identical mysql error message that also
+ appears in the pgsql client. Files: about 50.
# Usage:
# make makefiles [name=value]...
#
-# See makedefs for a descripton of available options.
+# See makedefs for a description of available options.
# Examples:
#
# make makefiles
# Usage:
# make makefiles [name=value]...
#
-# See makedefs for a descripton of available options.
+# See makedefs for a description of available options.
# Examples:
#
# make makefiles
ILLEGAL IN SOME PARTS OF THE WORLD. SO, WHEN YOU IMPORT THIS PACKAGE
TO YOUR COUNTRY, RE-DISTRIBUTE IT FROM THERE OR EVEN JUST EMAIL
TECHNICAL SUGGESTIONS OR EVEN SOURCE PATCHES TO THE AUTHOR OR
- OTHER PEOPLE YOU ARE STRONGLY ADVICED TO PAY CLOSE ATTENTION TO ANY
+ OTHER PEOPLE YOU ARE STRONGLY ADVISED TO PAY CLOSE ATTENTION TO ANY
EXPORT/IMPORT AND/OR USE LAWS WHICH APPLY TO YOU. THE AUTHOR OF
PFIXTLS IS NOT LIABLE FOR ANY VIOLATIONS YOU MAKE HERE. SO BE
CAREFULLY YOURSELF, IT IS YOUR RESPONSIBILITY.
with a badness indicator and then filter down-stream.
Make null local-part handling configurable: either expand
- into mailer-daemon (current bahavior) or disallow (strict
+ into mailer-daemon (current behavior) or disallow (strict
behavior, currently implemented only in the SMTP server).
Add M flag (enable multi-recipient delivery) to pipe daemon.
# >$config_directory/$process_name.$process_id.log & sleep 5
#
# Another possibility is to run gdb under a detached screen session.
-# To attach to the screen sesssion, su root and run "screen -r
+# To attach to the screen session, su root and run "screen -r
# <id_string>" where <id_string> uniquely matches one of the detached
# sessions (from "screen -list").
#
done
set_fqdn "${hostname}"
- # Here positional arguments are keyfiles for which we ouput "3 1 1"
+ # Here positional arguments are keyfiles for which we output "3 1 1"
# TLSA RRs, as many keyfiles as the user wants. By default the live
# RSA and/or ECDSA keys.
shift `expr $OPTIND - 1`
# @(#) ccformat.sh 1.3 11/5/89 14:39:29
-# how to supress newlines in echo
+# how to suppress newlines in echo
case `echo -n` in
"") n=-n; c=;;
# These are often carefully laid out by the programmer.
# .sp
# Comments that appear in-between statements are lined up with
-# the surrounding program text, and are adjusted to accomodate
+# the surrounding program text, and are adjusted to accommodate
# as many words on a line as possible.
# However, a blank line in the middle of a comment is respected.
# .sp
done
}
-# How to supress newlines in echo.
+# How to suppress newlines in echo.
case `echo -n` in
"") n=-n; c=;;
* Parse pseudo-header labels and values.
*
* XXX EAI: allow UTF8 in template headers when responding to SMTPUTF8
- * message. Sending SMTPUTF8 in reponse to non-SMTPUTF8 mail would make
+ * message. Sending SMTPUTF8 in response to non-SMTPUTF8 mail would make
* no sense.
*/
#define GETLINE(line, buf) \
cleanup_region_return(state, state->body_regions);
/*
- * Select the first region. XXX This will usally be the original body
+ * Select the first region. XXX This will usually be the original body
* segment, but we must not count on that. Region assignments may change
* when header editing also uses queue file regions. XXX We don't really
* know if the first region will be large enough to hold the first body
cleanup_repl_body, (void *) state);
}
-/* cleanup_milter_apply - apply Milter reponse, non-zero if rejecting */
+/* cleanup_milter_apply - apply Milter response, non-zero if rejecting */
static const char *cleanup_milter_apply(CLEANUP_STATE *state, const char *event,
const char *resp)
/* queue file is complete.
/*
/* cleanup_region_open() opens an existing region or creates
-/* a new region that can accomodate at least the specified
+/* a new region that can accommodate at least the specified
/* amount of space. A new region is an open-ended region at
/* the end of the file; it must be closed (see next) before
/* unrelated data can be appended to the same file.
* with the call-back routine, but there is too much code that would have
* to be changed.
*
- * XXX Should we be concerned that an overly agressive optimizer will
+ * XXX Should we be concerned that an overly aggressive optimizer will
* eliminate this function and replace calls to clnt_stream_ttl_event()
* by direct calls to clnt_stream_event()? It should not, because there
* exists code that takes the address of both functions.
/* List of domains the queries should be restricted to. If
/* specified, only FQDN addresses whose domain parts matching this
/* list will be queried against the SQL database. Lookups for
-/* partial addresses are also supressed. This can significantly
+/* partial addresses are also suppressed. This can significantly
/* reduce the query load on the server.
/* .IP query
/* Query template, before the query is actually issued, variable
#endif
dict_mysql->pldb = plmysql_init(dict_mysql->hosts);
if (dict_mysql->pldb == NULL)
- msg_fatal("couldn't intialize pldb!\n");
+ msg_fatal("couldn't initialize pldb!\n");
dict_mysql->dict.owner = cfg_get_owner(dict_mysql->parser);
return (DICT_DEBUG (&dict_mysql->dict));
}
/*
- * plmysql_init - initalize a MYSQL database.
+ * plmysql_init - initialize a MYSQL database.
* Return NULL on failure, or a PLMYSQL * on success.
*/
static PLMYSQL *plmysql_init(ARGV *hosts)
/* List of domains the queries should be restricted to. If
/* specified, only FQDN addresses whose domain parts matching this
/* list will be queried against the SQL database. Lookups for
-/* partial addresses are also supressed. This can significantly
+/* partial addresses are also suppressed. This can significantly
/* reduce the query load on the server.
/* .IP result_format
/* The format used to expand results from queries. Substitutions
dict_pgsql->active_host = 0;
dict_pgsql->pldb = plpgsql_init(dict_pgsql->hosts);
if (dict_pgsql->pldb == NULL)
- msg_fatal("couldn't intialize pldb!\n");
+ msg_fatal("couldn't initialize pldb!\n");
dict_pgsql->dict.owner = cfg_get_owner(dict_pgsql->parser);
return (DICT_DEBUG (&dict_pgsql->dict));
}
-/* plpgsql_init - initalize a PGSQL database */
+/* plpgsql_init - initialize a PGSQL database */
static PLPGSQL *plpgsql_init(ARGV *hosts)
{
extern bool var_strict_rfc821_env;
/*
- * Standards violation: send "250 AUTH=list" in order to accomodate clients
+ * Standards violation: send "250 AUTH=list" in order to accommodate clients
* that implement an old version of the protocol.
*/
#define VAR_BROKEN_AUTH_CLNTS "broken_sasl_auth_clients"
extern int var_inet_windowsize;
/*
- * Plug-in multi-instance support. Only the first two paramaters are used by
+ * Plug-in multi-instance support. Only the first two parameters are used by
* Postfix itself; the other ones are reserved for the instance manager.
*/
#define VAR_MULTI_CONF_DIRS "multi_instance_directories"
* - the inode number (base 51 encoded so that it contains no 'z').
*/
#define MQID_LG_SEC_BASE 52 /* seconds safe alphabet base */
-#define MQID_LG_SEC_PAD 6 /* seconds minumum field width */
+#define MQID_LG_SEC_PAD 6 /* seconds minimum field width */
#define MQID_LG_USEC_BASE 52 /* microseconds safe alphabet base */
#define MQID_LG_USEC_PAD 4 /* microseconds exact field width */
#define MQID_LG_TIME_PAD (MQID_LG_SEC_PAD + MQID_LG_USEC_PAD)
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20170212"
+#define MAIL_RELEASE_DATE "20170218"
#define MAIL_VERSION_NUMBER "3.3"
#ifdef SNAPSHOT
/*
* Find out if the next body starts with its own message headers. In
- * agressive mode, examine headers of partial and external-body
+ * aggressive mode, examine headers of partial and external-body
* messages. Otherwise, treat such headers as part of the "body". Set
* the proper encoding information for the multipart prolog.
*
/*
* Body text. Look for message boundaries, and recover from missing
- * boundary strings. Missing boundaries can happen in agressive mode
+ * boundary strings. Missing boundaries can happen in aggressive mode
* with text/rfc822-headers or with message/partial. Ignore non-space
* cruft after --boundary or --boundary--, because some MUAs do, and
* because only perverse software would take advantage of this to
* files performance degrades rapidly unless the memory pool is O(file
* size).
*
- * For "btree" files peformance is good with sorted input even for small
+ * For "btree" files performance is good with sorted input even for small
* memory pools, but with random input degrades rapidly unless the memory
* pool is O(file size).
*
/* open stream and the caller-specified context when the
/* service responds, or with a null stream and the caller-specified
/* context when the request could not be completed. It is the
-/* responsability of the application to close an open stream.
+/* responsibility of the application to close an open stream.
/*
/* post_mail_fprintf() formats message content (header or body)
/* and sends it to the cleanup service.
/* Yorktown Heights, NY 10598, USA
/*--*/
-/* Syste, library. */
+/* System library. */
#include <sys_defs.h>
/*
* The warn record specifies when the next warning that the message was
* deferred should be sent. It is updated in place by qmgr, so changing
- * this value when there are deferred mesages in the queue is dangerous!
+ * this value when there are deferred messages in the queue is dangerous!
*/
#define REC_TYPE_WARN_FORMAT "%15ld" /* warning time format */
#define REC_TYPE_WARN_ARG(tv) ((long) (tv))
*/
struct SCACHE_SIZE {
int dest_count; /* Nr of destination names */
- int endp_count; /* Nr of endpoint adresses */
+ int endp_count; /* Nr of endpoint addresses */
int sess_count; /* Nr of cached sessions */
};
* environments with pre-existing mail flows that contain UTF8.
*
* Prior to SMTPUTF8, mail flows that contain UTF8 worked because the vast
- * majority of MTAs is perfectly capable of handling UTF8 in addres
+ * majority of MTAs is perfectly capable of handling UTF8 in address
* localparts (and in headers), even if pre-SMTPUTF8 standards do not
* support this practice.
*
* client does not request SMTPUTF8 support, and because 2) a down-stream
* MTA does not announce SMTPUTF8 support.
*
- * While 1) is easy enough to avoid (keep accepting UTF8 in addres localparts
+ * While 1) is easy enough to avoid (keep accepting UTF8 in address localparts
* just like Postfix has always done), 2) presents a thornier problem. The
* root cause of that problem is the need for SMTPUTF8 autodetection.
*
verify_time = time((time_t *) 0);
/*
- * Compute the current probe sender addres.
+ * Compute the current probe sender address.
*/
verify_sender = make_verify_sender_addr();
*
* We cannot do duplicate elimination here. Sendmail compatibility requires
* that we allow multiple deliveries to the same alias, even recursively!
- * For example, we must deliver to mailbox any messags that are addressed
+ * For example, we must deliver to mailbox any messages that are addressed
* to the alias of a user that lists that same alias in her own .forward
* file. Yuck! This is just an example of some really perverse semantics
* that people will expect Postfix to implement just like sendmail.
/*
/* qmgr_error_queue() looks up an error queue for the specified
/* service and problem. The result is null if the queue is not
-/* availabe.
+/* available.
/*
/* qmgr_error_nexthop() computes the next-hop information for
/* the specified problem. The result must be passed to myfree().
dicts[n] = 0;
/*
- * Perform all queries. Open maps on the fly, to avoid opening unecessary
+ * Perform all queries. Open maps on the fly, to avoid opening unnecessary
* maps.
*/
while (vstring_get_nonl(keybuf, in) != VSTREAM_EOF) {
INSTANCE *ip = alloc_instance(var_config_dir);
/*
- * There is no need to load primary instance paramater settings from
+ * There is no need to load primary instance parameter settings from
* file. We already have the main.cf parameters of interest in memory.
*/
#define SAVE_INSTANCE_NAME(val) (*(val) ? mystrdup(val) : 0)
}
/*
- * Proces main.cf parameters.
+ * Process main.cf parameters.
*/
mail_conf_read();
get_mail_conf_str_table(str_table);
*/
static VSTRING *reply_client; /* client address in DNSBLOG reply */
static VSTRING *reply_dnsbl; /* domain in DNSBLOG reply */
-static VSTRING *reply_addr; /* adress list in DNSBLOG reply */
+static VSTRING *reply_addr; /* address list in DNSBLOG reply */
/* psc_dnsbl_add_site - add DNSBL site information */
/*
/* qmgr_error_queue() looks up an error queue for the specified
/* service and problem. The result is null if the queue is not
-/* availabe.
+/* available.
/*
/* qmgr_error_nexthop() computes the next-hop information for
/* the specified problem. The result must be passed to myfree().
* at completely different times.
*
* We "freeze" the choice in the sender loop, just before we generate "." or
- * "RSET". The reader loop leaves the connection cachable even if the timer
+ * "RSET". The reader loop leaves the connection cacheable even if the timer
* expires by the time the response arrives. The connection cleanup code
* will call smtp_quit() for connections with an expired cache expiration
* timer.
* XXX To avoid multiple writers the map needs to be maintained by the
* proxywrite service. We would like to have a DICT_FLAG_REQ_PROXY flag
* so that the library can enforce this, but that requires moving the
- * dict_proxy module one level down in the build dependency hierachy.
+ * dict_proxy module one level down in the build dependency hierarchy.
*/
#define CACHE_DICT_OPEN_FLAGS \
(DICT_FLAG_DUP_REPLACE | DICT_FLAG_SYNC_UPDATE | DICT_FLAG_UTF8_REQUEST)
/*
* Historically, Postfix does not forbid 8-bit envelope localparts.
* Changing this would be a compatibility break. That can't happen in the
- * forseeable future.
+ * foreseeable future.
*/
if ((var_strict_smtputf8 || warn_compat_break_smtputf8_enable)
&& (state->flags & SMTPD_FLAG_SMTPUTF8) == 0
/*
* Historically, Postfix does not forbid 8-bit envelope localparts.
* Changing this would be a compatibility break. That can't happen in the
- * forseeable future.
+ * foreseeable future.
*/
if ((var_strict_smtputf8 || warn_compat_break_smtputf8_enable)
&& (state->flags & SMTPD_FLAG_SMTPUTF8) == 0
/*
* The SMTP standard (RFC 821) disallows unquoted special characters in
* the VRFY argument. Common practice violates the standard, however.
- * Postfix accomodates common practice where it violates the standard.
+ * Postfix accommodates common practice where it violates the standard.
*
* XXX Impedance mismatch! The SMTP command tokenizer preserves quoting,
* whereas the recipient restrictions checks expect unquoted (internal)
/*
/* smtpd_chat_reply() formats a server reply, sends it to the
/* client, and appends a copy to the SMTP transaction log.
-/* When soft_bounce is enabled, all 5xx (reject) reponses are
+/* When soft_bounce is enabled, all 5xx (reject) responses are
/* replaced by 4xx (try again). In case of a 421 reply the
/* SMTPD_FLAG_HANGUP flag is set for orderly disconnect.
/*
/*
* Receive the client response. "*" means that the client gives up.
* XXX For now we ignore the fact that an excessively long response
- * will be chopped into multiple reponses. To handle such responses,
+ * will be chopped into multiple responses. To handle such responses,
* we need to change smtpd_chat_query() so that it returns an error
* indication.
*/
X509_NAME *name = akid_issuer_name(akid);
/*
- * If subject's akid specifies an authority key identifer issuer name, we
+ * If subject's akid specifies an authority key identifier issuer name, we
* must use that.
*/
if (name)
/* .IP verbose
/* Do verbose logging of cache operations? (zero == no)
/* .IP timeout
-/* The time after wich a session cache entry is considered too old.
+/* The time after which a session cache entry is considered too old.
/* .IP first_next
/* One of DICT_SEQ_FUN_FIRST (first cache element) or DICT_SEQ_FUN_NEXT
/* (next cache element).
msg_panic("%s: Non DNS input argument", myname);
/*
- * We expect the OpenSSL library to construct GEN_DNS extesion objects as
+ * We expect the OpenSSL library to construct GEN_DNS extension objects as
* ASN1_IA5STRING values. Check we got the right union member.
*/
if (ASN1_STRING_type(gn->d.ia5) != V_ASN1_IA5STRING) {
*/
/*
- * Perform the before-handshake portion of the per-session initalization.
+ * Perform the before-handshake portion of the per-session initialization.
* Pass a null VSTREAM to indicate that this program, will do the
* ciphertext I/O, not libtls.
*
* with the call-back routine, but there is too much code that would have
* to be changed.
*
- * XXX Should we be concerned that an overly agressive optimizer will
+ * XXX Should we be concerned that an overly aggressive optimizer will
* eliminate this function and replace calls to auto_clnt_ttl_event() by
* direct calls to auto_clnt_event()? It should not, because there exists
* code that takes the address of both functions.
* with space_needed below) does not include storage for the null
* terminator. The terminator is written only when the output buffer is
* large enough. This is why we overallocate space when the output does
- * not fit. But if the output fits exactly, then the ouput will be
+ * not fit. But if the output fits exactly, then the output will be
* unterminated, and we have to terminate the output ourselves.
*/
for (n = 0; n < 3; n++) {
/* pathname into the place of the original file. When any of
/* these operations fails, edit_file_close() behaves as if
/* edit_file_cleanup() was called. Regardless of whether these
-/* operations suceed, edit_file_close() releases the exclusive
+/* operations succeed, edit_file_close() releases the exclusive
/* lock, closes the output file, and frees up memory that was
/* allocated by edit_file_open().
/*
/* In case of error the result value is a dynamically-allocated
/* string with a description of the problem that includes a
/* copy of the offending input. A non-null result value should
-/* be destroyed with myfree(). The following decribes the errors
+/* be destroyed with myfree(). The following describes the errors
/* and the state of the buffer and buffer pointer.
/* .IP "missing closing parenthesis"
/* The buffer pointer points to text as if a closing parenthesis
}
/*
- * Store addess family etc. info as null-terminated vectors. If that
+ * Store address family etc. info as null-terminated vectors. If that
* breaks because we must be able to store nulls, we'll deal with the
* additional complexity.
*
/* myflock() locks or unlocks an entire open file.
/*
/* In the case of a blocking request, a call that fails due to
-/* forseeable transient problems is retried once per second.
+/* foreseeable transient problems is retried once per second.
/*
/* Arguments:
/* .IP fd
/* result value.
/* .IP "CA_SLMDB_CTL_NOTIFY_FN(void (*)(void *, int, ...))"
/* Call-back function pointer. The function is called to report
-/* succesful error recovery. The arguments are the application
+/* successful error recovery. The arguments are the application
/* context, the MDB error code, and additional arguments that
/* depend on the error code. Details are given in the section
/* "ERROR RECOVERY".
/* vstream_feof() returns non-zero when a previous operation on the
/* specified stream caused an end-of-file condition.
/* Although further read requests after EOF may complete
-/* succesfully, vstream_feof() will keep returning non-zero
+/* successfully, vstream_feof() will keep returning non-zero
/* until vstream_clearerr() is called for that stream.
/*
/* vstream_ferror() returns non-zero when a previous operation on the
VBUF write_buf; /* write buffer (double-buffered) */
pid_t pid; /* vstream_popen/close() */
VSTREAM_WAITPID_FN waitpid_fn; /* vstream_popen/close() */
- int timeout; /* read/write timout */
+ int timeout; /* read/write timeout */
VSTREAM_JMP_BUF *jbuf; /* exception handling */
struct timeval iotime; /* time of last fill/flush */
struct timeval time_limit; /* read/write time limit */
/* It destroys a SASL server instance, and disables further
/* read/write operations if encryption was turned on.
/*
-/* xsasl_server_first() produces the server reponse for the
+/* xsasl_server_first() produces the server response for the
/* client AUTH command. The client input are an authentication
/* method, and an optional initial response or null pointer.
/* The initial response and server non-error replies are BASE64