Testing: test that postmulti(1) will reject a non-default
config_directory setting. File: postmulti/Makefile.in.
+
+20241201
+
+ Bitrot: C23 unconditionally defines the bool type, breaking
+ Postfix builds. Solution: migrate from the Postfix bool
+ type (an int, typically size 4) to C23 bool (size 1). This
+ is an incompatible change in Postfix library APIs. Fortunately
+ this change does not affect the database plugin interface.
+ Files: makedefs, bounce/bounce.c, cleanup/cleanup_init.c,
+ global/mail_conf.h, global/mail_params.c, global/mail_params.h,
+ local/local.c, oqmgr/qmgr.c, postconf/extract.awk, qmgr/qmgr.c,
+ smtp/smtp.c, smtpd/smtpd.c, trivial-rewrite/trivial-rewrite.c,
+ util/sys_defs.h.
Use sprintf() instead of snprintf(). By default, Postfix
uses snprintf() except on ancient systems.
+ <b>-DNO_STDBOOL</b>
+ Don't use <stdbool.h>. This is usually auto-detected.
+
<b>DEBUG=</b><i>debug</i><b>_</b><i>level</i>
Specifies a non-default debugging level. The default is <b>-g</b>.
Specify <b>DEBUG=</b> to turn off debugging.
# .IP \fB-DNO_SNPRINTF\fR
# Use sprintf() instead of snprintf(). By default, Postfix
# uses snprintf() except on ancient systems.
+# .IP \fB-DNO_STDBOOL\fR
+# Don't use <stdbool.h>. This is usually auto-detected.
# .RE
# .IP \fBDEBUG=\fIdebug_level\fR
# Specifies a non-default debugging level. The default is \fB-g\fR.
;;
esac
+# C23 introduces a new built-in type 'bool' which breaks past Postfix
+# practice. Other compilers provide emulation. Don't try to guess where
+# the compiler hides <stbool.h>.
+case "$CCARGS" in
+ *-DNO_STDBOOL*) ;;
+ *) cat >makedefs.test.c <<'EOF'
+#include <stdbool.h>
+bool x;
+EOF
+ ${CC-gcc} -c makedefs.test.c >/dev/null 2>&1 ||
+ CCARGS="$CCARGS -DNO_STDBOOL"
+ rm -f makedefs.test.[co]
+ ;;
+esac
+
# Defaults that can be overruled (make makefiles CC=cc OPT=-O6 DEBUG=)
# Disable optimizations by default when compiling for Purify. Disable
# optimizations by default with gcc 2.8, until the compiler is known to
.IP \fB\-DNO_SNPRINTF\fR
Use sprintf() instead of snprintf(). By default, Postfix
uses snprintf() except on ancient systems.
+.IP \fB\-DNO_STDBOOL\fR
+Don't use <stdbool.h>. This is usually auto\-detected.
.RE
.IP \fBDEBUG=\fIdebug_level\fR
Specifies a non\-default debugging level. The default is \fB\-g\fR.
and JSON output Files postmulti postmulti c
postmulti Makefile in postmulti postmulti c
to integrate into test scripts File postmulti postmulti c
+ local local c oqmgr qmgr c postconf extract awk qmgr qmgr c
+ makedefs bounce bounce c cleanup cleanup_init c
+ smtp smtp c smtpd smtpd c trivial rewrite trivial rewrite c
+ Files makedefs bounce bounce c cleanup cleanup_init c
char *var_bounce_tmpl;
bool var_threaded_bounce;
char *var_hfrom_format; /* header_from_format */
-int var_reqtls_redact_dsn;
+bool var_reqtls_redact_dsn;
/*
* We're single threaded, so we can avoid some memory allocation overhead.
char *var_remote_rwr_domain; /* header-only surrogate */
char *var_msg_reject_chars; /* reject these characters */
char *var_msg_strip_chars; /* strip these characters */
-int var_verp_bounce_off; /* don't verp the bounces */
+bool var_verp_bounce_off; /* don't verp the bounces */
int var_milt_conn_time; /* milter connect/handshake timeout */
int var_milt_cmd_time; /* milter command timeout */
int var_milt_msg_time; /* milter content timeout */
char *var_cleanup_milters; /* non-SMTP mail */
char *var_milt_head_checks; /* post-Milter header checks */
char *var_milt_macro_deflts; /* default macro settings */
-int var_auto_8bit_enc_hdr; /* auto-detect 8bit encoding header */
-int var_always_add_hdrs; /* always add missing headers */
+bool var_auto_8bit_enc_hdr; /* auto-detect 8bit encoding header */
+bool var_always_add_hdrs; /* always add missing headers */
int var_virt_addrlen_limit; /* stop exponential growth */
char *var_hfrom_format; /* header_from_format */
char *var_full_name_encoding_charset; /* in =?charset?encoding?gibberish=? */
-int var_force_mime_iconv; /* force mime downgrade on input */
-int var_cleanup_mask_stray_cr_lf; /* replace stray CR or LF with space */
+bool var_force_mime_iconv; /* force mime downgrade on input */
+bool var_cleanup_mask_stray_cr_lf; /* replace stray CR or LF with space */
char *var_non_empty_eoh_action; /* handle non-empty header terminator */
bool var_reqtls_esmtp_hdr;
typedef struct {
const char *name; /* config variable name */
- int defval; /* default value */
- int *target; /* pointer to global variable */
+ bool defval; /* default value */
+ bool *target; /* pointer to global variable */
} CONFIG_BOOL_TABLE;
typedef struct {
typedef struct {
const char *name; /* config variable name */
const char *defval; /* default value */
- int *target; /* pointer to global variable */
+ bool *target; /* pointer to global variable */
} CONFIG_NBOOL_TABLE;
extern void get_mail_conf_str_table(const CONFIG_STR_TABLE *);
char *var_transit_origin;
char *var_transit_dest;
char *var_mail_name;
-int var_helpful_warnings;
+bool var_helpful_warnings;
char *var_syslog_name;
char *var_mail_owner;
uid_t var_owner_uid;
int var_flock_tries;
int var_flock_delay;
int var_flock_stale;
-int var_disable_dns;
-int var_soft_bounce;
+bool var_disable_dns;
+bool var_soft_bounce;
time_t var_starttime;
-int var_ownreq_special;
+bool var_ownreq_special;
int var_daemon_timeout;
char *var_syslog_facility;
char *var_relay_domains;
int var_mime_bound_len;
int var_header_limit;
int var_token_limit;
-int var_disable_mime_input;
-int var_disable_mime_oconv;
-int var_strict_8bitmime;
-int var_strict_7bit_hdrs;
-int var_strict_8bit_body;
-int var_strict_encoding;
-int var_verify_neg_cache;
-int var_oldlog_compat;
+bool var_disable_mime_input;
+bool var_disable_mime_oconv;
+bool var_strict_8bitmime;
+bool var_strict_7bit_hdrs;
+bool var_strict_8bit_body;
+bool var_strict_encoding;
+bool var_verify_neg_cache;
+bool var_oldlog_compat;
int var_delay_max_res;
int var_sockmap_max_reply;
char *var_int_filt_classes;
-int var_cyrus_sasl_authzid;
+bool var_cyrus_sasl_authzid;
char *var_multi_conf_dirs;
char *var_multi_wrapper;
bool var_daemon_open_fatal;
bool var_dns_ncache_ttl_fix;
char *var_dsn_filter;
-int var_smtputf8_enable;
-int var_strict_smtputf8;
+bool var_smtputf8_enable;
+bool var_strict_smtputf8;
char *var_smtputf8_autoclass;
-int var_reqtls_enable;
-int var_tls_required_enable;
-int var_idna2003_compat;
+bool var_reqtls_enable;
+bool var_tls_required_enable;
+bool var_idna2003_compat;
char *var_compatibility_level;
char *var_drop_hdrs;
char *var_info_log_addr_form;
/* .nf
/*
- * This is to make it easier to auto-generate tables.
+ * Needed for version-dependent default settings.
*/
-typedef int bool;
-
#ifdef USE_TLS
#include <openssl/opensslv.h> /* OPENSSL_VERSION_NUMBER */
#include <openssl/objects.h> /* SN_* and NID_* macros */
#define VAR_DSN_DELAY_CLEARED "confirm_delay_cleared"
#define DEF_DSN_DELAY_CLEARED 0
-extern int var_dsn_delay_cleared;
+extern bool var_dsn_delay_cleared;
/*
* Queue manager: various in-core message and recipient limits.
#define DEF_SMTP_QUOTE_821_ENV 1
#define VAR_LMTP_QUOTE_821_ENV "lmtp_quote_rfc821_envelope"
#define DEF_LMTP_QUOTE_821_ENV 1
-extern int var_smtp_quote_821_env;
+extern bool var_smtp_quote_821_env;
#define VAR_SMTP_SKIP_5XX "smtp_skip_5xx_greeting"
#define DEF_SMTP_SKIP_5XX 1
#define VAR_CYRUS_SASL_AUTHZID "send_cyrus_sasl_authzid"
#define DEF_CYRUS_SASL_AUTHZID 0
-extern int var_cyrus_sasl_authzid;
+extern bool var_cyrus_sasl_authzid;
/*
* Special handling of AUTH 535 failures.
#define VAR_MAILTOOL_COMPAT "sun_mailtool_compatibility"
#define DEF_MAILTOOL_COMPAT 0
-extern int var_mailtool_compat;
+extern bool var_mailtool_compat;
/*
* How long a daemon command may take to receive or deliver a message etc.
#define VAR_SMTPD_DELAY_REJECT "smtpd_delay_reject"
#define DEF_SMTPD_DELAY_REJECT 1
-extern int var_smtpd_delay_reject;
+extern bool var_smtpd_delay_reject;
#define REJECT_UNAUTH_PIPE "reject_unauth_pipelining"
*/
#define VAR_DONT_REMOVE "dont_remove"
#define DEF_DONT_REMOVE 0
-extern bool var_dont_remove;
+extern int var_dont_remove;
/*
* Paranoia: defer messages instead of bouncing them.
#define VAR_AUTO_8BIT_ENC_HDR "detect_8bit_encoding_header"
#define DEF_AUTO_8BIT_ENC_HDR 1
-extern int var_auto_8bit_enc_hdr;
+extern bool var_auto_8bit_enc_hdr;
/*
* Bizarre.
#define VAR_CLEANUP_MASK_STRAY_CR_LF "cleanup_replace_stray_cr_lf"
#define DEF_CLEANUP_MASK_STRAY_CR_LF 1
-extern int var_cleanup_mask_stray_cr_lf;
+extern bool var_cleanup_mask_stray_cr_lf;
/*
* Share TLS sessions through tlsproxy(8).
#define DEF_SMTPUTF8_ENABLE "${{$compatibility_level} <level {1} ? " \
"{no} : {yes}}"
#endif
-extern int var_smtputf8_enable;
+extern bool var_smtputf8_enable;
#define VAR_STRICT_SMTPUTF8 "strict_smtputf8"
#define DEF_STRICT_SMTPUTF8 0
-extern int var_strict_smtputf8;
+extern bool var_strict_smtputf8;
#define VAR_SMTPUTF8_AUTOCLASS "smtputf8_autodetect_classes"
#define DEF_SMTPUTF8_AUTOCLASS MAIL_SRC_NAME_SENDMAIL ", " \
#define VAR_IDNA2003_COMPAT "enable_idna2003_compatibility"
#define DEF_IDNA2003_COMPAT "no"
-extern int var_idna2003_compat;
+extern bool var_idna2003_compat;
/*
* REQUIRETLS support (RFC 8689).
*/
#define VAR_TLSREQUIRED_ENABLE "tls_required_enable"
#define DEF_TLSREQUIRED_ENABLE "yes"
-extern int var_tls_required_enable;
+extern bool var_tls_required_enable;
#define VAR_REQTLS_ENABLE "requiretls_enable"
#define DEF_REQTLS_ENABLE "yes"
-extern int var_reqtls_enable;
+extern bool var_reqtls_enable;
#define VAR_SMTP_REQTLS_POLICY "smtp_requiretls_policy"
#define DEF_SMTP_REQTLS_POLICY "inline:{{${domain_to_ascii{$mydomain}}=opportunistic}, {.${domain_to_ascii{$mydomain}}=opportunistic}, {localhost=opportunistic}}, cidr:{{0.0.0.0/0 opportunistic}, {::/0 opportunistic}}, enforce"
#define VAR_REQTLS_REDACT_DSN "requiretls_redact_dsn"
#define DEF_REQTLS_REDACT_DSN "yes"
-extern int var_reqtls_redact_dsn;
+extern bool var_reqtls_redact_dsn;
#define VAR_REQTLS_ESMTP_HDR "requiretls_esmtp_header"
#define DEF_REQTLS_ESMTP_HDR "yes"
#define DEF_SMTP_TLSRPT_SKIP_REUSED_HS "no"
#define VAR_LMTP_TLSRPT_SKIP_REUSED_HS "lmtp_tlsrpt_skip_reused_handshakes"
#define DEF_LMTP_TLSRPT_SKIP_REUSED_HS DEF_SMTP_TLSRPT_SKIP_REUSED_HS
-extern int var_smtp_tlsrpt_skip_reused_hs;
+extern bool var_smtp_tlsrpt_skip_reused_hs;
#define VAR_SMTP_TLS_ENF_STS_MX_PAT "smtp_tls_enforce_sts_mx_patterns"
#define DEF_SMTP_TLS_ENF_STS_MX_PAT "yes"
*/
#define VAR_SMTPD_HIDE_CLIENT_SESSION "smtpd_hide_client_session"
#define DEF_SMTPD_HIDE_CLIENT_SESSION "no"
-extern int var_smtpd_hide_client_session;
+extern bool var_smtpd_hide_client_session;
/*
* SMTP server reject response filter.
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
-#define MAIL_RELEASE_DATE "20251130"
+#define MAIL_RELEASE_DATE "20251201"
#define MAIL_VERSION_NUMBER "3.11"
#ifdef SNAPSHOT
char *var_rcpt_fdelim;
char *var_local_cmd_shell;
char *var_luser_relay;
-int var_biff;
+bool var_biff;
char *var_mail_spool_dir;
char *var_mailbox_transport;
char *var_mbox_transp_maps;
char *var_cmd_exp_filter;
char *var_fwd_exp_filter;
char *var_prop_extension;
-int var_exp_own_alias;
+bool var_exp_own_alias;
char *var_deliver_hdr;
-int var_stat_home_dir;
-int var_mailtool_compat;
+bool var_stat_home_dir;
+bool var_mailtool_compat;
char *var_mailbox_lock;
long var_mailbox_limit;
bool var_frozen_delivered;
char *var_conc_pos_feedback;
char *var_conc_neg_feedback;
int var_conc_cohort_limit;
-int var_conc_feedback_debug;
+bool var_conc_feedback_debug;
int var_xport_rate_delay;
int var_dest_rate_delay;
char *var_def_filter_nexthop;
int var_qmgr_daemon_timeout;
int var_qmgr_ipc_timeout;
-int var_dsn_delay_cleared;
+bool var_dsn_delay_cleared;
int var_vrfy_pend_limit;
static QMGR_SCAN *qmgr_scans[2];
/^(static| )*(const +)?CONFIG_BOOL_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
- bool_vars["int " substr($3,2,length($3)-2) ";"] = 1
+ bool_vars["bool " substr($3,2,length($3)-2) ";"] = 1
if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
bool_table[$0] = 1
}
/^(static| )*(const +)?CONFIG_NBOOL_TABLE .*\{/,/\};/ {
if ($1 ~ /^VAR/) {
if (!owned_by_library)
- nbool_vars["int " substr($3,2,length($3)-2) ";"] = 1
+ nbool_vars["bool " substr($3,2,length($3)-2) ";"] = 1
if (++btab[$1 $2 $4 $5 $6 $7 $8 $9] == 1) {
nbool_table[$0] = 1
}
char *var_conc_pos_feedback;
char *var_conc_neg_feedback;
int var_conc_cohort_limit;
-int var_conc_feedback_debug;
+bool var_conc_feedback_debug;
int var_xport_rate_delay;
int var_dest_rate_delay;
char *var_def_filter_nexthop;
int var_qmgr_daemon_timeout;
int var_qmgr_ipc_timeout;
-int var_dsn_delay_cleared;
+bool var_dsn_delay_cleared;
int var_vrfy_pend_limit;
static QMGR_SCAN *qmgr_scans[2];
int var_smtp_rset_tmout;
int var_smtp_quit_tmout;
char *var_notify_classes;
-int var_smtp_skip_5xx_greeting;
-int var_ign_mx_lookup_err;
-int var_skip_quit_resp;
+bool var_smtp_skip_5xx_greeting;
+bool var_ign_mx_lookup_err;
+bool var_skip_quit_resp;
char *var_fallback_relay;
char *var_bestmx_transp;
char *var_error_rcpt;
-int var_smtp_always_ehlo;
-int var_smtp_never_ehlo;
+bool var_smtp_always_ehlo;
+bool var_smtp_never_ehlo;
char *var_smtp_sasl_opts;
char *var_smtp_sasl_path;
char *var_smtp_sasl_passwd;
int var_map_defer_code;
char *var_maps_rbl_domains;
char *var_rbl_reply_maps;
-int var_helo_required;
+bool var_helo_required;
int var_reject_code;
int var_defer_code;
int var_smtpd_err_sleep;
int var_non_fqdn_code;
char *var_bounce_rcpt;
char *var_error_rcpt;
-int var_smtpd_delay_reject;
+bool var_smtpd_delay_reject;
char *var_rest_classes;
-int var_strict_rfc821_env;
+bool var_strict_rfc821_env;
bool var_disable_vrfy_cmd;
char *var_canonical_maps;
char *var_send_canon_maps;
int var_virt_mailbox_code;
int var_relay_rcpt_code;
char *var_verp_clients;
-int var_show_unk_rcpt_table;
+bool var_show_unk_rcpt_table;
int var_verify_poll_count;
int var_verify_poll_delay;
char *var_smtpd_proxy_filt;
char *var_smtpd_tls_eccert_file;
char *var_smtpd_tls_eckey_file;
char *var_smtpd_tls_chain_files;
-int var_smtpd_tls_enable_rpk;
+bool var_smtpd_tls_enable_rpk;
#endif
char *var_local_transport;
char *var_virt_transport;
char *var_relay_transport;
-int var_resolve_dequoted;
+bool var_resolve_dequoted;
char *var_virt_alias_maps; /* XXX virtual_alias_domains */
char *var_virt_mailbox_maps; /* XXX virtual_mailbox_domains */
char *var_virt_alias_doms;
char *var_def_transport;
char *var_snd_def_xport_maps;
char *var_empty_addr;
-int var_show_unk_rcpt_table;
-int var_resolve_nulldom;
+bool var_show_unk_rcpt_table;
+bool var_resolve_nulldom;
char *var_remote_rwr_domain;
char *var_snd_relay_maps;
char *var_null_relay_maps_key;
char *var_null_def_xport_maps_key;
-int var_resolve_num_dom;
+bool var_resolve_num_dom;
bool var_allow_min_user;
/*
*/
extern int REMOVE(const char *);
+ /*
+ * Which bool?
+ */
+#ifndef NO_STDBOOL
+#include <stdbool.h>
+#else
+typedef int bool;
+#endif
+
/* LICENSE
/* .ad
/* .fi