mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-30 13:48:06 +00:00
postfix-2.12-20141213
This commit is contained in:
parent
26a8f51271
commit
2bcd791952
@ -21013,3 +21013,77 @@ Apologies for any names omitted.
|
|||||||
|
|
||||||
Bugfix (introduced: 20141207): in new #ifdef, && should be ||.
|
Bugfix (introduced: 20141207): in new #ifdef, && should be ||.
|
||||||
File: smtpd.c.
|
File: smtpd.c.
|
||||||
|
|
||||||
|
20141210
|
||||||
|
|
||||||
|
Cleanup: the "inline" table now supports case-insensitive
|
||||||
|
search, and an iterator. File: util/dict_inline.c.
|
||||||
|
|
||||||
|
Cleanup: minuscule memory leaks in graceful degradation
|
||||||
|
after lookup table open error. Files: util/dict_inline.c,
|
||||||
|
util/dict_static.c.
|
||||||
|
|
||||||
|
20141211
|
||||||
|
|
||||||
|
Cleanup: memory leaks in unit-test driver programs (i.e.
|
||||||
|
code used only during development). Files:
|
||||||
|
cleanup/cleanup_milter.c, util/base64_code.c.
|
||||||
|
|
||||||
|
Bugfix (introduced 20141001): mac_expand() error message
|
||||||
|
with "??" due to dangling pointer. File: util/mac_expand.c.
|
||||||
|
|
||||||
|
Portability: unit-test driver programs. Files: util/myaddrinfo.c,
|
||||||
|
util/myaddrinfo.ref.
|
||||||
|
|
||||||
|
Portability: Clang support. Files: makedefs, util/sys_defs.h.
|
||||||
|
|
||||||
|
Portability: FreeBSD 10 support. Files: makedefs,
|
||||||
|
util/sys_defs.h.
|
||||||
|
|
||||||
|
Cleanup: in makedefs, the CC and WARN features are now
|
||||||
|
independent. File: makedefs.
|
||||||
|
|
||||||
|
Shut up some Clang format-string nags: util/events.c.
|
||||||
|
|
||||||
|
Cleanup: eliminated unnecessary 64->32bit (and back)
|
||||||
|
conversions on LP64 platforms. Files: util/htable.c,
|
||||||
|
util/binhash.c util/mvect.[hc], util/name_mask.c,
|
||||||
|
util/sane_time.c, util/unix_listen.c, util/unix_connect.c,
|
||||||
|
util/stringops.h, util/trimblanks.c, and dependent code in
|
||||||
|
smtpd/smtpd_token.c.
|
||||||
|
|
||||||
|
Cleanup: unused inet_proto_init() results. Files:
|
||||||
|
global/mail_params.c, postconf/postconf_builtin.c,
|
||||||
|
smtpstone/qmqp-sink.c, smtpstone/qmqp-source.c,
|
||||||
|
smtpstone/smtp-source.c/
|
||||||
|
|
||||||
|
Shut up some Clang nags about unused functions in network
|
||||||
|
interface API selection. File: util/inet_addr_local.c.
|
||||||
|
|
||||||
|
Portability: a historical compiler lacks printf-like
|
||||||
|
format-string checks for function pointers. Files: util/msg.h,
|
||||||
|
bounce/bounce_template.h.
|
||||||
|
|
||||||
|
20141212
|
||||||
|
|
||||||
|
Shut up some Clang format-string nags: util/line_number.c,
|
||||||
|
sendmail/sendmail.c, smtpd/smtpd_proxy.c, smtp/smtp_sasl_proto.c.
|
||||||
|
|
||||||
|
Cleanup: eliminated unnecessary 64->32bit (and back)
|
||||||
|
conversions on LP64 platforms. Files: dict_memcache.c,
|
||||||
|
header_body_checks.[hc], log_adhoc.c, pipe_command.c,
|
||||||
|
record.[hc], smtp_reply_footer.c, split_addr.c.
|
||||||
|
cleanup/cleanup_milter.c, master/mail_server.h,
|
||||||
|
src/master/trigger_server.c, oqmgr/qmgr.c, qmgr/qmgr.c,
|
||||||
|
pickup/pickup.c.
|
||||||
|
|
||||||
|
Cleanup: nullmx SMTP reply codes 550 and 556, and enhanced
|
||||||
|
status codes X.1.10 and X.7.27. The nullmx SMTP reply codes
|
||||||
|
are no longer configurable. Files: global/mail_params.h,
|
||||||
|
smtpd/smtpd.c, smtpd/smtpd_check.c.
|
||||||
|
|
||||||
|
Portability: default table owner UID for testing. Files:
|
||||||
|
util/dict_alloc.c, util/dict_open.c.
|
||||||
|
|
||||||
|
Shut up Clang unused assignment nag: global/mail_queue.h.
|
||||||
|
sendmail/sendmail.c, smtpd/smtpd_proxy.c, smtp/smtp_sasl_proto.c.
|
||||||
|
@ -8,6 +8,10 @@ Wish list:
|
|||||||
|
|
||||||
Things to do after the stable release:
|
Things to do after the stable release:
|
||||||
|
|
||||||
|
Inline support for pcre:{/pattern/=action, ...} and ditto
|
||||||
|
support for regexp: and cidr: tables. Factor out and reuse
|
||||||
|
code that already exists in inline: and other tables.
|
||||||
|
|
||||||
Log command=good/bad statistics in postscreen?
|
Log command=good/bad statistics in postscreen?
|
||||||
|
|
||||||
Implement smtpd_client_auth_rate limit?
|
Implement smtpd_client_auth_rate limit?
|
||||||
|
@ -14787,7 +14787,7 @@ record or 2) a malformed MX record such as a record with
|
|||||||
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
||||||
reply is specified with the <a href="postconf.5.html#unknown_address_reject_code">unknown_address_reject_code</a> parameter
|
reply is specified with the <a href="postconf.5.html#unknown_address_reject_code">unknown_address_reject_code</a> parameter
|
||||||
(default: 450), <a href="postconf.5.html#unknown_address_tempfail_action">unknown_address_tempfail_action</a> (default:
|
(default: 450), <a href="postconf.5.html#unknown_address_tempfail_action">unknown_address_tempfail_action</a> (default:
|
||||||
<a href="postconf.5.html#defer_if_permit">defer_if_permit</a>), or <a href="postconf.5.html#nullmx_reject_code">nullmx_reject_code</a> (default 556, Postfix 2.12 and
|
<a href="postconf.5.html#defer_if_permit">defer_if_permit</a>), or 556 (nullmx, Postfix 2.12 and
|
||||||
later). See the respective parameter descriptions for details.
|
later). See the respective parameter descriptions for details.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
@ -15531,7 +15531,7 @@ record, or 2) a malformed MX record such as a record with
|
|||||||
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
||||||
reply is specified with the <a href="postconf.5.html#unknown_address_reject_code">unknown_address_reject_code</a> parameter
|
reply is specified with the <a href="postconf.5.html#unknown_address_reject_code">unknown_address_reject_code</a> parameter
|
||||||
(default: 450), <a href="postconf.5.html#unknown_address_tempfail_action">unknown_address_tempfail_action</a> (default:
|
(default: 450), <a href="postconf.5.html#unknown_address_tempfail_action">unknown_address_tempfail_action</a> (default:
|
||||||
<a href="postconf.5.html#defer_if_permit">defer_if_permit</a>), or <a href="postconf.5.html#nullmx_reject_code">nullmx_reject_code</a> (default 556, Postfix 2.12 and
|
<a href="postconf.5.html#defer_if_permit">defer_if_permit</a>), or 550 (nullmx, Postfix 2.12 and
|
||||||
later). See the respective parameter descriptions for details.
|
later). See the respective parameter descriptions for details.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
|
@ -1149,13 +1149,6 @@ SMTPD(8) SMTPD(8)
|
|||||||
<a href="postconf.5.html#reject_unknown_sender_domain">reject_unknown_sender_domain</a> or <a href="postconf.5.html#reject_unknown_recipient_domain">reject_unknown_recipient_domain</a>
|
<a href="postconf.5.html#reject_unknown_sender_domain">reject_unknown_sender_domain</a> or <a href="postconf.5.html#reject_unknown_recipient_domain">reject_unknown_recipient_domain</a>
|
||||||
fail due to a temporary error condition.
|
fail due to a temporary error condition.
|
||||||
|
|
||||||
Available in Postfix version 2.12 and later:
|
|
||||||
|
|
||||||
<b><a href="postconf.5.html#nullmx_reject_code">nullmx_reject_code</a> (556)</b>
|
|
||||||
The numerical reply code when the Postfix SMTP server rejects a
|
|
||||||
sender or recipient address because its domain has a nullmx DNS
|
|
||||||
record (an MX record with an empty hostname).
|
|
||||||
|
|
||||||
<b>MISCELLANEOUS CONTROLS</b>
|
<b>MISCELLANEOUS CONTROLS</b>
|
||||||
<b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
|
<b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
|
||||||
The default location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
|
The default location of the Postfix <a href="postconf.5.html">main.cf</a> and <a href="master.5.html">master.cf</a> con-
|
||||||
|
@ -222,6 +222,15 @@ case "$SYSTEM.$RELEASE" in
|
|||||||
: ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
|
: ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
|
||||||
: ${PLUGIN_LD="${CC-gcc} -shared"}
|
: ${PLUGIN_LD="${CC-gcc} -shared"}
|
||||||
;;
|
;;
|
||||||
|
FreeBSD.10*) SYSTYPE=FREEBSD10
|
||||||
|
: ${CC=cc}
|
||||||
|
: ${SHLIB_SUFFIX=.so}
|
||||||
|
: ${SHLIB_CFLAGS=-fPIC}
|
||||||
|
: ${SHLIB_LD="${CC} -shared"' -Wl,-soname,${LIB}'}
|
||||||
|
: ${SHLIB_RPATH='-Wl,-rpath,${SHLIB_DIR}'}
|
||||||
|
: ${SHLIB_ENV="LD_LIBRARY_PATH=`pwd`/lib"}
|
||||||
|
: ${PLUGIN_LD="${CC} -shared"}
|
||||||
|
;;
|
||||||
DragonFly.*) SYSTYPE=DRAGONFLY
|
DragonFly.*) SYSTYPE=DRAGONFLY
|
||||||
;;
|
;;
|
||||||
OpenBSD.2*) SYSTYPE=OPENBSD2
|
OpenBSD.2*) SYSTYPE=OPENBSD2
|
||||||
@ -555,7 +564,6 @@ ReliantUNIX-?.5.43) SYSTYPE=ReliantUnix543
|
|||||||
# Use the native compiler by default
|
# Use the native compiler by default
|
||||||
: ${CC=cc}
|
: ${CC=cc}
|
||||||
CCARGS="$CCARGS"
|
CCARGS="$CCARGS"
|
||||||
CCWARN='$(WARN)'
|
|
||||||
# Darwin > 1.3 uses awk and flat_namespace
|
# Darwin > 1.3 uses awk and flat_namespace
|
||||||
case $RELEASE in
|
case $RELEASE in
|
||||||
1.[0-3]) AWK=gawk;;
|
1.[0-3]) AWK=gawk;;
|
||||||
@ -998,7 +1006,7 @@ esac
|
|||||||
# een burned once by a compiler that lies about what warnings it
|
# een burned once by a compiler that lies about what warnings it
|
||||||
# produces, not taking that chance again.
|
# produces, not taking that chance again.
|
||||||
|
|
||||||
: ${CC='gcc $(WARN)'} ${OPT='-O'} ${DEBUG='-g'} ${AWK=awk} \
|
: ${CC=gcc} ${OPT='-O'} ${DEBUG='-g'} ${AWK=awk} \
|
||||||
${WARN='-Wall -Wno-comment -Wformat -Wimplicit -Wmissing-prototypes \
|
${WARN='-Wall -Wno-comment -Wformat -Wimplicit -Wmissing-prototypes \
|
||||||
-Wparentheses -Wstrict-prototypes -Wswitch -Wuninitialized \
|
-Wparentheses -Wstrict-prototypes -Wswitch -Wuninitialized \
|
||||||
-Wunused -Wno-missing-braces'}
|
-Wunused -Wno-missing-braces'}
|
||||||
@ -1056,7 +1064,7 @@ _AR = $_AR
|
|||||||
ARFL = $ARFL
|
ARFL = $ARFL
|
||||||
_RANLIB = $_RANLIB
|
_RANLIB = $_RANLIB
|
||||||
SYSLIBS = $AUXLIBS $SYSLIBS $PLUGIN_AUXLIBS
|
SYSLIBS = $AUXLIBS $SYSLIBS $PLUGIN_AUXLIBS
|
||||||
CC = $CC $CCARGS $CCWARN
|
CC = $CC $CCARGS \$(WARN)
|
||||||
OPT = $OPT
|
OPT = $OPT
|
||||||
DEBUG = $DEBUG
|
DEBUG = $DEBUG
|
||||||
AWK = $AWK
|
AWK = $AWK
|
||||||
|
@ -9891,7 +9891,7 @@ a zero-length MX hostname (Postfix version 2.3 and later).
|
|||||||
The
|
The
|
||||||
reply is specified with the unknown_address_reject_code parameter
|
reply is specified with the unknown_address_reject_code parameter
|
||||||
(default: 450), unknown_address_tempfail_action (default:
|
(default: 450), unknown_address_tempfail_action (default:
|
||||||
defer_if_permit), or nullmx_reject_code (default 556, Postfix 2.12 and
|
defer_if_permit), or 556 (nullmx, Postfix 2.12 and
|
||||||
later). See the respective parameter descriptions for details.
|
later). See the respective parameter descriptions for details.
|
||||||
.br
|
.br
|
||||||
.IP "\fBreject_unlisted_recipient\fR (with Postfix version 2.0: check_recipient_maps)"
|
.IP "\fBreject_unlisted_recipient\fR (with Postfix version 2.0: check_recipient_maps)"
|
||||||
@ -10471,7 +10471,7 @@ a zero-length MX hostname (Postfix version 2.3 and later).
|
|||||||
The
|
The
|
||||||
reply is specified with the unknown_address_reject_code parameter
|
reply is specified with the unknown_address_reject_code parameter
|
||||||
(default: 450), unknown_address_tempfail_action (default:
|
(default: 450), unknown_address_tempfail_action (default:
|
||||||
defer_if_permit), or nullmx_reject_code (default 556, Postfix 2.12 and
|
defer_if_permit), or 550 (nullmx, Postfix 2.12 and
|
||||||
later). See the respective parameter descriptions for details.
|
later). See the respective parameter descriptions for details.
|
||||||
.br
|
.br
|
||||||
.IP "\fBreject_unlisted_sender\fR"
|
.IP "\fBreject_unlisted_sender\fR"
|
||||||
|
@ -1004,12 +1004,6 @@ fails due to an temporary error condition.
|
|||||||
The Postfix SMTP server's action when reject_unknown_sender_domain
|
The Postfix SMTP server's action when reject_unknown_sender_domain
|
||||||
or reject_unknown_recipient_domain fail due to a temporary error
|
or reject_unknown_recipient_domain fail due to a temporary error
|
||||||
condition.
|
condition.
|
||||||
.PP
|
|
||||||
Available in Postfix version 2.12 and later:
|
|
||||||
.IP "\fBnullmx_reject_code (556)\fR"
|
|
||||||
The numerical reply code when the Postfix SMTP server rejects
|
|
||||||
a sender or recipient address because its domain has a nullmx DNS
|
|
||||||
record (an MX record with an empty hostname).
|
|
||||||
.SH "MISCELLANEOUS CONTROLS"
|
.SH "MISCELLANEOUS CONTROLS"
|
||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
|
@ -410,7 +410,6 @@ while (<>) {
|
|||||||
s;\bno_address_mappings\b;<a href="postconf.5.html#no_address_mappings">$&</a>;g;
|
s;\bno_address_mappings\b;<a href="postconf.5.html#no_address_mappings">$&</a>;g;
|
||||||
s;\bno_header_body_checks\b;<a href="postconf.5.html#no_header_body_checks">$&</a>;g;
|
s;\bno_header_body_checks\b;<a href="postconf.5.html#no_header_body_checks">$&</a>;g;
|
||||||
s;\bno_milters\b;<a href="postconf.5.html#no_milters">$&</a>;g;
|
s;\bno_milters\b;<a href="postconf.5.html#no_milters">$&</a>;g;
|
||||||
s;\bnullmx_reject_code\b;<a href="postconf.5.html#nullmx_reject_code">$&</a>;g;
|
|
||||||
s;\brecip[-</bB>]*\n* *[<bB>]*i[-</bB>]*\n* *[<bB>]*ent_bcc_maps\b;<a href="postconf.5.html#recipient_bcc_maps">$&</a>;g;
|
s;\brecip[-</bB>]*\n* *[<bB>]*i[-</bB>]*\n* *[<bB>]*ent_bcc_maps\b;<a href="postconf.5.html#recipient_bcc_maps">$&</a>;g;
|
||||||
s;\brecip[-</bB>]*\n* *[<bB>]*i[-</bB>]*\n* *[<bB>]*ent_canoni[-</bB>]*\n* *[<bB>]*cal_classes\b;<a href="postconf.5.html#recipient_canonical_classes">$&</a>;g;
|
s;\brecip[-</bB>]*\n* *[<bB>]*i[-</bB>]*\n* *[<bB>]*ent_canoni[-</bB>]*\n* *[<bB>]*cal_classes\b;<a href="postconf.5.html#recipient_canonical_classes">$&</a>;g;
|
||||||
s;\brecip[-</bB>]*\n* *[<bB>]*i[-</bB>]*\n* *[<bB>]*ent_canoni[-</bB>]*\n* *[<bB>]*cal_maps\b;<a href="postconf.5.html#recipient_canonical_maps">$&</a>;g;
|
s;\brecip[-</bB>]*\n* *[<bB>]*i[-</bB>]*\n* *[<bB>]*ent_canoni[-</bB>]*\n* *[<bB>]*cal_maps\b;<a href="postconf.5.html#recipient_canonical_maps">$&</a>;g;
|
||||||
|
@ -6049,7 +6049,7 @@ record or 2) a malformed MX record such as a record with
|
|||||||
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
||||||
reply is specified with the unknown_address_reject_code parameter
|
reply is specified with the unknown_address_reject_code parameter
|
||||||
(default: 450), unknown_address_tempfail_action (default:
|
(default: 450), unknown_address_tempfail_action (default:
|
||||||
defer_if_permit), or nullmx_reject_code (default 556, Postfix 2.12 and
|
defer_if_permit), or 556 (nullmx, Postfix 2.12 and
|
||||||
later). See the respective parameter descriptions for details.
|
later). See the respective parameter descriptions for details.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
@ -6518,7 +6518,7 @@ record, or 2) a malformed MX record such as a record with
|
|||||||
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
a zero-length MX hostname (Postfix version 2.3 and later). <br> The
|
||||||
reply is specified with the unknown_address_reject_code parameter
|
reply is specified with the unknown_address_reject_code parameter
|
||||||
(default: 450), unknown_address_tempfail_action (default:
|
(default: 450), unknown_address_tempfail_action (default:
|
||||||
defer_if_permit), or nullmx_reject_code (default 556, Postfix 2.12 and
|
defer_if_permit), or 550 (nullmx, Postfix 2.12 and
|
||||||
later). See the respective parameter descriptions for details.
|
later). See the respective parameter descriptions for details.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ typedef struct BOUNCE_TEMPLATE {
|
|||||||
#define bounce_template_encoding(t) ((t)->mime_encoding)
|
#define bounce_template_encoding(t) ((t)->mime_encoding)
|
||||||
#define bounce_template_charset(t) ((t)->mime_charset)
|
#define bounce_template_charset(t) ((t)->mime_charset)
|
||||||
|
|
||||||
typedef int PRINTFLIKE(2, 3) (*BOUNCE_XP_PRN_FN) (VSTREAM *, const char *,...);
|
typedef int PRINTFPTRLIKE(2, 3) (*BOUNCE_XP_PRN_FN) (VSTREAM *, const char *,...);
|
||||||
typedef int (*BOUNCE_XP_PUT_FN) (VSTREAM *, const char *);
|
typedef int (*BOUNCE_XP_PUT_FN) (VSTREAM *, const char *);
|
||||||
|
|
||||||
extern BOUNCE_TEMPLATE *bounce_template_create(const BOUNCE_TEMPLATE *);
|
extern BOUNCE_TEMPLATE *bounce_template_create(const BOUNCE_TEMPLATE *);
|
||||||
|
@ -258,7 +258,7 @@ static void cleanup_milter_header_prepend(void *context, int rec_type,
|
|||||||
/* cleanup_milter_hbc_extend - additional header/body_checks actions */
|
/* cleanup_milter_hbc_extend - additional header/body_checks actions */
|
||||||
|
|
||||||
static char *cleanup_milter_hbc_extend(void *context, const char *command,
|
static char *cleanup_milter_hbc_extend(void *context, const char *command,
|
||||||
int cmd_len, const char *optional_text,
|
ssize_t cmd_len, const char *optional_text,
|
||||||
const char *where, const char *buf,
|
const char *where, const char *buf,
|
||||||
ssize_t buf_len, off_t offset)
|
ssize_t buf_len, off_t offset)
|
||||||
{
|
{
|
||||||
@ -2465,6 +2465,7 @@ int main(int unused_argc, char **argv)
|
|||||||
} else if (strcmp(argv->argv[0], "close") == 0) {
|
} else if (strcmp(argv->argv[0], "close") == 0) {
|
||||||
if (*var_milt_head_checks) {
|
if (*var_milt_head_checks) {
|
||||||
cleanup_milter_hbc_finish(state);
|
cleanup_milter_hbc_finish(state);
|
||||||
|
myfree(var_milt_head_checks);
|
||||||
var_milt_head_checks = "";
|
var_milt_head_checks = "";
|
||||||
}
|
}
|
||||||
close_queue_file(state);
|
close_queue_file(state);
|
||||||
|
@ -257,7 +257,7 @@ static int dict_memcache_del(DICT_MC *dict_mc)
|
|||||||
|
|
||||||
/* dict_memcache_prepare_key - prepare lookup key */
|
/* dict_memcache_prepare_key - prepare lookup key */
|
||||||
|
|
||||||
static int dict_memcache_prepare_key(DICT_MC *dict_mc, const char *name)
|
static ssize_t dict_memcache_prepare_key(DICT_MC *dict_mc, const char *name)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
/* void (*prepend) (void *context, int rec_type,
|
/* void (*prepend) (void *context, int rec_type,
|
||||||
/* const char *buf, ssize_t len, off_t offset);
|
/* const char *buf, ssize_t len, off_t offset);
|
||||||
/* char *(*extend) (void *context, const char *command,
|
/* char *(*extend) (void *context, const char *command,
|
||||||
/* int cmd_len, const char *cmd_args,
|
/* ssize_t cmd_len, const char *cmd_args,
|
||||||
/* const char *where, const char *line,
|
/* const char *where, const char *line,
|
||||||
/* ssize_t line_len, off_t offset);
|
/* ssize_t line_len, off_t offset);
|
||||||
/* } HBC_CALL_BACKS;
|
/* } HBC_CALL_BACKS;
|
||||||
@ -228,7 +228,7 @@ static char *hbc_action(void *context, HBC_CALL_BACKS *cb,
|
|||||||
ssize_t line_len, off_t offset)
|
ssize_t line_len, off_t offset)
|
||||||
{
|
{
|
||||||
const char *cmd_args = cmd + strcspn(cmd, " \t");
|
const char *cmd_args = cmd + strcspn(cmd, " \t");
|
||||||
int cmd_len = cmd_args - cmd;
|
ssize_t cmd_len = cmd_args - cmd;
|
||||||
char *ret;
|
char *ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -36,7 +36,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
void (*logger) (void *, const char *, const char *, const char *, const char *);
|
void (*logger) (void *, const char *, const char *, const char *, const char *);
|
||||||
void (*prepend) (void *, int, const char *, ssize_t, off_t);
|
void (*prepend) (void *, int, const char *, ssize_t, off_t);
|
||||||
char *(*extend) (void *, const char *, int, const char *, const char *, const char *, ssize_t, off_t);
|
char *(*extend) (void *, const char *, ssize_t, const char *, const char *, const char *, ssize_t, off_t);
|
||||||
} HBC_CALL_BACKS;
|
} HBC_CALL_BACKS;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -76,8 +76,8 @@
|
|||||||
* jumping back.
|
* jumping back.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int dt_sec; /* make sure it's signed */
|
long dt_sec; /* make sure it's signed */
|
||||||
int dt_usec; /* make sure it's signed */
|
long dt_usec; /* make sure it's signed */
|
||||||
} DELTA_TIME;
|
} DELTA_TIME;
|
||||||
|
|
||||||
/* log_adhoc - ad-hoc logging */
|
/* log_adhoc - ad-hoc logging */
|
||||||
|
@ -763,7 +763,6 @@ void mail_params_init()
|
|||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
const char *cp;
|
const char *cp;
|
||||||
INET_PROTO_INFO *proto_info;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extract compatibility level first, so that we can determine what
|
* Extract compatibility level first, so that we can determine what
|
||||||
@ -795,7 +794,7 @@ void mail_params_init()
|
|||||||
* What protocols should we attempt to support? The result is stored in
|
* What protocols should we attempt to support? The result is stored in
|
||||||
* the global inet_proto_table variable.
|
* the global inet_proto_table variable.
|
||||||
*/
|
*/
|
||||||
proto_info = inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
|
(void) inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Variables whose defaults are determined at runtime. Some sites use
|
* Variables whose defaults are determined at runtime. Some sites use
|
||||||
|
@ -2145,10 +2145,6 @@ extern int var_non_fqdn_code;
|
|||||||
#define DEF_UNK_ADDR_CODE 450
|
#define DEF_UNK_ADDR_CODE 450
|
||||||
extern int var_unk_addr_code;
|
extern int var_unk_addr_code;
|
||||||
|
|
||||||
#define VAR_NULLMX_RCODE "nullmx_reject_code"
|
|
||||||
#define DEF_NULLMX_RCODE 556
|
|
||||||
extern int var_nullmx_rcode;
|
|
||||||
|
|
||||||
#define VAR_UNK_ADDR_TF_ACT "unknown_address_tempfail_action"
|
#define VAR_UNK_ADDR_TF_ACT "unknown_address_tempfail_action"
|
||||||
#define DEF_UNK_ADDR_TF_ACT "$" VAR_REJECT_TMPF_ACT
|
#define DEF_UNK_ADDR_TF_ACT "$" VAR_REJECT_TMPF_ACT
|
||||||
extern char *var_unk_addr_tf_act;
|
extern char *var_unk_addr_tf_act;
|
||||||
|
@ -118,6 +118,7 @@ int main(void)
|
|||||||
argv_free(argv);
|
argv_free(argv);
|
||||||
vstream_fflush(VSTREAM_OUT);
|
vstream_fflush(VSTREAM_OUT);
|
||||||
}
|
}
|
||||||
|
vstring_free(vp);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,6 +143,8 @@ extern int mail_queue_id_ok(const char *);
|
|||||||
unsigned long _us_val; \
|
unsigned long _us_val; \
|
||||||
vstring_strncpy((bp), (zp) - MQID_LG_USEC_PAD, MQID_LG_USEC_PAD); \
|
vstring_strncpy((bp), (zp) - MQID_LG_USEC_PAD, MQID_LG_USEC_PAD); \
|
||||||
MQID_LG_DECODE_USEC(STR(bp), _us_val, _error); \
|
MQID_LG_DECODE_USEC(STR(bp), _us_val, _error); \
|
||||||
|
if (_error) \
|
||||||
|
_us_val = 0; \
|
||||||
(void) MQID_SH_ENCODE_USEC((bp), _us_val); \
|
(void) MQID_SH_ENCODE_USEC((bp), _us_val); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
* Patches change both the patchlevel and the release date. Snapshots have no
|
* Patches change both the patchlevel and the release date. Snapshots have no
|
||||||
* patchlevel; they change the release date only.
|
* patchlevel; they change the release date only.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20141208"
|
#define MAIL_RELEASE_DATE "20141213"
|
||||||
#define MAIL_VERSION_NUMBER "2.12"
|
#define MAIL_VERSION_NUMBER "2.12"
|
||||||
|
|
||||||
#ifdef SNAPSHOT
|
#ifdef SNAPSHOT
|
||||||
|
@ -393,7 +393,7 @@ int pipe_command(VSTREAM *src, DSN_BUF *why,...)
|
|||||||
VSTREAM *cmd_in_stream;
|
VSTREAM *cmd_in_stream;
|
||||||
VSTREAM *cmd_out_stream;
|
VSTREAM *cmd_out_stream;
|
||||||
char log_buf[VSTREAM_BUFSIZE + 1];
|
char log_buf[VSTREAM_BUFSIZE + 1];
|
||||||
int log_len;
|
ssize_t log_len;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int write_status;
|
int write_status;
|
||||||
int write_errno;
|
int write_errno;
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
/* int rec_pad(stream, type, len)
|
/* int rec_pad(stream, type, len)
|
||||||
/* VSTREAM *stream;
|
/* VSTREAM *stream;
|
||||||
/* int type;
|
/* int type;
|
||||||
/* int len;
|
/* ssize_t len;
|
||||||
/*
|
/*
|
||||||
/* REC_SPACE_NEED(buflen, reclen)
|
/* REC_SPACE_NEED(buflen, reclen)
|
||||||
/* ssize_t buflen;
|
/* ssize_t buflen;
|
||||||
@ -398,7 +398,7 @@ int rec_fputs(VSTREAM *stream, int type, const char *str)
|
|||||||
|
|
||||||
/* rec_pad - write padding record */
|
/* rec_pad - write padding record */
|
||||||
|
|
||||||
int rec_pad(VSTREAM *stream, int type, int len)
|
int rec_pad(VSTREAM *stream, int type, ssize_t len)
|
||||||
{
|
{
|
||||||
int width = len - 2; /* type + length */
|
int width = len - 2; /* type + length */
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ extern int rec_put_type(VSTREAM *, int, off_t);
|
|||||||
extern int PRINTFLIKE(3, 4) rec_fprintf(VSTREAM *, int, const char *,...);
|
extern int PRINTFLIKE(3, 4) rec_fprintf(VSTREAM *, int, const char *,...);
|
||||||
extern int rec_fputs(VSTREAM *, int, const char *);
|
extern int rec_fputs(VSTREAM *, int, const char *);
|
||||||
extern int rec_goto(VSTREAM *, const char *);
|
extern int rec_goto(VSTREAM *, const char *);
|
||||||
extern int rec_pad(VSTREAM *, int, int);
|
extern int rec_pad(VSTREAM *, int, ssize_t);
|
||||||
|
|
||||||
#define REC_PUT_BUF(v, t, b) rec_put((v), (t), vstring_str(b), VSTRING_LEN(b))
|
#define REC_PUT_BUF(v, t, b) rec_put((v), (t), vstring_str(b), VSTRING_LEN(b))
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ int smtp_reply_footer(VSTRING *buffer, ssize_t start,
|
|||||||
char *end;
|
char *end;
|
||||||
ssize_t dsn_len;
|
ssize_t dsn_len;
|
||||||
int crlf_at_end = 0;
|
int crlf_at_end = 0;
|
||||||
int reply_patch_undo_offs = -1;
|
ssize_t reply_patch_undo_offs = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity check.
|
* Sanity check.
|
||||||
@ -158,7 +158,7 @@ int smtp_reply_footer(VSTRING *buffer, ssize_t start,
|
|||||||
/* Append a clone of the optional enhanced status code. */
|
/* Append a clone of the optional enhanced status code. */
|
||||||
if (dsn_len > 0) {
|
if (dsn_len > 0) {
|
||||||
VSTRING_SPACE(buffer, dsn_len);
|
VSTRING_SPACE(buffer, dsn_len);
|
||||||
vstring_strncat(buffer, STR(buffer) + start + 4, (int) dsn_len);
|
vstring_strncat(buffer, STR(buffer) + start + 4, dsn_len);
|
||||||
vstring_strcat(buffer, " ");
|
vstring_strcat(buffer, " ");
|
||||||
}
|
}
|
||||||
reply_patch_undo_offs = -1;
|
reply_patch_undo_offs = -1;
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
char *split_addr(char *localpart, const char *delimiter_set)
|
char *split_addr(char *localpart, const char *delimiter_set)
|
||||||
{
|
{
|
||||||
int len;
|
ssize_t len;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't split these, regardless of what the delimiter is.
|
* Don't split these, regardless of what the delimiter is.
|
||||||
|
@ -151,9 +151,9 @@ VSTRING *uxtext_unquote_append(VSTRING *unquoted, const char *quoted)
|
|||||||
|
|
||||||
for (cp = (const unsigned char *) quoted; (ch = *cp) != 0; cp++) {
|
for (cp = (const unsigned char *) quoted; (ch = *cp) != 0; cp++) {
|
||||||
if (ch == '\\' && cp[1] == 'x' && cp[2] == '{') {
|
if (ch == '\\' && cp[1] == 'x' && cp[2] == '{') {
|
||||||
cp += 2;
|
|
||||||
int unicode = 0;
|
int unicode = 0;
|
||||||
|
|
||||||
|
cp += 2;
|
||||||
while ((ch = *++cp) != '}') {
|
while ((ch = *++cp) != '}') {
|
||||||
if (ISDIGIT(ch))
|
if (ISDIGIT(ch))
|
||||||
unicode = (unicode << 4) + (ch - '0');
|
unicode = (unicode << 4) + (ch - '0');
|
||||||
|
@ -72,7 +72,7 @@ extern int event_server_drain(void);
|
|||||||
/*
|
/*
|
||||||
* trigger_server.c
|
* trigger_server.c
|
||||||
*/
|
*/
|
||||||
typedef void (*TRIGGER_SERVER_FN) (char *, int, char *, char **);
|
typedef void (*TRIGGER_SERVER_FN) (char *, ssize_t, char *, char **);
|
||||||
extern NORETURN trigger_server_main(int, char **, TRIGGER_SERVER_FN,...);
|
extern NORETURN trigger_server_main(int, char **, TRIGGER_SERVER_FN,...);
|
||||||
|
|
||||||
#define TRIGGER_BUF_SIZE 1024
|
#define TRIGGER_BUF_SIZE 1024
|
||||||
|
@ -263,7 +263,7 @@ static void trigger_server_timeout(int unused_event, void *unused_context)
|
|||||||
static void trigger_server_wakeup(int fd)
|
static void trigger_server_wakeup(int fd)
|
||||||
{
|
{
|
||||||
char buf[TRIGGER_BUF_SIZE];
|
char buf[TRIGGER_BUF_SIZE];
|
||||||
int len;
|
ssize_t len;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Commit suicide when the master process disconnected from us. Don't
|
* Commit suicide when the master process disconnected from us. Don't
|
||||||
@ -423,7 +423,7 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
|
|||||||
MAIL_SERVER_LOOP_FN loop = 0;
|
MAIL_SERVER_LOOP_FN loop = 0;
|
||||||
int key;
|
int key;
|
||||||
char buf[TRIGGER_BUF_SIZE];
|
char buf[TRIGGER_BUF_SIZE];
|
||||||
int len;
|
ssize_t len;
|
||||||
char *transport = 0;
|
char *transport = 0;
|
||||||
char *lock_path;
|
char *lock_path;
|
||||||
VSTRING *why;
|
VSTRING *why;
|
||||||
|
@ -413,7 +413,7 @@ static void qmgr_deferred_run_event(int unused_event, void *dummy)
|
|||||||
|
|
||||||
/* qmgr_trigger_event - respond to external trigger(s) */
|
/* qmgr_trigger_event - respond to external trigger(s) */
|
||||||
|
|
||||||
static void qmgr_trigger_event(char *buf, int len,
|
static void qmgr_trigger_event(char *buf, ssize_t len,
|
||||||
char *unused_service, char **argv)
|
char *unused_service, char **argv)
|
||||||
{
|
{
|
||||||
int incoming_flag = 0;
|
int incoming_flag = 0;
|
||||||
@ -477,7 +477,7 @@ static void qmgr_trigger_event(char *buf, int len,
|
|||||||
static int qmgr_loop(char *unused_name, char **unused_argv)
|
static int qmgr_loop(char *unused_name, char **unused_argv)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
int token_count;
|
ssize_t token_count;
|
||||||
int feed = 0;
|
int feed = 0;
|
||||||
int scan_idx; /* Priority order scan index */
|
int scan_idx; /* Priority order scan index */
|
||||||
static int first_scan_idx = QMGR_SCAN_IDX_INCOMING;
|
static int first_scan_idx = QMGR_SCAN_IDX_INCOMING;
|
||||||
|
@ -509,7 +509,7 @@ static void pickup_free(PICKUP_INFO *info)
|
|||||||
|
|
||||||
/* pickup_service - service client */
|
/* pickup_service - service client */
|
||||||
|
|
||||||
static void pickup_service(char *unused_buf, int unused_len,
|
static void pickup_service(char *unused_buf, ssize_t unused_len,
|
||||||
char *unused_service, char **argv)
|
char *unused_service, char **argv)
|
||||||
{
|
{
|
||||||
SCAN_DIR *scan;
|
SCAN_DIR *scan;
|
||||||
|
@ -237,7 +237,6 @@ static const char *pcf_check_mydomainname(void)
|
|||||||
static const char *pcf_mynetworks(void)
|
static const char *pcf_mynetworks(void)
|
||||||
{
|
{
|
||||||
static const char *networks;
|
static const char *networks;
|
||||||
INET_PROTO_INFO *proto_info;
|
|
||||||
const char *junk;
|
const char *junk;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -269,7 +268,7 @@ static const char *pcf_mynetworks(void)
|
|||||||
DEF_INET_PROTOCOLS,
|
DEF_INET_PROTOCOLS,
|
||||||
(PCF_MASTER_ENT *) 0);
|
(PCF_MASTER_ENT *) 0);
|
||||||
var_inet_protocols = mystrdup(junk);
|
var_inet_protocols = mystrdup(junk);
|
||||||
proto_info = inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
|
(void) inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
|
||||||
}
|
}
|
||||||
return (networks = mystrdup(mynetworks()));
|
return (networks = mystrdup(mynetworks()));
|
||||||
}
|
}
|
||||||
|
@ -501,11 +501,11 @@ int main(int argc, char **argv)
|
|||||||
* effect.
|
* effect.
|
||||||
*/
|
*/
|
||||||
if (var_compat_level < CUR_COMPAT_LEVEL) {
|
if (var_compat_level < CUR_COMPAT_LEVEL) {
|
||||||
msg_warn("Postfix is running with backwards-compatible default "
|
msg_info("Postfix is running with backwards-compatible default "
|
||||||
"settings");
|
"settings");
|
||||||
msg_warn("See http://www.postfix.org/COMPATIBILITY_README.html "
|
msg_info("See http://www.postfix.org/COMPATIBILITY_README.html "
|
||||||
"for details");
|
"for details");
|
||||||
msg_warn("To disable backwards compatibility use \"postconf "
|
msg_info("To disable backwards compatibility use \"postconf "
|
||||||
VAR_COMPAT_LEVEL "=%d\" and \"postfix reload\"",
|
VAR_COMPAT_LEVEL "=%d\" and \"postfix reload\"",
|
||||||
CUR_COMPAT_LEVEL);
|
CUR_COMPAT_LEVEL);
|
||||||
}
|
}
|
||||||
|
@ -473,7 +473,7 @@ static void qmgr_deferred_run_event(int unused_event, void *dummy)
|
|||||||
|
|
||||||
/* qmgr_trigger_event - respond to external trigger(s) */
|
/* qmgr_trigger_event - respond to external trigger(s) */
|
||||||
|
|
||||||
static void qmgr_trigger_event(char *buf, int len,
|
static void qmgr_trigger_event(char *buf, ssize_t len,
|
||||||
char *unused_service, char **argv)
|
char *unused_service, char **argv)
|
||||||
{
|
{
|
||||||
int incoming_flag = 0;
|
int incoming_flag = 0;
|
||||||
@ -537,7 +537,7 @@ static void qmgr_trigger_event(char *buf, int len,
|
|||||||
static int qmgr_loop(char *unused_name, char **unused_argv)
|
static int qmgr_loop(char *unused_name, char **unused_argv)
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
int token_count;
|
ssize_t token_count;
|
||||||
int feed = 0;
|
int feed = 0;
|
||||||
int scan_idx; /* Priority order scan index */
|
int scan_idx; /* Priority order scan index */
|
||||||
static int first_scan_idx = QMGR_SCAN_IDX_INCOMING;
|
static int first_scan_idx = QMGR_SCAN_IDX_INCOMING;
|
||||||
|
@ -900,7 +900,7 @@ static void enqueue(const int flags, const char *encoding,
|
|||||||
if (rcpt_count == 0)
|
if (rcpt_count == 0)
|
||||||
msg_fatal_status(EX_USAGE, (flags & SM_FLAG_XRCPT) ?
|
msg_fatal_status(EX_USAGE, (flags & SM_FLAG_XRCPT) ?
|
||||||
"%s(%ld): No recipient addresses found in message header" :
|
"%s(%ld): No recipient addresses found in message header" :
|
||||||
"Recipient addresses must be specified on"
|
"%s(%ld): Recipient addresses must be specified on"
|
||||||
" the command line or via the -t option",
|
" the command line or via the -t option",
|
||||||
saved_sender, (long) uid);
|
saved_sender, (long) uid);
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ void smtp_sasl_helo_auth(SMTP_SESSION *session, const char *words)
|
|||||||
session->sasl_mechanism_list = mystrdup(mech_list);
|
session->sasl_mechanism_list = mystrdup(mech_list);
|
||||||
} else {
|
} else {
|
||||||
msg_warn(*words ? "%s offered no supported AUTH mechanisms: '%s'" :
|
msg_warn(*words ? "%s offered no supported AUTH mechanisms: '%s'" :
|
||||||
"%s offered null AUTH mechanism list",
|
"%s offered null AUTH mechanism list%s",
|
||||||
session->namaddrport, words);
|
session->namaddrport, words);
|
||||||
}
|
}
|
||||||
session->features |= SMTP_FEATURE_AUTH;
|
session->features |= SMTP_FEATURE_AUTH;
|
||||||
|
@ -948,12 +948,6 @@
|
|||||||
/* The Postfix SMTP server's action when reject_unknown_sender_domain
|
/* The Postfix SMTP server's action when reject_unknown_sender_domain
|
||||||
/* or reject_unknown_recipient_domain fail due to a temporary error
|
/* or reject_unknown_recipient_domain fail due to a temporary error
|
||||||
/* condition.
|
/* condition.
|
||||||
/* .PP
|
|
||||||
/* Available in Postfix version 2.12 and later:
|
|
||||||
/* .IP "\fBnullmx_reject_code (556)\fR"
|
|
||||||
/* The numerical reply code when the Postfix SMTP server rejects
|
|
||||||
/* a sender or recipient address because its domain has a nullmx DNS
|
|
||||||
/* record (an MX record with an empty hostname).
|
|
||||||
/* MISCELLANEOUS CONTROLS
|
/* MISCELLANEOUS CONTROLS
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
@ -1328,7 +1322,6 @@ char *var_smtpd_tls_eckey_file;
|
|||||||
|
|
||||||
bool var_smtpd_peername_lookup;
|
bool var_smtpd_peername_lookup;
|
||||||
int var_plaintext_code;
|
int var_plaintext_code;
|
||||||
int var_nullmx_rcode;
|
|
||||||
bool var_smtpd_delay_open;
|
bool var_smtpd_delay_open;
|
||||||
char *var_smtpd_milters;
|
char *var_smtpd_milters;
|
||||||
int var_milt_conn_time;
|
int var_milt_conn_time;
|
||||||
@ -5542,7 +5535,6 @@ int main(int argc, char **argv)
|
|||||||
VAR_VIRT_MAILBOX_CODE, DEF_VIRT_MAILBOX_CODE, &var_virt_mailbox_code, 0, 0,
|
VAR_VIRT_MAILBOX_CODE, DEF_VIRT_MAILBOX_CODE, &var_virt_mailbox_code, 0, 0,
|
||||||
VAR_RELAY_RCPT_CODE, DEF_RELAY_RCPT_CODE, &var_relay_rcpt_code, 0, 0,
|
VAR_RELAY_RCPT_CODE, DEF_RELAY_RCPT_CODE, &var_relay_rcpt_code, 0, 0,
|
||||||
VAR_PLAINTEXT_CODE, DEF_PLAINTEXT_CODE, &var_plaintext_code, 0, 0,
|
VAR_PLAINTEXT_CODE, DEF_PLAINTEXT_CODE, &var_plaintext_code, 0, 0,
|
||||||
VAR_NULLMX_RCODE, DEF_NULLMX_RCODE, &var_nullmx_rcode, 0, 0,
|
|
||||||
VAR_SMTPD_CRATE_LIMIT, DEF_SMTPD_CRATE_LIMIT, &var_smtpd_crate_limit, 0, 0,
|
VAR_SMTPD_CRATE_LIMIT, DEF_SMTPD_CRATE_LIMIT, &var_smtpd_crate_limit, 0, 0,
|
||||||
VAR_SMTPD_CCONN_LIMIT, DEF_SMTPD_CCONN_LIMIT, &var_smtpd_cconn_limit, 0, 0,
|
VAR_SMTPD_CCONN_LIMIT, DEF_SMTPD_CCONN_LIMIT, &var_smtpd_cconn_limit, 0, 0,
|
||||||
VAR_SMTPD_CMAIL_LIMIT, DEF_SMTPD_CMAIL_LIMIT, &var_smtpd_cmail_limit, 0, 0,
|
VAR_SMTPD_CMAIL_LIMIT, DEF_SMTPD_CMAIL_LIMIT, &var_smtpd_cmail_limit, 0, 0,
|
||||||
|
@ -1441,9 +1441,10 @@ static int reject_unknown_mailhost(SMTPD_STATE *state, const char *name,
|
|||||||
}
|
}
|
||||||
if (dns_status == DNS_NULLMX)
|
if (dns_status == DNS_NULLMX)
|
||||||
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
|
return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
|
||||||
var_nullmx_rcode,
|
|
||||||
strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
|
strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
|
||||||
"4.7.0" : "4.1.0",
|
550 : 556,
|
||||||
|
strcmp(reply_class, SMTPD_NAME_SENDER) == 0 ?
|
||||||
|
"4.7.27" : "4.1.10",
|
||||||
"<%s>: %s rejected: Domain %s "
|
"<%s>: %s rejected: Domain %s "
|
||||||
"does not accept mail (nullMX)",
|
"does not accept mail (nullMX)",
|
||||||
reply_name, reply_class, name));
|
reply_name, reply_class, name));
|
||||||
@ -5586,7 +5587,6 @@ int var_smtpd_rej_unl_rcpt;
|
|||||||
int var_plaintext_code;
|
int var_plaintext_code;
|
||||||
bool var_smtpd_peername_lookup;
|
bool var_smtpd_peername_lookup;
|
||||||
bool var_smtpd_client_port_log;
|
bool var_smtpd_client_port_log;
|
||||||
int var_nullmx_rcode;
|
|
||||||
char *var_smtpd_dns_re_filter;
|
char *var_smtpd_dns_re_filter;
|
||||||
|
|
||||||
#define int_table test_int_table
|
#define int_table test_int_table
|
||||||
@ -5622,7 +5622,6 @@ static const INT_TABLE int_table[] = {
|
|||||||
VAR_PLAINTEXT_CODE, DEF_PLAINTEXT_CODE, &var_plaintext_code,
|
VAR_PLAINTEXT_CODE, DEF_PLAINTEXT_CODE, &var_plaintext_code,
|
||||||
VAR_SMTPD_PEERNAME_LOOKUP, DEF_SMTPD_PEERNAME_LOOKUP, &var_smtpd_peername_lookup,
|
VAR_SMTPD_PEERNAME_LOOKUP, DEF_SMTPD_PEERNAME_LOOKUP, &var_smtpd_peername_lookup,
|
||||||
VAR_SMTPD_CLIENT_PORT_LOG, DEF_SMTPD_CLIENT_PORT_LOG, &var_smtpd_client_port_log,
|
VAR_SMTPD_CLIENT_PORT_LOG, DEF_SMTPD_CLIENT_PORT_LOG, &var_smtpd_client_port_log,
|
||||||
VAR_NULLMX_RCODE, DEF_NULLMX_RCODE, &var_nullmx_rcode,
|
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,8 +83,8 @@ OK
|
|||||||
OK
|
OK
|
||||||
>>> # EXPECT reject (nullmx is not filtered).
|
>>> # EXPECT reject (nullmx is not filtered).
|
||||||
>>> mail user@nullmx.porcupine.org
|
>>> mail user@nullmx.porcupine.org
|
||||||
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 556 5.7.0 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<user@nullmx.porcupine.org> proto=SMTP helo=<localhost>
|
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 550 5.7.27 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<user@nullmx.porcupine.org> proto=SMTP helo=<localhost>
|
||||||
556 5.7.0 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
550 5.7.27 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
||||||
>>> # EXPECT reject (nxdomain is not filtered).
|
>>> # EXPECT reject (nxdomain is not filtered).
|
||||||
>>> mail user@nxdomain.porcupine.org
|
>>> mail user@nxdomain.porcupine.org
|
||||||
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 450 4.1.8 <user@nxdomain.porcupine.org>: Sender address rejected: Domain not found; from=<user@nxdomain.porcupine.org> proto=SMTP helo=<localhost>
|
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 450 4.1.8 <user@nxdomain.porcupine.org>: Sender address rejected: Domain not found; from=<user@nxdomain.porcupine.org> proto=SMTP helo=<localhost>
|
||||||
@ -114,8 +114,8 @@ OK
|
|||||||
450 4.1.8 <user@xn--1xa.porcupine.org>: Sender address rejected: Domain not found
|
450 4.1.8 <user@xn--1xa.porcupine.org>: Sender address rejected: Domain not found
|
||||||
>>> # EXPECT reject (nullmx is not filtered).
|
>>> # EXPECT reject (nullmx is not filtered).
|
||||||
>>> mail user@nullmx.porcupine.org
|
>>> mail user@nullmx.porcupine.org
|
||||||
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 556 5.7.0 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<user@nullmx.porcupine.org> proto=SMTP helo=<localhost>
|
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 550 5.7.27 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<user@nullmx.porcupine.org> proto=SMTP helo=<localhost>
|
||||||
556 5.7.0 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
550 5.7.27 <user@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
||||||
>>> # EXPECT reject (nxdomain is not filtered).
|
>>> # EXPECT reject (nxdomain is not filtered).
|
||||||
>>> mail user@nxdomain.porcupine.org
|
>>> mail user@nxdomain.porcupine.org
|
||||||
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 450 4.1.8 <user@nxdomain.porcupine.org>: Sender address rejected: Domain not found; from=<user@nxdomain.porcupine.org> proto=SMTP helo=<localhost>
|
./smtpd_check: <queue id>: reject: MAIL from localhost[127.0.0.1]: 450 4.1.8 <user@nxdomain.porcupine.org>: Sender address rejected: Domain not found; from=<user@nxdomain.porcupine.org> proto=SMTP helo=<localhost>
|
||||||
|
@ -46,8 +46,8 @@ OK
|
|||||||
./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 450 4.1.8 <sname@nxdomain.porcupine.org>: Sender address rejected: Domain not found; from=<sname@nxdomain.porcupine.org> proto=SMTP helo=<spike.porcupine.org>
|
./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 450 4.1.8 <sname@nxdomain.porcupine.org>: Sender address rejected: Domain not found; from=<sname@nxdomain.porcupine.org> proto=SMTP helo=<spike.porcupine.org>
|
||||||
450 4.1.8 <sname@nxdomain.porcupine.org>: Sender address rejected: Domain not found
|
450 4.1.8 <sname@nxdomain.porcupine.org>: Sender address rejected: Domain not found
|
||||||
>>> mail sname@nullmx.porcupine.org
|
>>> mail sname@nullmx.porcupine.org
|
||||||
./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 556 5.7.0 <sname@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<sname@nullmx.porcupine.org> proto=SMTP helo=<spike.porcupine.org>
|
./smtpd_check: <queue id>: reject: MAIL from spike.porcupine.org[168.100.189.2]: 550 5.7.27 <sname@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<sname@nullmx.porcupine.org> proto=SMTP helo=<spike.porcupine.org>
|
||||||
556 5.7.0 <sname@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
550 5.7.27 <sname@nullmx.porcupine.org>: Sender address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
||||||
>>> mail sname@spike.porcupine.org
|
>>> mail sname@spike.porcupine.org
|
||||||
OK
|
OK
|
||||||
>>> #
|
>>> #
|
||||||
@ -75,8 +75,8 @@ OK
|
|||||||
>>> relay_domains nullmx.porcupine.org
|
>>> relay_domains nullmx.porcupine.org
|
||||||
OK
|
OK
|
||||||
>>> rcpt rname@nullmx.porcupine.org
|
>>> rcpt rname@nullmx.porcupine.org
|
||||||
./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 556 5.1.0 <rname@nullmx.porcupine.org>: Recipient address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<sname@sdomain> to=<rname@nullmx.porcupine.org> proto=SMTP helo=<spike.porcupine.org>
|
./smtpd_check: <queue id>: reject: RCPT from spike.porcupine.org[168.100.189.2]: 556 5.1.10 <rname@nullmx.porcupine.org>: Recipient address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX); from=<sname@sdomain> to=<rname@nullmx.porcupine.org> proto=SMTP helo=<spike.porcupine.org>
|
||||||
556 5.1.0 <rname@nullmx.porcupine.org>: Recipient address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
556 5.1.10 <rname@nullmx.porcupine.org>: Recipient address rejected: Domain nullmx.porcupine.org does not accept mail (nullMX)
|
||||||
>>> relay_domains spike.porcupine.org
|
>>> relay_domains spike.porcupine.org
|
||||||
OK
|
OK
|
||||||
>>> rcpt rname@spike.porcupine.org
|
>>> rcpt rname@spike.porcupine.org
|
||||||
|
@ -202,7 +202,6 @@
|
|||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <rec_type.h>
|
#include <rec_type.h>
|
||||||
#include <mail_proto.h>
|
#include <mail_proto.h>
|
||||||
#include <mail_params.h> /* null_format_string */
|
|
||||||
#include <xtext.h>
|
#include <xtext.h>
|
||||||
#include <record.h>
|
#include <record.h>
|
||||||
#include <mail_queue.h>
|
#include <mail_queue.h>
|
||||||
@ -241,7 +240,6 @@ static int smtpd_proxy_rec_put(VSTREAM *, int, const char *, ssize_t);
|
|||||||
*/
|
*/
|
||||||
#define STR(x) vstring_str(x)
|
#define STR(x) vstring_str(x)
|
||||||
#define LEN(x) VSTRING_LEN(x)
|
#define LEN(x) VSTRING_LEN(x)
|
||||||
#define SMTPD_PROXY_CONN_FMT null_format_string
|
|
||||||
#define STREQ(x, y) (strcmp((x), (y)) == 0)
|
#define STREQ(x, y) (strcmp((x), (y)) == 0)
|
||||||
|
|
||||||
/* smtpd_proxy_xforward_flush - flush forwarding information */
|
/* smtpd_proxy_xforward_flush - flush forwarding information */
|
||||||
@ -364,7 +362,7 @@ static int smtpd_proxy_connect(SMTPD_STATE *state)
|
|||||||
* back a negative greeting banner: the proxy open is delayed to the
|
* back a negative greeting banner: the proxy open is delayed to the
|
||||||
* point that the client expects a MAIL FROM or RCPT TO reply.
|
* point that the client expects a MAIL FROM or RCPT TO reply.
|
||||||
*/
|
*/
|
||||||
if (smtpd_proxy_cmd(state, SMTPD_PROX_WANT_OK, SMTPD_PROXY_CONN_FMT)) {
|
if (smtpd_proxy_cmd(state, SMTPD_PROX_WANT_OK, "%s", "")) {
|
||||||
smtpd_proxy_fake_server_reply(state, CLEANUP_STAT_PROXY);
|
smtpd_proxy_fake_server_reply(state, CLEANUP_STAT_PROXY);
|
||||||
smtpd_proxy_close(state);
|
smtpd_proxy_close(state);
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -627,8 +625,7 @@ static int smtpd_proxy_replay_send(SMTPD_STATE *state)
|
|||||||
case REC_TYPE_FROM:
|
case REC_TYPE_FROM:
|
||||||
if (expect == SMTPD_PROX_WANT_BAD)
|
if (expect == SMTPD_PROX_WANT_BAD)
|
||||||
msg_panic("%s: missing server reply type", myname);
|
msg_panic("%s: missing server reply type", myname);
|
||||||
if (smtpd_proxy_cmd(state, expect, *STR(replay_buf) ? "%s" :
|
if (smtpd_proxy_cmd(state, expect, "%s", STR(replay_buf)) < 0)
|
||||||
SMTPD_PROXY_CONN_FMT, STR(replay_buf)) < 0)
|
|
||||||
return (-1);
|
return (-1);
|
||||||
expect = SMTPD_PROX_WANT_BAD;
|
expect = SMTPD_PROX_WANT_BAD;
|
||||||
break;
|
break;
|
||||||
@ -672,11 +669,8 @@ static int PRINTFLIKE(3, 4) smtpd_proxy_save_cmd(SMTPD_STATE *state, int expect,
|
|||||||
/*
|
/*
|
||||||
* The command can be omitted at the start of an SMTP session. This is
|
* The command can be omitted at the start of an SMTP session. This is
|
||||||
* not documented as part of the official interface because it is used
|
* not documented as part of the official interface because it is used
|
||||||
* only internally to this module. Use an explicit null string in case
|
* only internally to this module.
|
||||||
* the SMTPD_PROXY_CONN_FMT implementation details change.
|
|
||||||
*/
|
*/
|
||||||
if (fmt == SMTPD_PROXY_CONN_FMT)
|
|
||||||
fmt = "";
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save the command to the replay log, and send it to the before-queue
|
* Save the command to the replay log, and send it to the before-queue
|
||||||
@ -712,19 +706,19 @@ static int smtpd_proxy_cmd(SMTPD_STATE *state, int expect, const char *fmt,...)
|
|||||||
return (smtpd_proxy_rdwr_error(state, err));
|
return (smtpd_proxy_rdwr_error(state, err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format the command.
|
||||||
|
*/
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vstring_vsprintf(proxy->request, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The command can be omitted at the start of an SMTP session. This is
|
* The command can be omitted at the start of an SMTP session. This is
|
||||||
* not documented as part of the official interface because it is used
|
* not documented as part of the official interface because it is used
|
||||||
* only internally to this module.
|
* only internally to this module.
|
||||||
*/
|
*/
|
||||||
if (fmt != SMTPD_PROXY_CONN_FMT) {
|
if (LEN(proxy->request) > 0) {
|
||||||
|
|
||||||
/*
|
|
||||||
* Format the command.
|
|
||||||
*/
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vstring_vsprintf(proxy->request, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Optionally log the command first, so that we can see in the log
|
* Optionally log the command first, so that we can see in the log
|
||||||
@ -807,7 +801,7 @@ static int smtpd_proxy_cmd(SMTPD_STATE *state, int expect, const char *fmt,...)
|
|||||||
*/
|
*/
|
||||||
if (expect != SMTPD_PROX_WANT_ANY && expect != *STR(proxy->reply)) {
|
if (expect != SMTPD_PROX_WANT_ANY && expect != *STR(proxy->reply)) {
|
||||||
msg_warn("proxy %s rejected \"%s\": \"%s\"",
|
msg_warn("proxy %s rejected \"%s\": \"%s\"",
|
||||||
proxy->service_name, fmt == SMTPD_PROXY_CONN_FMT ?
|
proxy->service_name, LEN(proxy->request) == 0 ?
|
||||||
"connection request" : STR(proxy->request),
|
"connection request" : STR(proxy->request),
|
||||||
STR(proxy->reply));
|
STR(proxy->reply));
|
||||||
if (*STR(proxy->reply) == SMTPD_PROX_WANT_OK
|
if (*STR(proxy->reply) == SMTPD_PROX_WANT_OK
|
||||||
|
@ -161,7 +161,7 @@ static char *smtp_next_token(char *cp, SMTPD_TOKEN *arg)
|
|||||||
|
|
||||||
/* smtpd_token_init - initialize token structures */
|
/* smtpd_token_init - initialize token structures */
|
||||||
|
|
||||||
static void smtpd_token_init(char *ptr, int count)
|
static void smtpd_token_init(char *ptr, ssize_t count)
|
||||||
{
|
{
|
||||||
SMTPD_TOKEN *arg;
|
SMTPD_TOKEN *arg;
|
||||||
int n;
|
int n;
|
||||||
|
@ -251,7 +251,6 @@ int main(int argc, char **argv)
|
|||||||
int ch;
|
int ch;
|
||||||
int ttl;
|
int ttl;
|
||||||
const char *protocols = INET_PROTO_NAME_ALL;
|
const char *protocols = INET_PROTO_NAME_ALL;
|
||||||
INET_PROTO_INFO *proto_info;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fingerprint executables and core dumps.
|
* Fingerprint executables and core dumps.
|
||||||
@ -302,7 +301,7 @@ int main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Initialize.
|
* Initialize.
|
||||||
*/
|
*/
|
||||||
proto_info = inet_proto_init("protocols", protocols);
|
(void) inet_proto_init("protocols", protocols);
|
||||||
buffer = vstring_alloc(1024);
|
buffer = vstring_alloc(1024);
|
||||||
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
||||||
sock = unix_listen(argv[optind] + 5, backlog, BLOCKING);
|
sock = unix_listen(argv[optind] + 5, backlog, BLOCKING);
|
||||||
|
@ -471,7 +471,6 @@ int main(int argc, char **argv)
|
|||||||
struct addrinfo *res;
|
struct addrinfo *res;
|
||||||
int aierr;
|
int aierr;
|
||||||
const char *protocols = INET_PROTO_NAME_ALL;
|
const char *protocols = INET_PROTO_NAME_ALL;
|
||||||
INET_PROTO_INFO *proto_info;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fingerprint executables and core dumps.
|
* Fingerprint executables and core dumps.
|
||||||
@ -555,7 +554,7 @@ int main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Translate endpoint address to internal form.
|
* Translate endpoint address to internal form.
|
||||||
*/
|
*/
|
||||||
proto_info = inet_proto_init("protocols", protocols);
|
(void) inet_proto_init("protocols", protocols);
|
||||||
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
||||||
path = argv[optind] + 5;
|
path = argv[optind] + 5;
|
||||||
path_len = strlen(path);
|
path_len = strlen(path);
|
||||||
|
@ -949,7 +949,6 @@ int main(int argc, char **argv)
|
|||||||
struct addrinfo *res;
|
struct addrinfo *res;
|
||||||
int aierr;
|
int aierr;
|
||||||
const char *protocols = INET_PROTO_NAME_ALL;
|
const char *protocols = INET_PROTO_NAME_ALL;
|
||||||
INET_PROTO_INFO *proto_info;
|
|
||||||
char *message_file = 0;
|
char *message_file = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1102,7 +1101,7 @@ int main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Translate endpoint address to internal form.
|
* Translate endpoint address to internal form.
|
||||||
*/
|
*/
|
||||||
proto_info = inet_proto_init("protocols", protocols);
|
(void) inet_proto_init("protocols", protocols);
|
||||||
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
if (strncmp(argv[optind], "unix:", 5) == 0) {
|
||||||
path = argv[optind] + 5;
|
path = argv[optind] + 5;
|
||||||
path_len = strlen(path);
|
path_len = strlen(path);
|
||||||
|
@ -220,6 +220,8 @@ int main(int unused_argc, char **unused_argv)
|
|||||||
if (STR(b2)[n] != test[n])
|
if (STR(b2)[n] != test[n])
|
||||||
msg_panic("bad decode value %d != %d",
|
msg_panic("bad decode value %d != %d",
|
||||||
(unsigned char) STR(b2)[n], (unsigned char) test[n]);
|
(unsigned char) STR(b2)[n], (unsigned char) test[n]);
|
||||||
|
vstring_free(b1);
|
||||||
|
vstring_free(b2);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@
|
|||||||
|
|
||||||
/* binhash_hash - hash a string */
|
/* binhash_hash - hash a string */
|
||||||
|
|
||||||
static unsigned binhash_hash(const void *key, ssize_t len, size_t size)
|
static size_t binhash_hash(const void *key, ssize_t len, size_t size)
|
||||||
{
|
{
|
||||||
size_t h = 0;
|
size_t h = 0;
|
||||||
size_t g;
|
size_t g;
|
||||||
@ -187,7 +187,7 @@ static void binhash_grow(BINHASH *table)
|
|||||||
{
|
{
|
||||||
BINHASH_INFO *ht;
|
BINHASH_INFO *ht;
|
||||||
BINHASH_INFO *next;
|
BINHASH_INFO *next;
|
||||||
unsigned old_size = table->size;
|
ssize_t old_size = table->size;
|
||||||
BINHASH_INFO **h = table->data;
|
BINHASH_INFO **h = table->data;
|
||||||
BINHASH_INFO **old_entries = h;
|
BINHASH_INFO **old_entries = h;
|
||||||
|
|
||||||
@ -279,7 +279,7 @@ void binhash_delete(BINHASH *table, const void *key, ssize_t key_len, void (*
|
|||||||
void binhash_free(BINHASH *table, void (*free_fn) (void *))
|
void binhash_free(BINHASH *table, void (*free_fn) (void *))
|
||||||
{
|
{
|
||||||
if (table != 0) {
|
if (table != 0) {
|
||||||
size_t i = table->size;
|
ssize_t i = table->size;
|
||||||
BINHASH_INFO *ht;
|
BINHASH_INFO *ht;
|
||||||
BINHASH_INFO *next;
|
BINHASH_INFO *next;
|
||||||
BINHASH_INFO **h = table->data;
|
BINHASH_INFO **h = table->data;
|
||||||
@ -304,7 +304,7 @@ void binhash_free(BINHASH *table, void (*free_fn) (void *))
|
|||||||
void binhash_walk(BINHASH *table, void (*action) (BINHASH_INFO *, void *),
|
void binhash_walk(BINHASH *table, void (*action) (BINHASH_INFO *, void *),
|
||||||
void *ptr) {
|
void *ptr) {
|
||||||
if (table != 0) {
|
if (table != 0) {
|
||||||
size_t i = table->size;
|
ssize_t i = table->size;
|
||||||
BINHASH_INFO **h = table->data;
|
BINHASH_INFO **h = table->data;
|
||||||
BINHASH_INFO *ht;
|
BINHASH_INFO *ht;
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ DICT *dict_alloc(const char *dict_type, const char *dict_name, ssize_t size)
|
|||||||
dict->mtime = 0;
|
dict->mtime = 0;
|
||||||
dict->fold_buf = 0;
|
dict->fold_buf = 0;
|
||||||
dict->owner.status = DICT_OWNER_UNKNOWN;
|
dict->owner.status = DICT_OWNER_UNKNOWN;
|
||||||
dict->owner.uid = ~0;
|
dict->owner.uid = INT_MAX;
|
||||||
dict->error = DICT_ERR_NONE;
|
dict->error = DICT_ERR_NONE;
|
||||||
dict->jbuf = 0;
|
dict->jbuf = 0;
|
||||||
return dict;
|
return dict;
|
||||||
|
@ -46,16 +46,72 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
DICT dict; /* generic members */
|
DICT dict; /* generic members */
|
||||||
HTABLE *table; /* lookup table */
|
HTABLE *table; /* lookup table */
|
||||||
|
HTABLE_INFO **info; /* for iterator */
|
||||||
|
HTABLE_INFO **cursor; /* ditto */
|
||||||
} DICT_INLINE;
|
} DICT_INLINE;
|
||||||
|
|
||||||
/* dict_inline_lookup - search inline table */
|
/* dict_inline_lookup - search inline table */
|
||||||
|
|
||||||
static const char *dict_inline_lookup(DICT *dict, const char *query)
|
static const char *dict_inline_lookup(DICT *dict, const char *name)
|
||||||
{
|
{
|
||||||
DICT_INLINE *dict_inline = (DICT_INLINE *) dict;
|
DICT_INLINE *dict_inline = (DICT_INLINE *) dict;
|
||||||
|
const char *result = 0;
|
||||||
|
|
||||||
DICT_ERR_VAL_RETURN(dict, DICT_ERR_NONE,
|
/*
|
||||||
htable_find(dict_inline->table, query));
|
* Optionally fold the key.
|
||||||
|
*/
|
||||||
|
if (dict->flags & DICT_FLAG_FOLD_FIX) {
|
||||||
|
if (dict->fold_buf == 0)
|
||||||
|
dict->fold_buf = vstring_alloc(10);
|
||||||
|
vstring_strcpy(dict->fold_buf, name);
|
||||||
|
name = lowercase(vstring_str(dict->fold_buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Look up the value.
|
||||||
|
*/
|
||||||
|
result = htable_find(dict_inline->table, name);
|
||||||
|
|
||||||
|
DICT_ERR_VAL_RETURN(dict, DICT_ERR_NONE, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dict_inline_sequence - traverse the dictionary */
|
||||||
|
|
||||||
|
static int dict_inline_sequence(DICT *dict, int function,
|
||||||
|
const char **key, const char **value)
|
||||||
|
{
|
||||||
|
const char *myname = "dict_inline_sequence";
|
||||||
|
DICT_INLINE *dict_inline = (DICT_INLINE *) dict;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine and execute the seek function.
|
||||||
|
*/
|
||||||
|
switch (function) {
|
||||||
|
case DICT_SEQ_FUN_FIRST:
|
||||||
|
if (dict_inline->info == 0)
|
||||||
|
dict_inline->info = htable_list(dict_inline->table);
|
||||||
|
dict_inline->cursor = dict_inline->info;
|
||||||
|
break;
|
||||||
|
case DICT_SEQ_FUN_NEXT:
|
||||||
|
if (dict_inline->cursor[0])
|
||||||
|
dict_inline->cursor += 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
msg_panic("%s: invalid function: %d", myname, function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the entry under the cursor.
|
||||||
|
*/
|
||||||
|
if (dict_inline->cursor[0]) {
|
||||||
|
*key = dict_inline->cursor[0]->key;
|
||||||
|
*value = dict_inline->cursor[0]->value;
|
||||||
|
DICT_ERR_VAL_RETURN(dict, DICT_ERR_NONE, DICT_STAT_SUCCESS);
|
||||||
|
} else {
|
||||||
|
*key = 0;
|
||||||
|
*value = 0;
|
||||||
|
DICT_ERR_VAL_RETURN(dict, DICT_ERR_NONE, DICT_STAT_FAIL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dict_inline_close - disassociate from inline table */
|
/* dict_inline_close - disassociate from inline table */
|
||||||
@ -65,6 +121,10 @@ static void dict_inline_close(DICT *dict)
|
|||||||
DICT_INLINE *dict_inline = (DICT_INLINE *) dict;
|
DICT_INLINE *dict_inline = (DICT_INLINE *) dict;
|
||||||
|
|
||||||
htable_free(dict_inline->table, myfree);
|
htable_free(dict_inline->table, myfree);
|
||||||
|
if (dict_inline->info)
|
||||||
|
myfree((void *) dict_inline->info);
|
||||||
|
if (dict->fold_buf)
|
||||||
|
vstring_free(dict->fold_buf);
|
||||||
dict_free(dict);
|
dict_free(dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,16 +138,20 @@ DICT *dict_inline_open(const char *name, int open_flags, int dict_flags)
|
|||||||
HTABLE *table = 0;
|
HTABLE *table = 0;
|
||||||
char *nameval, *vname, *value;
|
char *nameval, *vname, *value;
|
||||||
const char *err = 0;
|
const char *err = 0;
|
||||||
|
char *xperr = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clarity first. Let the optimizer worry about redundant code.
|
* Clarity first. Let the optimizer worry about redundant code.
|
||||||
*/
|
*/
|
||||||
#define DICT_INLINE_RETURN(x) do { \
|
#define DICT_INLINE_RETURN(x) do { \
|
||||||
|
DICT *__d = (x); \
|
||||||
if (saved_name != 0) \
|
if (saved_name != 0) \
|
||||||
myfree(saved_name); \
|
myfree(saved_name); \
|
||||||
|
if (xperr != 0) \
|
||||||
|
myfree(xperr); \
|
||||||
if (table != 0) \
|
if (table != 0) \
|
||||||
htable_free(table, myfree); \
|
htable_free(table, myfree); \
|
||||||
return (x); \
|
return (__d); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -114,7 +178,7 @@ DICT *dict_inline_open(const char *name, int open_flags, int dict_flags)
|
|||||||
table = htable_create(5);
|
table = htable_create(5);
|
||||||
while ((nameval = mystrtokq(&cp, CHARS_COMMA_SP, CHARS_BRACE)) != 0) {
|
while ((nameval = mystrtokq(&cp, CHARS_COMMA_SP, CHARS_BRACE)) != 0) {
|
||||||
if ((nameval[0] != CHARS_BRACE[0]
|
if ((nameval[0] != CHARS_BRACE[0]
|
||||||
|| (err = extpar(&nameval, CHARS_BRACE, EXTPAR_FLAG_STRIP)) == 0)
|
|| (err = xperr = extpar(&nameval, CHARS_BRACE, EXTPAR_FLAG_STRIP)) == 0)
|
||||||
&& (err = split_nameval(nameval, &vname, &value)) != 0)
|
&& (err = split_nameval(nameval, &vname, &value)) != 0)
|
||||||
break;
|
break;
|
||||||
(void) htable_enter(table, vname, mystrdup(value));
|
(void) htable_enter(table, vname, mystrdup(value));
|
||||||
@ -134,9 +198,13 @@ DICT *dict_inline_open(const char *name, int open_flags, int dict_flags)
|
|||||||
dict_inline = (DICT_INLINE *)
|
dict_inline = (DICT_INLINE *)
|
||||||
dict_alloc(DICT_TYPE_INLINE, name, sizeof(*dict_inline));
|
dict_alloc(DICT_TYPE_INLINE, name, sizeof(*dict_inline));
|
||||||
dict_inline->dict.lookup = dict_inline_lookup;
|
dict_inline->dict.lookup = dict_inline_lookup;
|
||||||
|
dict_inline->dict.sequence = dict_inline_sequence;
|
||||||
dict_inline->dict.close = dict_inline_close;
|
dict_inline->dict.close = dict_inline_close;
|
||||||
dict_inline->dict.flags = dict_flags | DICT_FLAG_FIXED;
|
dict_inline->dict.flags = dict_flags | DICT_FLAG_FIXED;
|
||||||
dict_inline->dict.owner.status = DICT_OWNER_TRUSTED;
|
dict_inline->dict.owner.status = DICT_OWNER_TRUSTED;
|
||||||
|
if (dict_flags & DICT_FLAG_FOLD_FIX)
|
||||||
|
dict_inline->dict.fold_buf = vstring_alloc(10);
|
||||||
|
dict_inline->info = 0;
|
||||||
dict_inline->table = table;
|
dict_inline->table = table;
|
||||||
table = 0;
|
table = 0;
|
||||||
DICT_INLINE_RETURN(DICT_DEBUG (&dict_inline->dict));
|
DICT_INLINE_RETURN(DICT_DEBUG (&dict_inline->dict));
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
./dict_open: error: empty table: "inline:{ }"; need "inline:{name=value...}"
|
./dict_open: error: empty table: "inline:{ }"; need "inline:{name=value...}"
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
./dict_open: error: missing '=' after attribute name: "inline:{ foo = xx }"; need "inline:{name=value...}"
|
./dict_open: error: missing '=' after attribute name: "inline:{ foo = xx }"; need "inline:{name=value...}"
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
./dict_open: error: bad syntax: "inline:{ foo=xx }x"; need "inline:{name=value...}"
|
./dict_open: error: bad syntax: "inline:{ foo=xx }x"; need "inline:{name=value...}"
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
./dict_open: error: bad syntax: "inline:{ foo=xx x"; need "inline:{name=value...}"
|
./dict_open: error: bad syntax: "inline:{ foo=xx x"; need "inline:{name=value...}"
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
./dict_open: error: syntax error after '}' in "{x=y}x": "inline:{ foo=xx {x=y}x}"; need "inline:{name=value...}"
|
./dict_open: error: syntax error after '}' in "{x=y}x": "inline:{ foo=xx {x=y}x}"; need "inline:{name=value...}"
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
foo=xx
|
foo=xx
|
||||||
> get bar
|
> get bar
|
||||||
|
@ -131,7 +131,8 @@ static const char *dict_lmdb_lookup(DICT *dict, const char *name)
|
|||||||
MDB_val mdb_key;
|
MDB_val mdb_key;
|
||||||
MDB_val mdb_value;
|
MDB_val mdb_value;
|
||||||
const char *result = 0;
|
const char *result = 0;
|
||||||
int status, klen;
|
int status;
|
||||||
|
ssize_t klen;
|
||||||
|
|
||||||
dict->error = 0;
|
dict->error = 0;
|
||||||
klen = strlen(name);
|
klen = strlen(name);
|
||||||
@ -305,7 +306,8 @@ static int dict_lmdb_delete(DICT *dict, const char *name)
|
|||||||
{
|
{
|
||||||
DICT_LMDB *dict_lmdb = (DICT_LMDB *) dict;
|
DICT_LMDB *dict_lmdb = (DICT_LMDB *) dict;
|
||||||
MDB_val mdb_key;
|
MDB_val mdb_key;
|
||||||
int status = 1, klen;
|
int status = 1;
|
||||||
|
ssize_t klen;
|
||||||
|
|
||||||
dict->error = 0;
|
dict->error = 0;
|
||||||
klen = strlen(name);
|
klen = strlen(name);
|
||||||
|
@ -60,7 +60,7 @@ static void dict_static_close(DICT *dict)
|
|||||||
DICT *dict_static_open(const char *name, int open_flags, int dict_flags)
|
DICT *dict_static_open(const char *name, int open_flags, int dict_flags)
|
||||||
{
|
{
|
||||||
DICT *dict;
|
DICT *dict;
|
||||||
const char *err;
|
char *err = 0;
|
||||||
char *cp, *saved_name = 0;
|
char *cp, *saved_name = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -70,6 +70,8 @@ DICT *dict_static_open(const char *name, int open_flags, int dict_flags)
|
|||||||
DICT *__d = (d); \
|
DICT *__d = (d); \
|
||||||
if (saved_name != 0) \
|
if (saved_name != 0) \
|
||||||
myfree(saved_name); \
|
myfree(saved_name); \
|
||||||
|
if (err != 0) \
|
||||||
|
myfree(err); \
|
||||||
return (__d); \
|
return (__d); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
foo=fooxx
|
foo=fooxx
|
||||||
> get bar
|
> get bar
|
||||||
bar=fooxx
|
bar=fooxx
|
||||||
./dict_open: error: bad static:name syntax: missing '}' in "{ foo xx "
|
./dict_open: error: bad static:name syntax: missing '}' in "{ foo xx "
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
./dict_open: error: bad static:name syntax: syntax error after '}' in "{ foo xx }x"
|
./dict_open: error: bad static:name syntax: syntax error after '}' in "{ foo xx }x"
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
foo=foo xx
|
foo=foo xx
|
||||||
> get bar
|
> get bar
|
||||||
|
@ -610,8 +610,12 @@ static void event_extend(int fd)
|
|||||||
int new_slots = (event_fdslots > fd / 2 ?
|
int new_slots = (event_fdslots > fd / 2 ?
|
||||||
2 * old_slots : fd + EVENT_ALLOC_INCR);
|
2 * old_slots : fd + EVENT_ALLOC_INCR);
|
||||||
EVENT_FDTABLE *fdp;
|
EVENT_FDTABLE *fdp;
|
||||||
|
|
||||||
|
#ifdef EVENT_REG_UPD_HANDLE
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
if (msg_verbose > 2)
|
if (msg_verbose > 2)
|
||||||
msg_info("%s: fd %d", myname, fd);
|
msg_info("%s: fd %d", myname, fd);
|
||||||
event_fdtable = (EVENT_FDTABLE *)
|
event_fdtable = (EVENT_FDTABLE *)
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
/*
|
/*
|
||||||
/* VSTRING *format_tv(buffer, sec, usec, sig_dig, max_dig)
|
/* VSTRING *format_tv(buffer, sec, usec, sig_dig, max_dig)
|
||||||
/* VSTRING *buffer;
|
/* VSTRING *buffer;
|
||||||
/* int sec;
|
/* long sec;
|
||||||
/* int usec;
|
/* long usec;
|
||||||
/* int sig_dig;
|
/* int sig_dig;
|
||||||
/* int max_dig;
|
/* int max_dig;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
/* format_tv - print time with limited precision */
|
/* format_tv - print time with limited precision */
|
||||||
|
|
||||||
VSTRING *format_tv(VSTRING *buf, int sec, int usec,
|
VSTRING *format_tv(VSTRING *buf, long sec, long usec,
|
||||||
int sig_dig, int max_dig)
|
int sig_dig, int max_dig)
|
||||||
{
|
{
|
||||||
static int pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000};
|
static int pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000};
|
||||||
@ -77,7 +77,7 @@ VSTRING *format_tv(VSTRING *buf, int sec, int usec,
|
|||||||
if (max_dig < 0 || max_dig > 6)
|
if (max_dig < 0 || max_dig > 6)
|
||||||
msg_panic("format_tv: bad maximum decimal count %d", max_dig);
|
msg_panic("format_tv: bad maximum decimal count %d", max_dig);
|
||||||
if (sec < 0 || usec < 0 || usec > MILLION)
|
if (sec < 0 || usec < 0 || usec > MILLION)
|
||||||
msg_panic("format_tv: bad time %ds %dus", sec, usec);
|
msg_panic("format_tv: bad time %lds %ldus", sec, usec);
|
||||||
if (sig_dig < 1 || sig_dig > 6)
|
if (sig_dig < 1 || sig_dig > 6)
|
||||||
msg_panic("format_tv: bad significant decimal count %d", sig_dig);
|
msg_panic("format_tv: bad significant decimal count %d", sig_dig);
|
||||||
ures = MILLION / pow10[max_dig];
|
ures = MILLION / pow10[max_dig];
|
||||||
@ -111,7 +111,7 @@ VSTRING *format_tv(VSTRING *buf, int sec, int usec,
|
|||||||
/*
|
/*
|
||||||
* Format the number. Truncate trailing null and thrash below resolution.
|
* Format the number. Truncate trailing null and thrash below resolution.
|
||||||
*/
|
*/
|
||||||
vstring_sprintf_append(buf, "%d", sec);
|
vstring_sprintf_append(buf, "%ld", sec);
|
||||||
if (usec >= ures) {
|
if (usec >= ures) {
|
||||||
VSTRING_ADDCH(buf, '.');
|
VSTRING_ADDCH(buf, '.');
|
||||||
for (rem = usec, n = MILLION / 10; rem >= ures && n > 0; n /= 10) {
|
for (rem = usec, n = MILLION / 10; rem >= ures && n > 0; n /= 10) {
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
*/
|
*/
|
||||||
extern VSTRING *format_tv(VSTRING *, int, int, int, int);
|
extern VSTRING *format_tv(VSTRING *, long, long, int, int);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@ -287,7 +287,7 @@ void htable_delete(HTABLE *table, const char *key, void (*free_fn) (void *))
|
|||||||
void htable_free(HTABLE *table, void (*free_fn) (void *))
|
void htable_free(HTABLE *table, void (*free_fn) (void *))
|
||||||
{
|
{
|
||||||
if (table) {
|
if (table) {
|
||||||
size_t i = table->size;
|
ssize_t i = table->size;
|
||||||
HTABLE_INFO *ht;
|
HTABLE_INFO *ht;
|
||||||
HTABLE_INFO *next;
|
HTABLE_INFO *next;
|
||||||
HTABLE_INFO **h = table->data;
|
HTABLE_INFO **h = table->data;
|
||||||
@ -315,7 +315,7 @@ void htable_free(HTABLE *table, void (*free_fn) (void *))
|
|||||||
void htable_walk(HTABLE *table, void (*action) (HTABLE_INFO *, void *),
|
void htable_walk(HTABLE *table, void (*action) (HTABLE_INFO *, void *),
|
||||||
void *ptr) {
|
void *ptr) {
|
||||||
if (table) {
|
if (table) {
|
||||||
unsigned i = table->size;
|
ssize_t i = table->size;
|
||||||
HTABLE_INFO **h = table->data;
|
HTABLE_INFO **h = table->data;
|
||||||
HTABLE_INFO *ht;
|
HTABLE_INFO *ht;
|
||||||
|
|
||||||
|
@ -116,6 +116,8 @@
|
|||||||
* -- Dean Strik (dcs)
|
* -- Dean Strik (dcs)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_GETIFADDRS
|
||||||
|
|
||||||
/* ial_socket - make socket for ioctl() operations */
|
/* ial_socket - make socket for ioctl() operations */
|
||||||
|
|
||||||
static int ial_socket(int af)
|
static int ial_socket(int af)
|
||||||
@ -145,6 +147,8 @@ static int ial_socket(int af)
|
|||||||
return (sock);
|
return (sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_GETIFADDRS
|
#ifdef HAVE_GETIFADDRS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -229,9 +233,7 @@ static int ial_getifaddrs(INET_ADDR_LIST *addr_list,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_GETIFADDRS */
|
#elif defined(HAS_SIOCGLIF) /* HAVE_GETIFADDRS */
|
||||||
|
|
||||||
#ifdef HAS_SIOCGLIF
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The SIOCLIF* ioctls are the successors of SIOCGIF* on the Solaris
|
* The SIOCLIF* ioctls are the successors of SIOCGIF* on the Solaris
|
||||||
|
@ -63,8 +63,9 @@ char *format_line_number(VSTRING *result, ssize_t first, ssize_t last)
|
|||||||
/*
|
/*
|
||||||
* Print a range only when the numbers differ.
|
* Print a range only when the numbers differ.
|
||||||
*/
|
*/
|
||||||
vstring_sprintf(result, first == last ? "%ld" : "%ld-%ld",
|
vstring_sprintf(result, "%ld", (long) first);
|
||||||
(long) first, (long) last);
|
if (first != last)
|
||||||
|
vstring_sprintf_append(result, "-%ld", (long) last);
|
||||||
|
|
||||||
return (vstring_str(result));
|
return (vstring_str(result));
|
||||||
}
|
}
|
||||||
|
@ -332,6 +332,7 @@ static int mac_exp_parse_logical(MAC_EXP_CONTEXT *mc, const char **lookup,
|
|||||||
VSTRING *rite_op_buf;
|
VSTRING *rite_op_buf;
|
||||||
const char *left_op_strval;
|
const char *left_op_strval;
|
||||||
const char *rite_op_strval;
|
const char *rite_op_strval;
|
||||||
|
char *op_pos;
|
||||||
char *op_strval;
|
char *op_strval;
|
||||||
size_t op_len;
|
size_t op_len;
|
||||||
int op_tokval;
|
int op_tokval;
|
||||||
@ -348,6 +349,7 @@ static int mac_exp_parse_logical(MAC_EXP_CONTEXT *mc, const char **lookup,
|
|||||||
/*
|
/*
|
||||||
* Operator. Todo: regexp operator.
|
* Operator. Todo: regexp operator.
|
||||||
*/
|
*/
|
||||||
|
op_pos = cp;
|
||||||
op_len = strspn(cp, "<>!=?+-*/~&|%"); /* for better diagnostics. */
|
op_len = strspn(cp, "<>!=?+-*/~&|%"); /* for better diagnostics. */
|
||||||
op_strval = mystrndup(cp, op_len);
|
op_strval = mystrndup(cp, op_len);
|
||||||
op_tokval = name_code(mac_exp_op_table, NAME_CODE_FLAG_NONE, op_strval);
|
op_tokval = name_code(mac_exp_op_table, NAME_CODE_FLAG_NONE, op_strval);
|
||||||
@ -363,7 +365,7 @@ static int mac_exp_parse_logical(MAC_EXP_CONTEXT *mc, const char **lookup,
|
|||||||
if (MAC_EXP_FIND_LEFT_CURLY(tmp_len, cp) == 0)
|
if (MAC_EXP_FIND_LEFT_CURLY(tmp_len, cp) == 0)
|
||||||
MAC_EXP_ERR_RETURN(mc, "\"{expression}\" expected at: "
|
MAC_EXP_ERR_RETURN(mc, "\"{expression}\" expected at: "
|
||||||
"\"...{%s} %.*s>>>%.20s\"",
|
"\"...{%s} %.*s>>>%.20s\"",
|
||||||
left_op_strval, (int) op_len, op_strval, cp);
|
left_op_strval, (int) op_len, op_pos, cp);
|
||||||
if ((rite_op_strval = mac_exp_extract_curly_payload(mc, &cp)) == 0)
|
if ((rite_op_strval = mac_exp_extract_curly_payload(mc, &cp)) == 0)
|
||||||
return (mc->status);
|
return (mc->status);
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ stat=0 result=Good: Postfix 2.11 compatible
|
|||||||
<< ${{${name2::bug}} != {:bug}?{Error: NOT}:{Good:}} Postfix 2.11 compatible
|
<< ${{${name2::bug}} != {:bug}?{Error: NOT}:{Good:}} Postfix 2.11 compatible
|
||||||
stat=0 result=Good: Postfix 2.11 compatible
|
stat=0 result=Good: Postfix 2.11 compatible
|
||||||
<< ${{xx}==(yy)?{oops}:{phew}}
|
<< ${{xx}==(yy)?{oops}:{phew}}
|
||||||
unknown: warning: "{expression}" expected at: "...{xx} ??>>>(yy)?{oops}:{phew}"
|
unknown: warning: "{expression}" expected at: "...{xx} ==>>>(yy)?{oops}:{phew}"
|
||||||
stat=1 result=
|
stat=1 result=
|
||||||
<<
|
<<
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ extern void msg_error_clear(void);
|
|||||||
extern MSG_CLEANUP_FN msg_cleanup(MSG_CLEANUP_FN);
|
extern MSG_CLEANUP_FN msg_cleanup(MSG_CLEANUP_FN);
|
||||||
|
|
||||||
extern void PRINTFLIKE(4, 5) msg_rate_delay(time_t *, int,
|
extern void PRINTFLIKE(4, 5) msg_rate_delay(time_t *, int,
|
||||||
void PRINTFLIKE(1, 2) (*log_fn) (const char *,...),
|
void PRINTFPTRLIKE(1, 2) (*log_fn) (const char *,...),
|
||||||
const char *,...);
|
const char *,...);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
|
@ -8,14 +8,14 @@
|
|||||||
/*
|
/*
|
||||||
/* char *mvect_alloc(vector, elsize, nelm, init_fn, wipe_fn)
|
/* char *mvect_alloc(vector, elsize, nelm, init_fn, wipe_fn)
|
||||||
/* MVECT *vector;
|
/* MVECT *vector;
|
||||||
/* int elsize;
|
/* ssize_t elsize;
|
||||||
/* int nelm;
|
/* ssize_t nelm;
|
||||||
/* void (*init_fn)(char *ptr, int count);
|
/* void (*init_fn)(char *ptr, ssize_t count);
|
||||||
/* void (*wipe_fn)(char *ptr, int count);
|
/* void (*wipe_fn)(char *ptr, ssize_t count);
|
||||||
/*
|
/*
|
||||||
/* char *mvect_realloc(vector, nelm)
|
/* char *mvect_realloc(vector, nelm)
|
||||||
/* MVECT *vector;
|
/* MVECT *vector;
|
||||||
/* int nelm;
|
/* ssize_t nelm;
|
||||||
/*
|
/*
|
||||||
/* char *mvect_free(vector)
|
/* char *mvect_free(vector)
|
||||||
/* MVECT *vector;
|
/* MVECT *vector;
|
||||||
@ -67,8 +67,8 @@
|
|||||||
|
|
||||||
/* mvect_alloc - allocate memory vector */
|
/* mvect_alloc - allocate memory vector */
|
||||||
|
|
||||||
char *mvect_alloc(MVECT *vect, int elsize, int nelm,
|
char *mvect_alloc(MVECT *vect, ssize_t elsize, ssize_t nelm,
|
||||||
void (*init_fn) (char *, int), void (*wipe_fn) (char *, int))
|
void (*init_fn) (char *, ssize_t), void (*wipe_fn) (char *, ssize_t))
|
||||||
{
|
{
|
||||||
vect->init_fn = init_fn;
|
vect->init_fn = init_fn;
|
||||||
vect->wipe_fn = wipe_fn;
|
vect->wipe_fn = wipe_fn;
|
||||||
@ -83,11 +83,11 @@ char *mvect_alloc(MVECT *vect, int elsize, int nelm,
|
|||||||
|
|
||||||
/* mvect_realloc - adjust memory vector allocation */
|
/* mvect_realloc - adjust memory vector allocation */
|
||||||
|
|
||||||
char *mvect_realloc(MVECT *vect, int nelm)
|
char *mvect_realloc(MVECT *vect, ssize_t nelm)
|
||||||
{
|
{
|
||||||
int old_len = vect->nelm;
|
ssize_t old_len = vect->nelm;
|
||||||
int incr = nelm - old_len;
|
ssize_t incr = nelm - old_len;
|
||||||
int new_nelm;
|
ssize_t new_nelm;
|
||||||
|
|
||||||
if (incr > 0) {
|
if (incr > 0) {
|
||||||
if (incr < old_len)
|
if (incr < old_len)
|
||||||
|
@ -14,18 +14,18 @@
|
|||||||
/*
|
/*
|
||||||
* Generic memory vector interface.
|
* Generic memory vector interface.
|
||||||
*/
|
*/
|
||||||
typedef void (*MVECT_FN) (char *, int);
|
typedef void (*MVECT_FN) (char *, ssize_t);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *ptr;
|
char *ptr;
|
||||||
int elsize;
|
ssize_t elsize;
|
||||||
int nelm;
|
ssize_t nelm;
|
||||||
MVECT_FN init_fn;
|
MVECT_FN init_fn;
|
||||||
MVECT_FN wipe_fn;
|
MVECT_FN wipe_fn;
|
||||||
} MVECT;
|
} MVECT;
|
||||||
|
|
||||||
extern char *mvect_alloc(MVECT *, int, int, MVECT_FN, MVECT_FN);
|
extern char *mvect_alloc(MVECT *, ssize_t, ssize_t, MVECT_FN, MVECT_FN);
|
||||||
extern char *mvect_realloc(MVECT *, int);
|
extern char *mvect_realloc(MVECT *, ssize_t);
|
||||||
extern char *mvect_free(MVECT *);
|
extern char *mvect_free(MVECT *);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
|
@ -796,16 +796,27 @@ char *gai_strerror(int ecode)
|
|||||||
* A test program that takes some info from the command line and runs it
|
* A test program that takes some info from the command line and runs it
|
||||||
* forward and backward through the above conversion routines.
|
* forward and backward through the above conversion routines.
|
||||||
*/
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
#include <msg.h>
|
#include <msg.h>
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
#include <msg_vstream.h>
|
#include <msg_vstream.h>
|
||||||
|
|
||||||
|
static int compare_family(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
struct addrinfo *resa = *(struct addrinfo **) a;
|
||||||
|
struct addrinfo *resb = *(struct addrinfo **) b;
|
||||||
|
|
||||||
|
return (resa->ai_family - resb->ai_family);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct addrinfo *info;
|
struct addrinfo *info;
|
||||||
struct addrinfo *ip;
|
struct addrinfo *ip;
|
||||||
|
struct addrinfo **resv;
|
||||||
MAI_HOSTNAME_STR host;
|
MAI_HOSTNAME_STR host;
|
||||||
MAI_HOSTADDR_STR addr;
|
MAI_HOSTADDR_STR addr;
|
||||||
|
size_t len, n;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
msg_vstream_init(argv[0], VSTREAM_ERR);
|
msg_vstream_init(argv[0], VSTREAM_ERR);
|
||||||
@ -821,7 +832,14 @@ int main(int argc, char **argv)
|
|||||||
msg_info("hostname_to_sockaddr(%s): %s",
|
msg_info("hostname_to_sockaddr(%s): %s",
|
||||||
argv[2], err == EAI_SYSTEM ? strerror(errno) : gai_strerror(err));
|
argv[2], err == EAI_SYSTEM ? strerror(errno) : gai_strerror(err));
|
||||||
} else {
|
} else {
|
||||||
for (ip = info; ip != 0; ip = ip->ai_next) {
|
for (len = 0, ip = info; ip != 0; ip = ip->ai_next)
|
||||||
|
len += 1;
|
||||||
|
resv = (struct addrinfo **) mymalloc(len * sizeof(*resv));
|
||||||
|
for (len = 0, ip = info; ip != 0; ip = ip->ai_next)
|
||||||
|
resv[len++] = ip;
|
||||||
|
qsort((void *) resv, len, sizeof(*resv), compare_family);
|
||||||
|
for (n = 0; n < len; n++) {
|
||||||
|
ip = resv[n];
|
||||||
if ((err = sockaddr_to_hostaddr(ip->ai_addr, ip->ai_addrlen, &addr,
|
if ((err = sockaddr_to_hostaddr(ip->ai_addr, ip->ai_addrlen, &addr,
|
||||||
(MAI_SERVPORT_STR *) 0, 0)) != 0) {
|
(MAI_SERVPORT_STR *) 0, 0)) != 0) {
|
||||||
msg_info("sockaddr_to_hostaddr: %s",
|
msg_info("sockaddr_to_hostaddr: %s",
|
||||||
@ -839,6 +857,7 @@ int main(int argc, char **argv)
|
|||||||
msg_info("%s -> %s", addr.buf, host.buf);
|
msg_info("%s -> %s", addr.buf, host.buf);
|
||||||
}
|
}
|
||||||
freeaddrinfo(info);
|
freeaddrinfo(info);
|
||||||
|
myfree((void *) resv);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_info("=== host address %s ===", argv[3]);
|
msg_info("=== host address %s ===", argv[3]);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
./myaddrinfo: === hostname belly.porcupine.org ===
|
./myaddrinfo: === hostname belly.porcupine.org ===
|
||||||
./myaddrinfo: belly.porcupine.org -> family=28 sock=1 proto=6 2604:8d00:189::6
|
|
||||||
./myaddrinfo: 2604:8d00:189::6 -> belly.porcupine.org
|
|
||||||
./myaddrinfo: belly.porcupine.org -> family=2 sock=1 proto=6 168.100.189.6
|
./myaddrinfo: belly.porcupine.org -> family=2 sock=1 proto=6 168.100.189.6
|
||||||
./myaddrinfo: 168.100.189.6 -> belly.porcupine.org
|
./myaddrinfo: 168.100.189.6 -> belly.porcupine.org
|
||||||
|
./myaddrinfo: belly.porcupine.org -> family=28 sock=1 proto=6 2604:8d00:189::6
|
||||||
|
./myaddrinfo: 2604:8d00:189::6 -> belly.porcupine.org
|
||||||
./myaddrinfo: === host address 168.100.189.2 ===
|
./myaddrinfo: === host address 168.100.189.2 ===
|
||||||
./myaddrinfo: 168.100.189.2 -> family=2 sock=1 proto=6 168.100.189.2
|
./myaddrinfo: 168.100.189.2 -> family=2 sock=1 proto=6 168.100.189.2
|
||||||
./myaddrinfo: 168.100.189.2 -> spike.porcupine.org
|
./myaddrinfo: 168.100.189.2 -> spike.porcupine.org
|
||||||
|
@ -268,7 +268,7 @@ const char *str_name_mask_opt(VSTRING *buf, const char *context,
|
|||||||
{
|
{
|
||||||
const char *myname = "name_mask";
|
const char *myname = "name_mask";
|
||||||
const NAME_MASK *np;
|
const NAME_MASK *np;
|
||||||
int len;
|
ssize_t len;
|
||||||
static VSTRING *my_buf = 0;
|
static VSTRING *my_buf = 0;
|
||||||
int delim = (flags & NAME_MASK_COMMA ? ',' :
|
int delim = (flags & NAME_MASK_COMMA ? ',' :
|
||||||
(flags & NAME_MASK_PIPE ? '|' : ' '));
|
(flags & NAME_MASK_PIPE ? '|' : ' '));
|
||||||
@ -382,7 +382,7 @@ const char *str_long_name_mask_opt(VSTRING *buf, const char *context,
|
|||||||
long mask, int flags)
|
long mask, int flags)
|
||||||
{
|
{
|
||||||
const char *myname = "name_mask";
|
const char *myname = "name_mask";
|
||||||
int len;
|
ssize_t len;
|
||||||
static VSTRING *my_buf = 0;
|
static VSTRING *my_buf = 0;
|
||||||
int delim = (flags & NAME_MASK_COMMA ? ',' :
|
int delim = (flags & NAME_MASK_COMMA ? ',' :
|
||||||
(flags & NAME_MASK_PIPE ? '|' : ' '));
|
(flags & NAME_MASK_PIPE ? '|' : ' '));
|
||||||
|
@ -61,9 +61,8 @@
|
|||||||
time_t sane_time(void)
|
time_t sane_time(void)
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
static time_t last_time,
|
static time_t last_time, last_real;
|
||||||
last_real;
|
long delta;
|
||||||
int delta;
|
|
||||||
static int fraction;
|
static int fraction;
|
||||||
static int warned;
|
static int warned;
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ extern char *neuter(char *, const char *, int);
|
|||||||
extern char *lowercase(char *);
|
extern char *lowercase(char *);
|
||||||
extern char *uppercase(char *);
|
extern char *uppercase(char *);
|
||||||
extern char *skipblanks(const char *);
|
extern char *skipblanks(const char *);
|
||||||
extern char *trimblanks(char *, int);
|
extern char *trimblanks(char *, ssize_t);
|
||||||
extern char *concatenate(const char *,...);
|
extern char *concatenate(const char *,...);
|
||||||
extern char *mystrtok(char **, const char *);
|
extern char *mystrtok(char **, const char *);
|
||||||
extern char *mystrtokq(char **, const char *, const char *);
|
extern char *mystrtokq(char **, const char *, const char *);
|
||||||
|
@ -1,55 +1,55 @@
|
|||||||
./dict_open: error: cidr:/xx map requires O_RDONLY access mode
|
./dict_open: error: cidr:/xx map requires O_RDONLY access mode
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: cidr:/xx is unavailable. cidr:/xx map requires O_RDONLY access mode
|
./dict_open: warning: cidr:/xx is unavailable. cidr:/xx map requires O_RDONLY access mode
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: open /xx: No such file or directory
|
./dict_open: error: open /xx: No such file or directory
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: cidr:/xx is unavailable. open /xx: No such file or directory
|
./dict_open: warning: cidr:/xx is unavailable. open /xx: No such file or directory
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: pcre:/xx map requires O_RDONLY access mode
|
./dict_open: error: pcre:/xx map requires O_RDONLY access mode
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: pcre:/xx is unavailable. pcre:/xx map requires O_RDONLY access mode
|
./dict_open: warning: pcre:/xx is unavailable. pcre:/xx map requires O_RDONLY access mode
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: open /xx: No such file or directory
|
./dict_open: error: open /xx: No such file or directory
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: pcre:/xx is unavailable. open /xx: No such file or directory
|
./dict_open: warning: pcre:/xx is unavailable. open /xx: No such file or directory
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: regexp:/xx map requires O_RDONLY access mode
|
./dict_open: error: regexp:/xx map requires O_RDONLY access mode
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: regexp:/xx is unavailable. regexp:/xx map requires O_RDONLY access mode
|
./dict_open: warning: regexp:/xx is unavailable. regexp:/xx map requires O_RDONLY access mode
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: open /xx: No such file or directory
|
./dict_open: error: open /xx: No such file or directory
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: regexp:/xx is unavailable. open /xx: No such file or directory
|
./dict_open: warning: regexp:/xx is unavailable. open /xx: No such file or directory
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: unix:xx map requires O_RDONLY access mode
|
./dict_open: error: unix:xx map requires O_RDONLY access mode
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: unix:xx is unavailable. unix:xx map requires O_RDONLY access mode
|
./dict_open: warning: unix:xx is unavailable. unix:xx map requires O_RDONLY access mode
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: unknown table: unix:xx
|
./dict_open: error: unknown table: unix:xx
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: unix:xx is unavailable. unknown table: unix:xx
|
./dict_open: warning: unix:xx is unavailable. unknown table: unix:xx
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: texthash:/xx map requires O_RDONLY access mode
|
./dict_open: error: texthash:/xx map requires O_RDONLY access mode
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: texthash:/xx is unavailable. texthash:/xx map requires O_RDONLY access mode
|
./dict_open: warning: texthash:/xx is unavailable. texthash:/xx map requires O_RDONLY access mode
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: open database /xx: No such file or directory
|
./dict_open: error: open database /xx: No such file or directory
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: texthash:/xx is unavailable. open database /xx: No such file or directory
|
./dict_open: warning: texthash:/xx is unavailable. open database /xx: No such file or directory
|
||||||
foo: error
|
foo: error
|
||||||
./dict_open: error: open database /xx.db: No such file or directory
|
./dict_open: error: open database /xx.db: No such file or directory
|
||||||
owner=trusted (uid=-1)
|
owner=trusted (uid=2147483647)
|
||||||
> get foo
|
> get foo
|
||||||
./dict_open: warning: hash:/xx is unavailable. open database /xx.db: No such file or directory
|
./dict_open: warning: hash:/xx is unavailable. open database /xx.db: No such file or directory
|
||||||
foo: error
|
foo: error
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
#if defined(FREEBSD2) || defined(FREEBSD3) || defined(FREEBSD4) \
|
#if defined(FREEBSD2) || defined(FREEBSD3) || defined(FREEBSD4) \
|
||||||
|| defined(FREEBSD5) || defined(FREEBSD6) || defined(FREEBSD7) \
|
|| defined(FREEBSD5) || defined(FREEBSD6) || defined(FREEBSD7) \
|
||||||
|| defined(FREEBSD8) || defined(FREEBSD9) \
|
|| defined(FREEBSD8) || defined(FREEBSD9) || defined(FREEBSD10) \
|
||||||
|| defined(BSDI2) || defined(BSDI3) || defined(BSDI4) \
|
|| defined(BSDI2) || defined(BSDI3) || defined(BSDI4) \
|
||||||
|| defined(OPENBSD2) || defined(OPENBSD3) || defined(OPENBSD4) \
|
|| defined(OPENBSD2) || defined(OPENBSD3) || defined(OPENBSD4) \
|
||||||
|| defined(OPENBSD5) \
|
|| defined(OPENBSD5) \
|
||||||
@ -235,9 +235,6 @@
|
|||||||
#define USE_STATFS
|
#define USE_STATFS
|
||||||
#define STATFS_IN_SYS_MOUNT_H
|
#define STATFS_IN_SYS_MOUNT_H
|
||||||
#define HAS_POSIX_REGEXP
|
#define HAS_POSIX_REGEXP
|
||||||
#define NORETURN void
|
|
||||||
#define PRINTFLIKE(x,y)
|
|
||||||
#define SCANFLIKE(x,y)
|
|
||||||
#ifndef NO_NETINFO
|
#ifndef NO_NETINFO
|
||||||
#define HAS_NETINFO
|
#define HAS_NETINFO
|
||||||
#endif
|
#endif
|
||||||
@ -1167,9 +1164,6 @@ typedef unsigned short mode_t;
|
|||||||
#define O_NONBLOCK O_NDELAY
|
#define O_NONBLOCK O_NDELAY
|
||||||
#define WEXITSTATUS(x) ((x).w_retcode)
|
#define WEXITSTATUS(x) ((x).w_retcode)
|
||||||
#define WTERMSIG(x) ((x).w_termsig)
|
#define WTERMSIG(x) ((x).w_termsig)
|
||||||
#define NORETURN /* the native compiler */
|
|
||||||
#define PRINTFLIKE(x,y)
|
|
||||||
#define SCANFLIKE(x,y)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ReliantUnix543
|
#ifdef ReliantUnix543
|
||||||
@ -1566,6 +1560,17 @@ typedef int pid_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clang-style attribute tests.
|
||||||
|
*
|
||||||
|
* XXX Without the unconditional test below, gcc 4.6 will barf on ``elif
|
||||||
|
* defined(__clang__) && __has_attribute(__whatever__)'' with error message
|
||||||
|
* ``missing binary operator before token "("''.
|
||||||
|
*/
|
||||||
|
#ifndef __has_attribute
|
||||||
|
#define __has_attribute(x) 0
|
||||||
|
#endif /* __has_attribute */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Need to specify what functions never return, so that the compiler can
|
* Need to specify what functions never return, so that the compiler can
|
||||||
* warn for missing initializations and other trouble. However, OPENSTEP4
|
* warn for missing initializations and other trouble. However, OPENSTEP4
|
||||||
@ -1578,12 +1583,12 @@ typedef int pid_t;
|
|||||||
#ifndef NORETURN
|
#ifndef NORETURN
|
||||||
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3
|
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3
|
||||||
#define NORETURN void __attribute__((__noreturn__))
|
#define NORETURN void __attribute__((__noreturn__))
|
||||||
#endif
|
#elif defined(__clang__) && __has_attribute(__noreturn__)
|
||||||
#endif
|
#define NORETURN void __attribute__((__noreturn__))
|
||||||
|
#else
|
||||||
#ifndef NORETURN
|
|
||||||
#define NORETURN void
|
#define NORETURN void
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* NORETURN */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Turn on format string argument checking. This is more accurate than
|
* Turn on format string argument checking. This is more accurate than
|
||||||
@ -1595,18 +1600,22 @@ typedef int pid_t;
|
|||||||
#ifndef PRINTFLIKE
|
#ifndef PRINTFLIKE
|
||||||
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3
|
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3
|
||||||
#define PRINTFLIKE(x,y) __attribute__ ((format (printf, (x), (y))))
|
#define PRINTFLIKE(x,y) __attribute__ ((format (printf, (x), (y))))
|
||||||
|
#elif defined(__clang__) && __has_attribute(__format__)
|
||||||
|
#define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, (x), (y))))
|
||||||
#else
|
#else
|
||||||
#define PRINTFLIKE(x,y)
|
#define PRINTFLIKE(x,y)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* PRINTFLIKE */
|
||||||
|
|
||||||
#ifndef SCANFLIKE
|
#ifndef SCANFLIKE
|
||||||
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3
|
#if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3
|
||||||
#define SCANFLIKE(x,y) __attribute__ ((format (scanf, (x), (y))))
|
#define SCANFLIKE(x,y) __attribute__ ((format (scanf, (x), (y))))
|
||||||
|
#elif defined(__clang__) && __has_attribute(__format__)
|
||||||
|
#define SCANFLIKE(x,y) __attribute__ ((__format__ (__scanf__, (x), (y))))
|
||||||
#else
|
#else
|
||||||
#define SCANFLIKE(x,y)
|
#define SCANFLIKE(x,y)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* SCANFLIKE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some gcc implementations don't grok these attributes with pointer to
|
* Some gcc implementations don't grok these attributes with pointer to
|
||||||
@ -1616,6 +1625,8 @@ typedef int pid_t;
|
|||||||
#ifndef PRINTFPTRLIKE
|
#ifndef PRINTFPTRLIKE
|
||||||
#if (__GNUC__ >= 3) /* XXX Rough estimate */
|
#if (__GNUC__ >= 3) /* XXX Rough estimate */
|
||||||
#define PRINTFPTRLIKE(x,y) PRINTFLIKE(x,y)
|
#define PRINTFPTRLIKE(x,y) PRINTFLIKE(x,y)
|
||||||
|
#elif defined(__clang__) && __has_attribute(__format__)
|
||||||
|
#define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, (x), (y))))
|
||||||
#else
|
#else
|
||||||
#define PRINTFPTRLIKE(x,y)
|
#define PRINTFPTRLIKE(x,y)
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
/*
|
/*
|
||||||
/* char *trimblanks(string, len)
|
/* char *trimblanks(string, len)
|
||||||
/* char *string;
|
/* char *string;
|
||||||
/* int len;
|
/* ssize_t len;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* trimblanks() returns a pointer to the beginning of the trailing
|
/* trimblanks() returns a pointer to the beginning of the trailing
|
||||||
/* whitespace in \fIstring\fR, or a pointer to the string terminator
|
/* whitespace in \fIstring\fR, or a pointer to the string terminator
|
||||||
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
#include "stringops.h"
|
#include "stringops.h"
|
||||||
|
|
||||||
char *trimblanks(char *string, int len)
|
char *trimblanks(char *string, ssize_t len)
|
||||||
{
|
{
|
||||||
char *curr;
|
char *curr;
|
||||||
|
|
||||||
|
@ -60,13 +60,13 @@ int unix_connect(const char *addr, int block_mode, int timeout)
|
|||||||
{
|
{
|
||||||
#undef sun
|
#undef sun
|
||||||
struct sockaddr_un sun;
|
struct sockaddr_un sun;
|
||||||
int len = strlen(addr);
|
ssize_t len = strlen(addr);
|
||||||
int sock;
|
int sock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Translate address information to internal form.
|
* Translate address information to internal form.
|
||||||
*/
|
*/
|
||||||
if (len >= (int) sizeof(sun.sun_path))
|
if (len >= sizeof(sun.sun_path))
|
||||||
msg_fatal("unix-domain name too long: %s", addr);
|
msg_fatal("unix-domain name too long: %s", addr);
|
||||||
memset((void *) &sun, 0, sizeof(sun));
|
memset((void *) &sun, 0, sizeof(sun));
|
||||||
sun.sun_family = AF_UNIX;
|
sun.sun_family = AF_UNIX;
|
||||||
|
@ -67,13 +67,13 @@ int unix_listen(const char *addr, int backlog, int block_mode)
|
|||||||
{
|
{
|
||||||
#undef sun
|
#undef sun
|
||||||
struct sockaddr_un sun;
|
struct sockaddr_un sun;
|
||||||
int len = strlen(addr);
|
ssize_t len = strlen(addr);
|
||||||
int sock;
|
int sock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Translate address information to internal form.
|
* Translate address information to internal form.
|
||||||
*/
|
*/
|
||||||
if (len >= (int) sizeof(sun.sun_path))
|
if (len >= sizeof(sun.sun_path))
|
||||||
msg_fatal("unix-domain name too long: %s", addr);
|
msg_fatal("unix-domain name too long: %s", addr);
|
||||||
memset((void *) &sun, 0, sizeof(sun));
|
memset((void *) &sun, 0, sizeof(sun));
|
||||||
sun.sun_family = AF_UNIX;
|
sun.sun_family = AF_UNIX;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user