mirror of
https://github.com/vdukhovni/postfix
synced 2025-09-01 06:35:27 +00:00
postfix-1.1.12-20021130
This commit is contained in:
committed by
Viktor Dukhovni
parent
8c3109103b
commit
713aa6b5ec
@@ -7235,6 +7235,22 @@ Apologies for any names omitted.
|
|||||||
send data into unauthorized ports. Files: *qmgr/qmgr_message.c,
|
send data into unauthorized ports. Files: *qmgr/qmgr_message.c,
|
||||||
trivial-rewrite/resolve.c.
|
trivial-rewrite/resolve.c.
|
||||||
|
|
||||||
|
20021128
|
||||||
|
|
||||||
|
Feature: hashed hold queue support, with hashing turned on
|
||||||
|
by default. Omission spotted by Victor Duchovni, Morgan
|
||||||
|
Stanley. Files: global/hold_message.c, global/mail_params.h.
|
||||||
|
|
||||||
|
Bugfix: the LMTP client lost the port(service) information
|
||||||
|
when parsing host:port information. Victor Duchovni, Morgan
|
||||||
|
Stanley. Fix is to have a new host_port(3) module that does
|
||||||
|
the parsing for the SMTP and LMTP clients.
|
||||||
|
|
||||||
|
Cleanup: host_port() routine that parses host/port information
|
||||||
|
more consistently than the existing code in the LMTP and
|
||||||
|
SMTP clients. Files: smtp/smtp_connect.c, lmtp/lmtp_connect.c,
|
||||||
|
util/host_port.[hc].
|
||||||
|
|
||||||
Open problems:
|
Open problems:
|
||||||
|
|
||||||
Low: revise other local delivery agent duplicate filters.
|
Low: revise other local delivery agent duplicate filters.
|
||||||
|
@@ -74,19 +74,18 @@
|
|||||||
# Note: lookup of the null sender address is not possible
|
# Note: lookup of the null sender address is not possible
|
||||||
# with some types of lookup table. By default, Postfix uses
|
# with some types of lookup table. By default, Postfix uses
|
||||||
# <> as the lookup key for such addresses. The value is
|
# <> as the lookup key for such addresses. The value is
|
||||||
# specified with the workaround is to specify
|
# specified with the smtpd_null_access_lookup_key parameter
|
||||||
# smtpd_null_access_lookup_key parameter in the Postfix
|
# in the Postfix main.cf file.
|
||||||
# main.cf file.
|
|
||||||
#
|
#
|
||||||
# ADDRESS EXTENSION
|
# ADDRESS EXTENSION
|
||||||
# When a mail address localpart contains the optional recip-
|
# When a mail address localpart contains the optional recip-
|
||||||
# ient delimiter (e.g., user+foo@domain), the lookup order
|
# ient delimiter (e.g., user+foo@domain), the lookup order
|
||||||
# becomes: user+foo@domain, user@domain, domain, user+foo@,
|
# becomes: user+foo@domain, user@domain, domain, user+foo@,
|
||||||
# and user@.
|
# and user@.
|
||||||
#
|
#
|
||||||
# HOST NAME/ADDRESS PATTERNS
|
# HOST NAME/ADDRESS PATTERNS
|
||||||
# With lookups from indexed files such as DB or DBM, or from
|
# With lookups from indexed files such as DB or DBM, or from
|
||||||
# networked tables such as NIS, LDAP or SQL, the following
|
# networked tables such as NIS, LDAP or SQL, the following
|
||||||
# lookup patterns are examined in the order as listed:
|
# lookup patterns are examined in the order as listed:
|
||||||
#
|
#
|
||||||
# domain.tld
|
# domain.tld
|
||||||
@@ -94,9 +93,9 @@
|
|||||||
#
|
#
|
||||||
# The pattern domain.tld also matches subdomains, but
|
# The pattern domain.tld also matches subdomains, but
|
||||||
# only when the string smtpd_access_maps is listed in
|
# only when the string smtpd_access_maps is listed in
|
||||||
# the Postfix parent_domain_matches_subdomains con-
|
# the Postfix parent_domain_matches_subdomains con-
|
||||||
# figuration setting. Otherwise, specify .domain.tld
|
# figuration setting. Otherwise, specify .domain.tld
|
||||||
# (note the initial dot) in order to match subdo-
|
# (note the initial dot) in order to match subdo-
|
||||||
# mains.
|
# mains.
|
||||||
#
|
#
|
||||||
# net.work.addr.ess
|
# net.work.addr.ess
|
||||||
@@ -105,67 +104,67 @@
|
|||||||
#
|
#
|
||||||
# net.work
|
# net.work
|
||||||
#
|
#
|
||||||
# net Matches any host address in the specified network.
|
# net Matches any host address in the specified network.
|
||||||
# A network address is a sequence of one or more
|
# A network address is a sequence of one or more
|
||||||
# octets separated by ".".
|
# octets separated by ".".
|
||||||
#
|
#
|
||||||
# ACTIONS
|
# ACTIONS
|
||||||
# [45]NN text
|
# [45]NN text
|
||||||
# Reject the address etc. that matches the pattern,
|
# Reject the address etc. that matches the pattern,
|
||||||
# and respond with the numerical code and text.
|
# and respond with the numerical code and text.
|
||||||
#
|
#
|
||||||
# REJECT
|
# REJECT
|
||||||
#
|
#
|
||||||
# REJECT optional text...
|
# REJECT optional text...
|
||||||
# Reject the address etc. that matches the pattern.
|
# Reject the address etc. that matches the pattern.
|
||||||
# Reply with $reject_code optional text... when the
|
# Reply with $reject_code optional text... when the
|
||||||
# optional text is specified, otherwise reply with a
|
# optional text is specified, otherwise reply with a
|
||||||
# generic error response message.
|
# generic error response message.
|
||||||
#
|
#
|
||||||
# OK Accept the address etc. that matches the pattern.
|
# OK Accept the address etc. that matches the pattern.
|
||||||
#
|
#
|
||||||
# all-numerical
|
# all-numerical
|
||||||
# An all-numerical result is treated as OK. This for-
|
# An all-numerical result is treated as OK. This for-
|
||||||
# mat is generated by address-based relay authoriza-
|
# mat is generated by address-based relay authoriza-
|
||||||
# tion schemes.
|
# tion schemes.
|
||||||
#
|
#
|
||||||
# DUNNO Pretend that the lookup key was not found in this
|
# DUNNO Pretend that the lookup key was not found in this
|
||||||
# table, to prevents Postfix from trying substrings
|
# table, to prevents Postfix from trying substrings
|
||||||
# of the lookup key (such as a subdomain name, or a
|
# of the lookup key (such as a subdomain name, or a
|
||||||
# network address subnetwork).
|
# network address subnetwork).
|
||||||
#
|
#
|
||||||
# HOLD
|
# HOLD
|
||||||
#
|
#
|
||||||
# HOLD optional text...
|
# HOLD optional text...
|
||||||
# Place the message on the hold queue, where it will
|
# Place the message on the hold queue, where it will
|
||||||
# sit until someone either deletes it or releases it
|
# sit until someone either deletes it or releases it
|
||||||
# for delivery. Log the optional text if specified,
|
# for delivery. Log the optional text if specified,
|
||||||
# otherwise log a generic message.
|
# otherwise log a generic message.
|
||||||
#
|
#
|
||||||
# Mail that is placed on hold can be examined with
|
# Mail that is placed on hold can be examined with
|
||||||
# the postcat(1) command, and can be destroyed or
|
# the postcat(1) command, and can be destroyed or
|
||||||
# released with the postsuper(1) command.
|
# released with the postsuper(1) command.
|
||||||
#
|
#
|
||||||
# Note: this action currently affects all recipients
|
# Note: this action currently affects all recipients
|
||||||
# of the message.
|
# of the message.
|
||||||
#
|
#
|
||||||
# DISCARD
|
# DISCARD
|
||||||
#
|
#
|
||||||
# DISCARD optional text...
|
# DISCARD optional text...
|
||||||
# Claim successful delivery and silently discard the
|
# Claim successful delivery and silently discard the
|
||||||
# message. Log the optional text if specified, oth-
|
# message. Log the optional text if specified, oth-
|
||||||
# erwise log a generic message.
|
# erwise log a generic message.
|
||||||
#
|
#
|
||||||
# Note: this action currently affects all recipients
|
# Note: this action currently affects all recipients
|
||||||
# of the message.
|
# of the message.
|
||||||
#
|
#
|
||||||
# FILTER transport:destination
|
# FILTER transport:destination
|
||||||
# After the message is queued, send the entire mes-
|
# After the message is queued, send the entire mes-
|
||||||
# sage through a content filter. More information
|
# sage through a content filter. More information
|
||||||
# about content filters is in the Postfix FIL-
|
# about content filters is in the Postfix FIL-
|
||||||
# TER_README file.
|
# TER_README file.
|
||||||
#
|
#
|
||||||
# Note: this action currently affects all recipients
|
# Note: this action currently affects all recipients
|
||||||
# of the message.
|
# of the message.
|
||||||
#
|
#
|
||||||
# restriction...
|
# restriction...
|
||||||
@@ -173,30 +172,30 @@
|
|||||||
# reject_unauth_destination, and so on).
|
# reject_unauth_destination, and so on).
|
||||||
#
|
#
|
||||||
# REGULAR EXPRESSION TABLES
|
# REGULAR EXPRESSION TABLES
|
||||||
# This section describes how the table lookups change when
|
# This section describes how the table lookups change when
|
||||||
# the table is given in the form of regular expressions. For
|
# the table is given in the form of regular expressions. For
|
||||||
# a description of regular expression lookup table syntax,
|
# a description of regular expression lookup table syntax,
|
||||||
# see regexp_table(5) or pcre_table(5).
|
# see regexp_table(5) or pcre_table(5).
|
||||||
#
|
#
|
||||||
# Each pattern is a regular expression that is applied to
|
# Each pattern is a regular expression that is applied to
|
||||||
# the entire string being looked up. Depending on the appli-
|
# the entire string being looked up. Depending on the appli-
|
||||||
# cation, that string is an entire client hostname, an
|
# cation, that string is an entire client hostname, an
|
||||||
# entire client IP address, or an entire mail address. Thus,
|
# entire client IP address, or an entire mail address. Thus,
|
||||||
# no parent domain or parent network search is done,
|
# no parent domain or parent network search is done,
|
||||||
# user@domain mail addresses are not broken up into their
|
# user@domain mail addresses are not broken up into their
|
||||||
# user@ and domain constituent parts, nor is user+foo broken
|
# user@ and domain constituent parts, nor is user+foo broken
|
||||||
# up into user and foo.
|
# up into user and foo.
|
||||||
#
|
#
|
||||||
# Patterns are applied in the order as specified in the
|
# Patterns are applied in the order as specified in the
|
||||||
# table, until a pattern is found that matches the search
|
# table, until a pattern is found that matches the search
|
||||||
# string.
|
# string.
|
||||||
#
|
#
|
||||||
# Actions are the same as with indexed file lookups, with
|
# Actions are the same as with indexed file lookups, with
|
||||||
# the additional feature that parenthesized substrings from
|
# the additional feature that parenthesized substrings from
|
||||||
# the pattern can be interpolated as $1, $2 and so on.
|
# the pattern can be interpolated as $1, $2 and so on.
|
||||||
#
|
#
|
||||||
# BUGS
|
# BUGS
|
||||||
# The table format does not understand quoting conventions.
|
# The table format does not understand quoting conventions.
|
||||||
#
|
#
|
||||||
# SEE ALSO
|
# SEE ALSO
|
||||||
# postmap(1) create mapping table
|
# postmap(1) create mapping table
|
||||||
@@ -205,7 +204,7 @@
|
|||||||
# regexp_table(5) format of POSIX regular expression tables
|
# regexp_table(5) format of POSIX regular expression tables
|
||||||
#
|
#
|
||||||
# LICENSE
|
# LICENSE
|
||||||
# The Secure Mailer license must be distributed with this
|
# The Secure Mailer license must be distributed with this
|
||||||
# software.
|
# software.
|
||||||
#
|
#
|
||||||
# AUTHOR(S)
|
# AUTHOR(S)
|
||||||
|
@@ -75,19 +75,18 @@ ACCESS(5) ACCESS(5)
|
|||||||
Note: lookup of the null sender address is not possible
|
Note: lookup of the null sender address is not possible
|
||||||
with some types of lookup table. By default, Postfix uses
|
with some types of lookup table. By default, Postfix uses
|
||||||
<> as the lookup key for such addresses. The value is
|
<> as the lookup key for such addresses. The value is
|
||||||
specified with the workaround is to specify
|
specified with the <b>smtpd</b><i>_</i><b>null</b><i>_</i><b>access</b><i>_</i><b>lookup</b><i>_</i><b>key</b> parameter
|
||||||
<b>smtpd</b><i>_</i><b>null</b><i>_</i><b>access</b><i>_</i><b>lookup</b><i>_</i><b>key</b> parameter in the Postfix
|
in the Postfix <b>main.cf</b> file.
|
||||||
<b>main.cf</b> file.
|
|
||||||
|
|
||||||
<b>ADDRESS</b> <b>EXTENSION</b>
|
<b>ADDRESS</b> <b>EXTENSION</b>
|
||||||
When a mail address localpart contains the optional recip-
|
When a mail address localpart contains the optional recip-
|
||||||
ient delimiter (e.g., <i>user+foo</i>@<i>domain</i>), the lookup order
|
ient delimiter (e.g., <i>user+foo</i>@<i>domain</i>), the lookup order
|
||||||
becomes: <i>user+foo</i>@<i>domain</i>, <i>user</i>@<i>domain</i>, <i>domain</i>, <i>user+foo</i>@,
|
becomes: <i>user+foo</i>@<i>domain</i>, <i>user</i>@<i>domain</i>, <i>domain</i>, <i>user+foo</i>@,
|
||||||
and <i>user</i>@.
|
and <i>user</i>@.
|
||||||
|
|
||||||
<b>HOST</b> <b>NAME/ADDRESS</b> <b>PATTERNS</b>
|
<b>HOST</b> <b>NAME/ADDRESS</b> <b>PATTERNS</b>
|
||||||
With lookups from indexed files such as DB or DBM, or from
|
With lookups from indexed files such as DB or DBM, or from
|
||||||
networked tables such as NIS, LDAP or SQL, the following
|
networked tables such as NIS, LDAP or SQL, the following
|
||||||
lookup patterns are examined in the order as listed:
|
lookup patterns are examined in the order as listed:
|
||||||
|
|
||||||
<i>domain.tld</i>
|
<i>domain.tld</i>
|
||||||
@@ -95,9 +94,9 @@ ACCESS(5) ACCESS(5)
|
|||||||
|
|
||||||
The pattern <i>domain.tld</i> also matches subdomains, but
|
The pattern <i>domain.tld</i> also matches subdomains, but
|
||||||
only when the string <b>smtpd</b><i>_</i><b>access</b><i>_</i><b>maps</b> is listed in
|
only when the string <b>smtpd</b><i>_</i><b>access</b><i>_</i><b>maps</b> is listed in
|
||||||
the Postfix <b>parent</b><i>_</i><b>domain</b><i>_</i><b>matches</b><i>_</i><b>subdomains</b> con-
|
the Postfix <b>parent</b><i>_</i><b>domain</b><i>_</i><b>matches</b><i>_</i><b>subdomains</b> con-
|
||||||
figuration setting. Otherwise, specify <i>.domain.tld</i>
|
figuration setting. Otherwise, specify <i>.domain.tld</i>
|
||||||
(note the initial dot) in order to match subdo-
|
(note the initial dot) in order to match subdo-
|
||||||
mains.
|
mains.
|
||||||
|
|
||||||
<i>net.work.addr.ess</i>
|
<i>net.work.addr.ess</i>
|
||||||
@@ -106,67 +105,67 @@ ACCESS(5) ACCESS(5)
|
|||||||
|
|
||||||
<i>net.work</i>
|
<i>net.work</i>
|
||||||
|
|
||||||
<i>net</i> Matches any host address in the specified network.
|
<i>net</i> Matches any host address in the specified network.
|
||||||
A network address is a sequence of one or more
|
A network address is a sequence of one or more
|
||||||
octets separated by ".".
|
octets separated by ".".
|
||||||
|
|
||||||
<b>ACTIONS</b>
|
<b>ACTIONS</b>
|
||||||
[<b>45</b>]<i>NN</i> <i>text</i>
|
[<b>45</b>]<i>NN</i> <i>text</i>
|
||||||
Reject the address etc. that matches the pattern,
|
Reject the address etc. that matches the pattern,
|
||||||
and respond with the numerical code and text.
|
and respond with the numerical code and text.
|
||||||
|
|
||||||
<b>REJECT</b>
|
<b>REJECT</b>
|
||||||
|
|
||||||
<b>REJECT</b> <i>optional</i> <i>text...</i>
|
<b>REJECT</b> <i>optional</i> <i>text...</i>
|
||||||
Reject the address etc. that matches the pattern.
|
Reject the address etc. that matches the pattern.
|
||||||
Reply with <i>$reject_code</i> <i>optional</i> <i>text...</i> when the
|
Reply with <i>$reject_code</i> <i>optional</i> <i>text...</i> when the
|
||||||
optional text is specified, otherwise reply with a
|
optional text is specified, otherwise reply with a
|
||||||
generic error response message.
|
generic error response message.
|
||||||
|
|
||||||
<b>OK</b> Accept the address etc. that matches the pattern.
|
<b>OK</b> Accept the address etc. that matches the pattern.
|
||||||
|
|
||||||
<i>all-numerical</i>
|
<i>all-numerical</i>
|
||||||
An all-numerical result is treated as OK. This for-
|
An all-numerical result is treated as OK. This for-
|
||||||
mat is generated by address-based relay authoriza-
|
mat is generated by address-based relay authoriza-
|
||||||
tion schemes.
|
tion schemes.
|
||||||
|
|
||||||
<b>DUNNO</b> Pretend that the lookup key was not found in this
|
<b>DUNNO</b> Pretend that the lookup key was not found in this
|
||||||
table, to prevents Postfix from trying substrings
|
table, to prevents Postfix from trying substrings
|
||||||
of the lookup key (such as a subdomain name, or a
|
of the lookup key (such as a subdomain name, or a
|
||||||
network address subnetwork).
|
network address subnetwork).
|
||||||
|
|
||||||
<b>HOLD</b>
|
<b>HOLD</b>
|
||||||
|
|
||||||
<b>HOLD</b> <i>optional</i> <i>text...</i>
|
<b>HOLD</b> <i>optional</i> <i>text...</i>
|
||||||
Place the message on the <b>hold</b> queue, where it will
|
Place the message on the <b>hold</b> queue, where it will
|
||||||
sit until someone either deletes it or releases it
|
sit until someone either deletes it or releases it
|
||||||
for delivery. Log the optional text if specified,
|
for delivery. Log the optional text if specified,
|
||||||
otherwise log a generic message.
|
otherwise log a generic message.
|
||||||
|
|
||||||
Mail that is placed on hold can be examined with
|
Mail that is placed on hold can be examined with
|
||||||
the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
|
the <a href="postcat.1.html"><b>postcat</b>(1)</a> command, and can be destroyed or
|
||||||
released with the <a href="postsuper.1.html"><b>postsuper</b>(1)</a> command.
|
released with the <a href="postsuper.1.html"><b>postsuper</b>(1)</a> command.
|
||||||
|
|
||||||
Note: this action currently affects all recipients
|
Note: this action currently affects all recipients
|
||||||
of the message.
|
of the message.
|
||||||
|
|
||||||
<b>DISCARD</b>
|
<b>DISCARD</b>
|
||||||
|
|
||||||
<b>DISCARD</b> <i>optional</i> <i>text...</i>
|
<b>DISCARD</b> <i>optional</i> <i>text...</i>
|
||||||
Claim successful delivery and silently discard the
|
Claim successful delivery and silently discard the
|
||||||
message. Log the optional text if specified, oth-
|
message. Log the optional text if specified, oth-
|
||||||
erwise log a generic message.
|
erwise log a generic message.
|
||||||
|
|
||||||
Note: this action currently affects all recipients
|
Note: this action currently affects all recipients
|
||||||
of the message.
|
of the message.
|
||||||
|
|
||||||
<b>FILTER</b> <i>transport:destination</i>
|
<b>FILTER</b> <i>transport:destination</i>
|
||||||
After the message is queued, send the entire mes-
|
After the message is queued, send the entire mes-
|
||||||
sage through a content filter. More information
|
sage through a content filter. More information
|
||||||
about content filters is in the Postfix FIL-
|
about content filters is in the Postfix FIL-
|
||||||
TER_README file.
|
TER_README file.
|
||||||
|
|
||||||
Note: this action currently affects all recipients
|
Note: this action currently affects all recipients
|
||||||
of the message.
|
of the message.
|
||||||
|
|
||||||
<i>restriction...</i>
|
<i>restriction...</i>
|
||||||
@@ -174,30 +173,30 @@ ACCESS(5) ACCESS(5)
|
|||||||
<b>reject</b><i>_</i><b>unauth</b><i>_</i><b>destination</b>, and so on).
|
<b>reject</b><i>_</i><b>unauth</b><i>_</i><b>destination</b>, and so on).
|
||||||
|
|
||||||
<b>REGULAR</b> <b>EXPRESSION</b> <b>TABLES</b>
|
<b>REGULAR</b> <b>EXPRESSION</b> <b>TABLES</b>
|
||||||
This section describes how the table lookups change when
|
This section describes how the table lookups change when
|
||||||
the table is given in the form of regular expressions. For
|
the table is given in the form of regular expressions. For
|
||||||
a description of regular expression lookup table syntax,
|
a description of regular expression lookup table syntax,
|
||||||
see <a href="regexp_table.5.html"><b>regexp</b><i>_</i><b>table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre</b><i>_</i><b>table</b>(5)</a>.
|
see <a href="regexp_table.5.html"><b>regexp</b><i>_</i><b>table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre</b><i>_</i><b>table</b>(5)</a>.
|
||||||
|
|
||||||
Each pattern is a regular expression that is applied to
|
Each pattern is a regular expression that is applied to
|
||||||
the entire string being looked up. Depending on the appli-
|
the entire string being looked up. Depending on the appli-
|
||||||
cation, that string is an entire client hostname, an
|
cation, that string is an entire client hostname, an
|
||||||
entire client IP address, or an entire mail address. Thus,
|
entire client IP address, or an entire mail address. Thus,
|
||||||
no parent domain or parent network search is done,
|
no parent domain or parent network search is done,
|
||||||
<i>user@domain</i> mail addresses are not broken up into their
|
<i>user@domain</i> mail addresses are not broken up into their
|
||||||
<i>user@</i> and <i>domain</i> constituent parts, nor is <i>user+foo</i> broken
|
<i>user@</i> and <i>domain</i> constituent parts, nor is <i>user+foo</i> broken
|
||||||
up into <i>user</i> and <i>foo</i>.
|
up into <i>user</i> and <i>foo</i>.
|
||||||
|
|
||||||
Patterns are applied in the order as specified in the
|
Patterns are applied in the order as specified in the
|
||||||
table, until a pattern is found that matches the search
|
table, until a pattern is found that matches the search
|
||||||
string.
|
string.
|
||||||
|
|
||||||
Actions are the same as with indexed file lookups, with
|
Actions are the same as with indexed file lookups, with
|
||||||
the additional feature that parenthesized substrings from
|
the additional feature that parenthesized substrings from
|
||||||
the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
|
the pattern can be interpolated as <b>$1</b>, <b>$2</b> and so on.
|
||||||
|
|
||||||
<b>BUGS</b>
|
<b>BUGS</b>
|
||||||
The table format does not understand quoting conventions.
|
The table format does not understand quoting conventions.
|
||||||
|
|
||||||
<b>SEE</b> <b>ALSO</b>
|
<b>SEE</b> <b>ALSO</b>
|
||||||
<a href="postmap.1.html">postmap(1)</a> create mapping table
|
<a href="postmap.1.html">postmap(1)</a> create mapping table
|
||||||
@@ -206,7 +205,7 @@ ACCESS(5) ACCESS(5)
|
|||||||
<a href="regexp_table.5.html">regexp_table(5)</a> format of POSIX regular expression tables
|
<a href="regexp_table.5.html">regexp_table(5)</a> format of POSIX regular expression tables
|
||||||
|
|
||||||
<b>LICENSE</b>
|
<b>LICENSE</b>
|
||||||
The Secure Mailer license must be distributed with this
|
The Secure Mailer license must be distributed with this
|
||||||
software.
|
software.
|
||||||
|
|
||||||
<b>AUTHOR(S)</b>
|
<b>AUTHOR(S)</b>
|
||||||
|
@@ -73,8 +73,8 @@ Matches all mail addresses with the specified user part.
|
|||||||
Note: lookup of the null sender address is not possible with
|
Note: lookup of the null sender address is not possible with
|
||||||
some types of lookup table. By default, Postfix uses \fB<>\fR
|
some types of lookup table. By default, Postfix uses \fB<>\fR
|
||||||
as the lookup key for such addresses. The value is specified with
|
as the lookup key for such addresses. The value is specified with
|
||||||
the workaround is to specify \fBsmtpd_null_access_lookup_key\fR
|
the \fBsmtpd_null_access_lookup_key\fR parameter in the Postfix
|
||||||
parameter in the Postfix \fBmain.cf\fR file.
|
\fBmain.cf\fR file.
|
||||||
.SH ADDRESS EXTENSION
|
.SH ADDRESS EXTENSION
|
||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
|
@@ -63,8 +63,8 @@
|
|||||||
# Note: lookup of the null sender address is not possible with
|
# Note: lookup of the null sender address is not possible with
|
||||||
# some types of lookup table. By default, Postfix uses \fB<>\fR
|
# some types of lookup table. By default, Postfix uses \fB<>\fR
|
||||||
# as the lookup key for such addresses. The value is specified with
|
# as the lookup key for such addresses. The value is specified with
|
||||||
# the workaround is to specify \fBsmtpd_null_access_lookup_key\fR
|
# the \fBsmtpd_null_access_lookup_key\fR parameter in the Postfix
|
||||||
# parameter in the Postfix \fBmain.cf\fR file.
|
# \fBmain.cf\fR file.
|
||||||
# ADDRESS EXTENSION
|
# ADDRESS EXTENSION
|
||||||
# .fi
|
# .fi
|
||||||
# .ad
|
# .ad
|
||||||
|
@@ -213,7 +213,9 @@ int cleanup_flush(CLEANUP_STATE *state)
|
|||||||
*/
|
*/
|
||||||
if (state->errs == 0 && (state->flags & CLEANUP_FLAG_DISCARD) == 0) {
|
if (state->errs == 0 && (state->flags & CLEANUP_FLAG_DISCARD) == 0) {
|
||||||
if ((state->flags & CLEANUP_FLAG_HOLD) != 0) {
|
if ((state->flags & CLEANUP_FLAG_HOLD) != 0) {
|
||||||
hold_message(state->temp1, state->queue_name, state->queue_id);
|
if (hold_message(state->temp1, state->queue_name, state->queue_id) < 0)
|
||||||
|
msg_fatal("%s: problem putting message on hold: %m",
|
||||||
|
state->queue_id);
|
||||||
junk = cleanup_path;
|
junk = cleanup_path;
|
||||||
cleanup_path = mystrdup(vstring_str(state->temp1));
|
cleanup_path = mystrdup(vstring_str(state->temp1));
|
||||||
myfree(junk);
|
myfree(junk);
|
||||||
|
@@ -532,6 +532,7 @@ hold_message.o: hold_message.c
|
|||||||
hold_message.o: ../../include/sys_defs.h
|
hold_message.o: ../../include/sys_defs.h
|
||||||
hold_message.o: ../../include/msg.h
|
hold_message.o: ../../include/msg.h
|
||||||
hold_message.o: ../../include/set_eugid.h
|
hold_message.o: ../../include/set_eugid.h
|
||||||
|
hold_message.o: ../../include/sane_fsops.h
|
||||||
hold_message.o: mail_queue.h
|
hold_message.o: mail_queue.h
|
||||||
hold_message.o: ../../include/vstring.h
|
hold_message.o: ../../include/vstring.h
|
||||||
hold_message.o: ../../include/vbuf.h
|
hold_message.o: ../../include/vbuf.h
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <hold_message.h>
|
/* #include <hold_message.h>
|
||||||
/*
|
/*
|
||||||
/* void hold_message(path_buf, queue_name, queue_id)
|
/* int hold_message(path_buf, queue_name, queue_id)
|
||||||
/* VSTRING *path_buf;
|
/* VSTRING *path_buf;
|
||||||
/* const char *queue_name;
|
/* const char *queue_name;
|
||||||
/* const char *queue_id;
|
/* const char *queue_id;
|
||||||
@@ -22,6 +22,8 @@
|
|||||||
/* Queue name with the message that needs to be placed on hold.
|
/* Queue name with the message that needs to be placed on hold.
|
||||||
/* .IP queue_id
|
/* .IP queue_id
|
||||||
/* Queue file name with the message that needs to be placed on hold.
|
/* Queue file name with the message that needs to be placed on hold.
|
||||||
|
/* DIAGNOSTICS
|
||||||
|
/* The result is -1 in case of failure, 0 in case of success.
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
@@ -45,6 +47,7 @@
|
|||||||
|
|
||||||
#include <msg.h>
|
#include <msg.h>
|
||||||
#include <set_eugid.h>
|
#include <set_eugid.h>
|
||||||
|
#include <sane_fsops.h>
|
||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
@@ -56,13 +59,14 @@
|
|||||||
|
|
||||||
/* hold_message - move message to hold queue */
|
/* hold_message - move message to hold queue */
|
||||||
|
|
||||||
void hold_message(VSTRING *path_buf, const char *queue_name,
|
int hold_message(VSTRING *path_buf, const char *queue_name,
|
||||||
const char *queue_id)
|
const char *queue_id)
|
||||||
{
|
{
|
||||||
VSTRING *old_path = vstring_alloc(100);
|
VSTRING *old_path = vstring_alloc(100);
|
||||||
VSTRING *new_path = 0;
|
VSTRING *new_path = 0;
|
||||||
uid_t saved_uid;
|
uid_t saved_uid;
|
||||||
gid_t saved_gid;
|
gid_t saved_gid;
|
||||||
|
int err;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If not running as the mail system, change privileges first.
|
* If not running as the mail system, change privileges first.
|
||||||
@@ -79,20 +83,16 @@ void hold_message(VSTRING *path_buf, const char *queue_name,
|
|||||||
new_path = path_buf = vstring_alloc(100);
|
new_path = path_buf = vstring_alloc(100);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Grr. Don't do stupid things when this function is called multiple
|
* This code duplicates mail_queue_rename(), except that it also returns
|
||||||
* times. sane_rename() would emit a bogus warning about spurious NFS
|
* the result pathname to the caller.
|
||||||
* problems.
|
|
||||||
*/
|
*/
|
||||||
(void) mail_queue_path(old_path, queue_name, queue_id);
|
(void) mail_queue_path(old_path, queue_name, queue_id);
|
||||||
(void) mail_queue_path(path_buf, MAIL_QUEUE_HOLD, queue_id);
|
(void) mail_queue_path(path_buf, MAIL_QUEUE_HOLD, queue_id);
|
||||||
if (access(STR(old_path), F_OK) == 0) {
|
if ((err = sane_rename(STR(old_path), STR(path_buf))) == 0
|
||||||
if (rename(STR(old_path), STR(path_buf)) == 0
|
|| ((err = mail_queue_mkdirs(STR(path_buf)) == 0)
|
||||||
|| (access(STR(old_path), F_OK) < 0
|
&& (err = sane_rename(STR(old_path), STR(path_buf))) == 0)) {
|
||||||
&& access(STR(path_buf), F_OK) == 0)) {
|
if (msg_verbose)
|
||||||
if (msg_verbose)
|
msg_info("%s: placed on hold", queue_id);
|
||||||
msg_info("%s: placed on hold", queue_id);
|
|
||||||
} else
|
|
||||||
msg_warn("%s: could not place message on hold: %m", queue_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -107,4 +107,6 @@ void hold_message(VSTRING *path_buf, const char *queue_name,
|
|||||||
vstring_free(old_path);
|
vstring_free(old_path);
|
||||||
if (new_path)
|
if (new_path)
|
||||||
vstring_free(new_path);
|
vstring_free(new_path);
|
||||||
|
|
||||||
|
return (err);
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
*/
|
*/
|
||||||
extern void hold_message(VSTRING *, const char *, const char *);
|
extern int hold_message(VSTRING *, const char *, const char *);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@@ -658,7 +658,7 @@ extern int var_debug_peer_level;
|
|||||||
* subdirectories, and how deep the forest is.
|
* subdirectories, and how deep the forest is.
|
||||||
*/
|
*/
|
||||||
#define VAR_HASH_QUEUE_NAMES "hash_queue_names"
|
#define VAR_HASH_QUEUE_NAMES "hash_queue_names"
|
||||||
#define DEF_HASH_QUEUE_NAMES "incoming,active,deferred,bounce,defer,flush"
|
#define DEF_HASH_QUEUE_NAMES "incoming,active,deferred,bounce,defer,flush,hold"
|
||||||
extern char *var_hash_queue_names;
|
extern char *var_hash_queue_names;
|
||||||
|
|
||||||
#define VAR_HASH_QUEUE_DEPTH "hash_queue_depth"
|
#define VAR_HASH_QUEUE_DEPTH "hash_queue_depth"
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
* Patches change the patchlevel and the release date. Snapshots change the
|
* Patches change the patchlevel and the release date. Snapshots change the
|
||||||
* release date only, unless they include the same bugfix as a patch release.
|
* release date only, unless they include the same bugfix as a patch release.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20021124"
|
#define MAIL_RELEASE_DATE "20021130"
|
||||||
|
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
#define DEF_MAIL_VERSION "1.1.12-" MAIL_RELEASE_DATE
|
#define DEF_MAIL_VERSION "1.1.12-" MAIL_RELEASE_DATE
|
||||||
|
@@ -129,6 +129,7 @@ lmtp_connect.o: ../../include/mymalloc.h
|
|||||||
lmtp_connect.o: ../../include/iostuff.h
|
lmtp_connect.o: ../../include/iostuff.h
|
||||||
lmtp_connect.o: ../../include/timed_connect.h
|
lmtp_connect.o: ../../include/timed_connect.h
|
||||||
lmtp_connect.o: ../../include/stringops.h
|
lmtp_connect.o: ../../include/stringops.h
|
||||||
|
lmtp_connect.o: ../../include/host_port.h
|
||||||
lmtp_connect.o: ../../include/mail_params.h
|
lmtp_connect.o: ../../include/mail_params.h
|
||||||
lmtp_connect.o: ../../include/mail_proto.h
|
lmtp_connect.o: ../../include/mail_proto.h
|
||||||
lmtp_connect.o: ../../include/attr.h
|
lmtp_connect.o: ../../include/attr.h
|
||||||
|
@@ -92,6 +92,7 @@
|
|||||||
#include <iostuff.h>
|
#include <iostuff.h>
|
||||||
#include <timed_connect.h>
|
#include <timed_connect.h>
|
||||||
#include <stringops.h>
|
#include <stringops.h>
|
||||||
|
#include <host_port.h>
|
||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
@@ -298,35 +299,21 @@ static char *lmtp_parse_destination(const char *destination, char *def_service,
|
|||||||
{
|
{
|
||||||
char *myname = "lmtp_parse_destination";
|
char *myname = "lmtp_parse_destination";
|
||||||
char *buf = mystrdup(destination);
|
char *buf = mystrdup(destination);
|
||||||
char *host = buf;
|
|
||||||
char *service;
|
char *service;
|
||||||
struct servent *sp;
|
struct servent *sp;
|
||||||
char *protocol = "tcp"; /* XXX configurable? */
|
char *protocol = "tcp"; /* XXX configurable? */
|
||||||
unsigned port;
|
unsigned port;
|
||||||
|
const char *err;
|
||||||
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("%s: %s %s", myname, destination, def_service);
|
msg_info("%s: %s %s", myname, destination, def_service);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Strip quoting. We're working with a copy of the destination argument
|
* Parse the host/port information. We're working with a copy of the
|
||||||
* so the stripping can be destructive.
|
* destination argument so the parsing can be destructive.
|
||||||
*/
|
*/
|
||||||
if (*host == '[') {
|
if ((err = host_port(buf, hostp, &service, def_service)) != 0)
|
||||||
host++;
|
msg_fatal("%s in LMTP server description: %s", err, destination);
|
||||||
host[strcspn(host, "]")] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Separate host and service information, or use the default service
|
|
||||||
* specified by the caller. XXX the ":" character is used in the IPV6
|
|
||||||
* address notation, so using split_at_right() is not sufficient. We'd
|
|
||||||
* have to count the number of ":" instances.
|
|
||||||
*/
|
|
||||||
if ((service = split_at_right(host, ':')) == 0 || *service == 0)
|
|
||||||
service = def_service;
|
|
||||||
if (*service == 0)
|
|
||||||
msg_fatal("%s: empty service name: %s", myname, destination);
|
|
||||||
*hostp = host;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert service to port number, network byte order. Since most folks
|
* Convert service to port number, network byte order. Since most folks
|
||||||
|
@@ -136,6 +136,7 @@ smtp_connect.o: ../../include/inet_addr_list.h
|
|||||||
smtp_connect.o: ../../include/iostuff.h
|
smtp_connect.o: ../../include/iostuff.h
|
||||||
smtp_connect.o: ../../include/timed_connect.h
|
smtp_connect.o: ../../include/timed_connect.h
|
||||||
smtp_connect.o: ../../include/stringops.h
|
smtp_connect.o: ../../include/stringops.h
|
||||||
|
smtp_connect.o: ../../include/host_port.h
|
||||||
smtp_connect.o: ../../include/mail_params.h
|
smtp_connect.o: ../../include/mail_params.h
|
||||||
smtp_connect.o: ../../include/own_inet_addr.h
|
smtp_connect.o: ../../include/own_inet_addr.h
|
||||||
smtp_connect.o: ../../include/dns.h
|
smtp_connect.o: ../../include/dns.h
|
||||||
|
@@ -111,6 +111,7 @@
|
|||||||
#include <iostuff.h>
|
#include <iostuff.h>
|
||||||
#include <timed_connect.h>
|
#include <timed_connect.h>
|
||||||
#include <stringops.h>
|
#include <stringops.h>
|
||||||
|
#include <host_port.h>
|
||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
@@ -325,49 +326,21 @@ static char *smtp_parse_destination(char *destination, char *def_service,
|
|||||||
char **hostp, unsigned *portp)
|
char **hostp, unsigned *portp)
|
||||||
{
|
{
|
||||||
char *buf = mystrdup(destination);
|
char *buf = mystrdup(destination);
|
||||||
char *host = buf;
|
|
||||||
char *service;
|
char *service;
|
||||||
struct servent *sp;
|
struct servent *sp;
|
||||||
char *protocol = "tcp"; /* XXX configurable? */
|
char *protocol = "tcp"; /* XXX configurable? */
|
||||||
unsigned port;
|
unsigned port;
|
||||||
char *cruft;
|
const char *err;
|
||||||
|
|
||||||
if (msg_verbose)
|
if (msg_verbose)
|
||||||
msg_info("smtp_parse_destination: %s %s", destination, def_service);
|
msg_info("smtp_parse_destination: %s %s", destination, def_service);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Strip quoting. We're working with a copy of the destination argument
|
* Parse the host/port information. We're working with a copy of the
|
||||||
* so the stripping can be destructive.
|
* destination argument so the parsing can be destructive.
|
||||||
*/
|
*/
|
||||||
if (*host == '[') {
|
if ((err = host_port(buf, hostp, &service, def_service)) != 0)
|
||||||
host++;
|
msg_fatal("%s in SMTP server description: %s", err, destination);
|
||||||
cruft = split_at(host, ']');
|
|
||||||
} else
|
|
||||||
cruft = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Separate host and service information, or use the default service
|
|
||||||
* specified by the caller. XXX the ":" character is used in the IPV6
|
|
||||||
* address notation, so we will have to deprecate the use of [host:port]
|
|
||||||
* in favor of [host]:port.
|
|
||||||
*/
|
|
||||||
if (cruft && *cruft) {
|
|
||||||
if ((service = split_at_right(cruft, ':')) == 0)
|
|
||||||
service = def_service;
|
|
||||||
} else {
|
|
||||||
if ((service = split_at_right(host, ':')) == 0)
|
|
||||||
service = def_service;
|
|
||||||
#if 0
|
|
||||||
else if (cruft) {
|
|
||||||
msg_warn("old-style address form: %s", destination);
|
|
||||||
msg_warn("support for [host:port] forms will go away");
|
|
||||||
msg_warn("specify [host]:port instead");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (*service == 0)
|
|
||||||
msg_fatal("empty service name: %s", destination);
|
|
||||||
*hostp = host;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert service to port number, network byte order.
|
* Convert service to port number, network byte order.
|
||||||
|
@@ -26,7 +26,7 @@ SRCS = alldig.c argv.c argv_split.c attr_print0.c attr_print64.c \
|
|||||||
unix_connect.c unix_listen.c unix_trigger.c unsafe.c username.c \
|
unix_connect.c unix_listen.c unix_trigger.c unsafe.c username.c \
|
||||||
valid_hostname.c vbuf.c vbuf_print.c vstream.c vstream_popen.c \
|
valid_hostname.c vbuf.c vbuf_print.c vstream.c vstream_popen.c \
|
||||||
vstring.c vstring_vstream.c watchdog.c writable.c write_buf.c \
|
vstring.c vstring_vstream.c watchdog.c writable.c write_buf.c \
|
||||||
write_wait.c strcasecmp.c nvtable.c
|
write_wait.c strcasecmp.c nvtable.c host_port.c
|
||||||
OBJS = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
|
OBJS = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
|
||||||
attr_scan0.o attr_scan64.o base64_code.o basename.o binhash.o \
|
attr_scan0.o attr_scan64.o base64_code.o basename.o binhash.o \
|
||||||
chroot_uid.o clean_env.o close_on_exec.o concatenate.o ctable.o \
|
chroot_uid.o clean_env.o close_on_exec.o concatenate.o ctable.o \
|
||||||
@@ -54,7 +54,7 @@ OBJS = alldig.o argv.o argv_split.o attr_print0.o attr_print64.o \
|
|||||||
unix_connect.o unix_listen.o unix_trigger.o unsafe.o username.o \
|
unix_connect.o unix_listen.o unix_trigger.o unsafe.o username.o \
|
||||||
valid_hostname.o vbuf.o vbuf_print.o vstream.o vstream_popen.o \
|
valid_hostname.o vbuf.o vbuf_print.o vstream.o vstream_popen.o \
|
||||||
vstring.o vstring_vstream.o watchdog.o writable.o write_buf.o \
|
vstring.o vstring_vstream.o watchdog.o writable.o write_buf.o \
|
||||||
write_wait.o nvtable.o $(STRCASE)
|
write_wait.o nvtable.o $(STRCASE) host_port.o
|
||||||
HDRS = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
|
HDRS = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
|
||||||
connect.h ctable.h dict.h dict_db.h dict_dbm.h dict_env.h \
|
connect.h ctable.h dict.h dict_db.h dict_dbm.h dict_env.h \
|
||||||
dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \
|
dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \
|
||||||
@@ -72,7 +72,7 @@ HDRS = argv.h attr.h base64_code.h binhash.h chroot_uid.h clean_env.h \
|
|||||||
split_at.h stat_as.h stringops.h sys_defs.h timed_connect.h \
|
split_at.h stat_as.h stringops.h sys_defs.h timed_connect.h \
|
||||||
timed_wait.h trigger.h username.h valid_hostname.h vbuf.h \
|
timed_wait.h trigger.h username.h valid_hostname.h vbuf.h \
|
||||||
vbuf_print.h vstream.h vstring.h vstring_vstream.h watchdog.h \
|
vbuf_print.h vstream.h vstring.h vstring_vstream.h watchdog.h \
|
||||||
nvtable.h
|
nvtable.h host_port.h
|
||||||
TESTSRC = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
|
TESTSRC = fifo_open.c fifo_rdwr_bug.c fifo_rdonly_bug.c select_bug.c \
|
||||||
stream_test.c dup2_pass_on_exec.c
|
stream_test.c dup2_pass_on_exec.c
|
||||||
WARN = -W -Wformat -Wimplicit -Wmissing-prototypes \
|
WARN = -W -Wformat -Wimplicit -Wmissing-prototypes \
|
||||||
@@ -90,7 +90,7 @@ TESTPROG= dict_open dup2_pass_on_exec events exec_command fifo_open \
|
|||||||
vstring vstring_vstream doze select_bug stream_test mac_expand \
|
vstring vstring_vstream doze select_bug stream_test mac_expand \
|
||||||
watchdog unescape hex_quote name_mask rand_sleep sane_time ctable \
|
watchdog unescape hex_quote name_mask rand_sleep sane_time ctable \
|
||||||
inet_addr_list attr_print64 attr_scan64 base64_code attr_print0 \
|
inet_addr_list attr_print64 attr_scan64 base64_code attr_print0 \
|
||||||
attr_scan0
|
attr_scan0 host_port
|
||||||
|
|
||||||
LIB_DIR = ../../lib
|
LIB_DIR = ../../lib
|
||||||
INC_DIR = ../../include
|
INC_DIR = ../../include
|
||||||
@@ -319,6 +319,11 @@ attr_scan0: $(LIB)
|
|||||||
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
|
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
|
||||||
mv junk $@.o
|
mv junk $@.o
|
||||||
|
|
||||||
|
host_port: $(LIB)
|
||||||
|
mv $@.o junk
|
||||||
|
$(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(SYSLIBS)
|
||||||
|
mv junk $@.o
|
||||||
|
|
||||||
depend: $(MAKES)
|
depend: $(MAKES)
|
||||||
(sed '1,/^# do not edit/!d' Makefile.in; \
|
(sed '1,/^# do not edit/!d' Makefile.in; \
|
||||||
set -e; for i in [a-z][a-z0-9]*.c; do \
|
set -e; for i in [a-z][a-z0-9]*.c; do \
|
||||||
@@ -332,7 +337,7 @@ stream_test: stream_test.c $(LIB)
|
|||||||
|
|
||||||
tests: valid_hostname_test mac_expand_test dict_test unescape_test \
|
tests: valid_hostname_test mac_expand_test dict_test unescape_test \
|
||||||
hex_quote_test ctable_test inet_addr_list_test base64_code_test \
|
hex_quote_test ctable_test inet_addr_list_test base64_code_test \
|
||||||
attr_scan64_test attr_scan0_test dict_pcre_test
|
attr_scan64_test attr_scan0_test dict_pcre_test host_port_test
|
||||||
|
|
||||||
valid_hostname_test: valid_hostname valid_hostname.in valid_hostname.ref
|
valid_hostname_test: valid_hostname valid_hostname.in valid_hostname.ref
|
||||||
./valid_hostname <valid_hostname.in 2>valid_hostname.tmp
|
./valid_hostname <valid_hostname.in 2>valid_hostname.tmp
|
||||||
@@ -398,6 +403,11 @@ dict_regexp_test: dict_open dict_regexp.in dict_regexp.map dict_regexp.ref
|
|||||||
diff dict_regexp.ref dict_regexp.tmp
|
diff dict_regexp.ref dict_regexp.tmp
|
||||||
rm -f dict_regexp.tmp
|
rm -f dict_regexp.tmp
|
||||||
|
|
||||||
|
host_port_test: host_port host_port.in host_port.ref
|
||||||
|
./host_port <host_port.in >host_port.tmp 2>&1
|
||||||
|
diff host_port.ref host_port.tmp
|
||||||
|
rm -f host_port.tmp
|
||||||
|
|
||||||
# do not edit below this line - it is generated by 'make depend'
|
# do not edit below this line - it is generated by 'make depend'
|
||||||
alldig.o: alldig.c
|
alldig.o: alldig.c
|
||||||
alldig.o: sys_defs.h
|
alldig.o: sys_defs.h
|
||||||
@@ -745,6 +755,15 @@ hex_quote.o: msg.h
|
|||||||
hex_quote.o: vstring.h
|
hex_quote.o: vstring.h
|
||||||
hex_quote.o: vbuf.h
|
hex_quote.o: vbuf.h
|
||||||
hex_quote.o: hex_quote.h
|
hex_quote.o: hex_quote.h
|
||||||
|
host_port.o: host_port.c
|
||||||
|
host_port.o: sys_defs.h
|
||||||
|
host_port.o: msg.h
|
||||||
|
host_port.o: split_at.h
|
||||||
|
host_port.o: stringops.h
|
||||||
|
host_port.o: vstring.h
|
||||||
|
host_port.o: vbuf.h
|
||||||
|
host_port.o: valid_hostname.h
|
||||||
|
host_port.o: host_port.h
|
||||||
htable.o: htable.c
|
htable.o: htable.c
|
||||||
htable.o: sys_defs.h
|
htable.o: sys_defs.h
|
||||||
htable.o: mymalloc.h
|
htable.o: mymalloc.h
|
||||||
|
139
postfix/src/util/host_port.c
Normal file
139
postfix/src/util/host_port.c
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*++
|
||||||
|
/* NAME
|
||||||
|
/* host_port 3
|
||||||
|
/* SUMMARY
|
||||||
|
/* split string into host and port, destroy string
|
||||||
|
/* SYNOPSIS
|
||||||
|
/* #include <host_port.h>
|
||||||
|
/*
|
||||||
|
/* const char *host_port(string, host, port, def_service)
|
||||||
|
/* char *string;
|
||||||
|
/* char **host;
|
||||||
|
/* char **port;
|
||||||
|
/* char *def_service;
|
||||||
|
/* DESCRIPTION
|
||||||
|
/* host_port() splits a string into substrings with the host
|
||||||
|
/* name or address, and the service name or port number.
|
||||||
|
/* The input string is modified.
|
||||||
|
/* DIAGNOSTICS
|
||||||
|
/* The result is a null pointer in case of success.
|
||||||
|
/* In case of problems the result is a string pointer with
|
||||||
|
/* the problem type.
|
||||||
|
/* LICENSE
|
||||||
|
/* .ad
|
||||||
|
/* .fi
|
||||||
|
/* The Secure Mailer license must be distributed with this software.
|
||||||
|
/* AUTHOR(S)
|
||||||
|
/* Wietse Venema
|
||||||
|
/* IBM T.J. Watson Research
|
||||||
|
/* P.O. Box 704
|
||||||
|
/* Yorktown Heights, NY 10598, USA
|
||||||
|
/*--*/
|
||||||
|
|
||||||
|
/* System library. */
|
||||||
|
|
||||||
|
#include <sys_defs.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
/* Utility library. */
|
||||||
|
|
||||||
|
#include <msg.h>
|
||||||
|
#include <split_at.h>
|
||||||
|
#include <stringops.h>
|
||||||
|
#include <valid_hostname.h>
|
||||||
|
|
||||||
|
/* Global library. */
|
||||||
|
|
||||||
|
#include <host_port.h>
|
||||||
|
|
||||||
|
/* host_port - parse string into host and port, destroy string */
|
||||||
|
|
||||||
|
const char *host_port(char *buf, char **host, char **port,
|
||||||
|
char *def_service)
|
||||||
|
{
|
||||||
|
char *cp = buf;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* [host]:port, [host]:, [host].
|
||||||
|
*/
|
||||||
|
if (*cp == '[') {
|
||||||
|
*host = ++cp;
|
||||||
|
if ((cp = split_at(cp, ']')) == 0)
|
||||||
|
return ("missing \"]\"");
|
||||||
|
if (*cp && *cp++ != ':')
|
||||||
|
return ("garbage after \"]\"");
|
||||||
|
if (*cp == 0)
|
||||||
|
*port = def_service;
|
||||||
|
else
|
||||||
|
*port = cp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* [host:port], [host:]. These conflict with IPV6 address literals.
|
||||||
|
*/
|
||||||
|
#if 1
|
||||||
|
if (strchr(*host, ':')) {
|
||||||
|
msg_warn("old-style address form: [%s]", *host);
|
||||||
|
msg_warn("support for [host:port] forms will go away");
|
||||||
|
msg_warn("specify [host]:port instead");
|
||||||
|
return (host_port(buf + 1, host, port, def_service));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* host:port, host:, host.
|
||||||
|
*/
|
||||||
|
else {
|
||||||
|
*host = cp;
|
||||||
|
if ((cp = split_at_right(cp, ':')) == 0 || *cp == 0)
|
||||||
|
*port = def_service;
|
||||||
|
else
|
||||||
|
*port = cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Final sanity checks. We're still sloppy, allowing bare numerical
|
||||||
|
* network addresses instead of requiring proper [ipaddress] forms.
|
||||||
|
*/
|
||||||
|
if (!valid_hostname(*host, DONT_GRIPE)
|
||||||
|
&& !valid_hostaddr(*host, DONT_GRIPE))
|
||||||
|
return ("valid hostname or network address required");
|
||||||
|
if (ISDIGIT(**port) && !alldig(*port))
|
||||||
|
return ("garbage after numerical service");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
|
||||||
|
#include <vstream.h>
|
||||||
|
#include <vstring.h>
|
||||||
|
#include <vstring_vstream.h>
|
||||||
|
|
||||||
|
#define STR(x) vstring_str(x)
|
||||||
|
|
||||||
|
int main(int unused_argc, char **unused_argv)
|
||||||
|
{
|
||||||
|
VSTRING *in_buf = vstring_alloc(10);
|
||||||
|
VSTRING *parse_buf = vstring_alloc(10);
|
||||||
|
char *host;
|
||||||
|
char *port;
|
||||||
|
const char *err;
|
||||||
|
|
||||||
|
while (vstring_fgets_nonl(in_buf, VSTREAM_IN)) {
|
||||||
|
vstream_printf(">> %s\n", STR(in_buf));
|
||||||
|
vstream_fflush(VSTREAM_OUT);
|
||||||
|
vstring_strcpy(parse_buf, STR(in_buf));
|
||||||
|
if ((err = host_port(STR(parse_buf), &host, &port, "default-service")) != 0) {
|
||||||
|
msg_warn("%s in %s", err, STR(in_buf));
|
||||||
|
} else {
|
||||||
|
vstream_printf("host %s port %s\n", host, port);
|
||||||
|
vstream_fflush(VSTREAM_OUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vstring_free(in_buf);
|
||||||
|
vstring_free(parse_buf);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
29
postfix/src/util/host_port.h
Normal file
29
postfix/src/util/host_port.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#ifndef _HOST_PORT_H_INCLUDED_
|
||||||
|
#define _HOST_PORT_H_INCLUDED_
|
||||||
|
|
||||||
|
/*++
|
||||||
|
/* NAME
|
||||||
|
/* host_port 3h
|
||||||
|
/* SUMMARY
|
||||||
|
/* split string into host and port, destroy string
|
||||||
|
/* SYNOPSIS
|
||||||
|
/* #include <host_port.h>
|
||||||
|
/* DESCRIPTION
|
||||||
|
/* .nf
|
||||||
|
|
||||||
|
/* External interface. */
|
||||||
|
|
||||||
|
extern const char *host_port(char *, char **, char **, char *);
|
||||||
|
|
||||||
|
/* LICENSE
|
||||||
|
/* .ad
|
||||||
|
/* .fi
|
||||||
|
/* The Secure Mailer license must be distributed with this software.
|
||||||
|
/* AUTHOR(S)
|
||||||
|
/* Wietse Venema
|
||||||
|
/* IBM T.J. Watson Research
|
||||||
|
/* P.O. Box 704
|
||||||
|
/* Yorktown Heights, NY 10598, USA
|
||||||
|
/*--*/
|
||||||
|
|
||||||
|
#endif
|
12
postfix/src/util/host_port.in
Normal file
12
postfix/src/util/host_port.in
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
hhh:ppp
|
||||||
|
hhh:
|
||||||
|
hhh
|
||||||
|
[hhh]:ppp
|
||||||
|
[hhh]:
|
||||||
|
[hhh]
|
||||||
|
[hhh:ppp]
|
||||||
|
[hhh:]
|
||||||
|
hhh:1pp
|
||||||
|
[hh.]
|
||||||
|
hh.
|
||||||
|
999
|
30
postfix/src/util/host_port.ref
Normal file
30
postfix/src/util/host_port.ref
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
>> hhh:ppp
|
||||||
|
host hhh port ppp
|
||||||
|
>> hhh:
|
||||||
|
host hhh port default-service
|
||||||
|
>> hhh
|
||||||
|
host hhh port default-service
|
||||||
|
>> [hhh]:ppp
|
||||||
|
host hhh port ppp
|
||||||
|
>> [hhh]:
|
||||||
|
host hhh port default-service
|
||||||
|
>> [hhh]
|
||||||
|
host hhh port default-service
|
||||||
|
>> [hhh:ppp]
|
||||||
|
unknown: warning: old-style address form: [hhh:ppp]
|
||||||
|
unknown: warning: support for [host:port] forms will go away
|
||||||
|
unknown: warning: specify [host]:port instead
|
||||||
|
host hhh port ppp
|
||||||
|
>> [hhh:]
|
||||||
|
unknown: warning: old-style address form: [hhh:]
|
||||||
|
unknown: warning: support for [host:port] forms will go away
|
||||||
|
unknown: warning: specify [host]:port instead
|
||||||
|
host hhh port default-service
|
||||||
|
>> hhh:1pp
|
||||||
|
unknown: warning: garbage after numerical service in hhh:1pp
|
||||||
|
>> [hh.]
|
||||||
|
unknown: warning: valid hostname or network address required in [hh.]
|
||||||
|
>> hh.
|
||||||
|
unknown: warning: valid hostname or network address required in hh.
|
||||||
|
>> 999
|
||||||
|
host 999 port default-service
|
Reference in New Issue
Block a user