2
0
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:
Wietse Venema 2014-12-13 00:00:00 -05:00 committed by Viktor Dukhovni
parent 26a8f51271
commit 2bcd791952
73 changed files with 364 additions and 200 deletions

View File

@ -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.

View File

@ -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?

View File

@ -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>

View File

@ -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-

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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;

View File

@ -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>

View File

@ -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 *);

View File

@ -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);

View File

@ -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)
{ {
/* /*

View File

@ -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;
/* /*

View File

@ -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 {

View File

@ -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 */

View File

@ -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

View File

@ -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;

View File

@ -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);
} }

View File

@ -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)

View File

@ -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

View File

@ -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;

View File

@ -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 */

View File

@ -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))

View File

@ -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;

View File

@ -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.

View File

@ -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');

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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()));
} }

View File

@ -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);
} }

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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,

View File

@ -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,
}; };

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }

View File

@ -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;

View File

@ -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;

View File

@ -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));

View File

@ -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

View File

@ -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);

View File

@ -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)

View File

@ -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

View File

@ -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 *)

View File

@ -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) {

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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));
} }

View File

@ -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);

View File

@ -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=
<< <<

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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]);

View File

@ -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

View File

@ -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 ? '|' : ' '));

View File

@ -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;

View File

@ -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 *);

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;