X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/3f77bd134b64c532748b83c3931df07058268b5e..master:/src/src/functions.h diff --git a/src/src/functions.h b/src/src/functions.h index d811c62a3..875ce25a6 100644 --- a/src/src/functions.h +++ b/src/src/functions.h @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) The Exim Maintainers 2020 - 2023 */ +/* Copyright (c) The Exim Maintainers 2020 - 2024 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* SPDX-License-Identifier: GPL-2.0-or-later */ @@ -19,14 +19,6 @@ are in in fact in separate headers. */ #include -#ifdef EXIM_PERL -extern gstring *call_perl_cat(gstring *, uschar **, uschar *, - uschar **) WARN_UNUSED_RESULT; -extern void cleanup_perl(void); -extern uschar *init_perl(uschar *); -#endif - - #ifndef DISABLE_TLS extern const char * std_dh_prime_default(void); @@ -107,23 +99,11 @@ extern uschar *acl_standalone_setvar(const uschar *, BOOL); extern tree_node *acl_var_create(uschar *); extern void acl_var_write(uschar *, uschar *, void *); +extern void add_driver_info(driver_info **, const driver_info *, size_t); -#ifdef EXPERIMENTAL_ARC -# ifdef SUPPORT_DMARC -extern gstring *arc_dmarc_hist_append(gstring *); -# endif -extern void *arc_ams_setup_sign_bodyhash(void); -extern const uschar *arc_header_feed(gstring *, BOOL); -extern gstring *arc_sign(const uschar *, gstring *, uschar **); -extern void arc_sign_init(void); -extern const uschar *acl_verify_arc(void); -extern uschar * fn_arc_domains(void); -#endif extern void assert_no_variables(void *, int, const char *, int); -extern int auth_call_pam(const uschar *, uschar **); extern int auth_call_pwcheck(uschar *, uschar **); -extern int auth_call_radius(const uschar *, uschar **); extern int auth_call_saslauthd(const uschar *, const uschar *, const uschar *, const uschar *, uschar **); extern int auth_check_serv_cond(auth_instance *); @@ -137,23 +117,9 @@ extern int auth_get_no64_data(uschar **, uschar *); extern int auth_prompt(const uschar *); extern int auth_read_input(const uschar *); extern gstring * auth_show_supported(gstring *); -extern uschar *auth_xtextencode(uschar *, int); -extern int auth_xtextdecode(uschar *, uschar **); extern uschar *authenticator_current_name(void); -#ifdef EXPERIMENTAL_ARC -extern gstring *authres_arc(gstring *); -#endif -#ifndef DISABLE_DKIM -extern gstring *authres_dkim(gstring *); -#endif -#ifdef SUPPORT_DMARC -extern gstring *authres_dmarc(gstring *); -#endif extern gstring *authres_smtpauth(gstring *); -#ifdef SUPPORT_SPF -extern gstring *authres_spf(gstring *); -#endif extern uschar *b64encode(const uschar *, int); extern uschar *b64encode_taint(const uschar *, int, const void *); @@ -228,13 +194,6 @@ extern void delivery_re_exec(int); extern void die_tainted(const uschar *, const uschar *, int); extern BOOL directory_make(const uschar *, const uschar *, int, BOOL); -#ifndef DISABLE_DKIM -extern uschar *dkim_exim_query_dns_txt(const uschar *); -extern void dkim_exim_sign_init(void); - -extern BOOL dkim_transport_write_message(transport_ctx *, - struct ob_dkim *, const uschar ** errstr); -#endif extern dns_address *dns_address_from_rr(dns_answer *, dns_record *); extern int dns_basic_lookup(dns_answer *, const uschar *, int); extern uschar *dns_build_reverse(const uschar *); @@ -253,7 +212,7 @@ extern BOOL dscp_lookup(const uschar *, int, int *, int *, int *); extern void enq_end(uschar *); extern BOOL enq_start(uschar *, unsigned); #ifndef DISABLE_EVENT -extern uschar *event_raise(uschar *, const uschar *, uschar *, int *); +extern uschar *event_raise(const uschar *, const uschar *, const uschar *, int *); extern void msg_event_raise(const uschar *, const address_item *); #endif @@ -265,10 +224,10 @@ extern void exim_nullstd(void); extern void exim_setugid(uid_t, gid_t, BOOL, const uschar *); extern void exim_underbar_exit(int) NORETURN; extern void exim_wait_tick(struct timeval *, int); -extern int exp_bool(address_item *addr, - uschar *mtype, uschar *mname, unsigned dgb_opt, uschar *oname, BOOL bvalue, - uschar *svalue, BOOL *rvalue); -extern BOOL expand_check_condition(uschar *, uschar *, uschar *); +extern int exp_bool(address_item *, + const uschar *, const uschar *, unsigned, uschar *, BOOL bvalue, + const uschar *, BOOL *); +extern BOOL expand_check_condition(const uschar *, const uschar *, const uschar *); extern uschar *expand_file_big_buffer(const uschar *); extern uschar *expand_string(uschar *); /* public, cannot make const */ extern const uschar *expand_string_2(const uschar *, BOOL *); @@ -281,11 +240,7 @@ extern int_eximarith_t expand_string_integer(uschar *, BOOL); extern void modify_variable(uschar *, void *); extern BOOL fd_ready(int, time_t); - -extern int filter_interpret(const uschar *, int, address_item **, uschar **); -extern BOOL filter_personal(string_item *, BOOL); extern BOOL filter_runtest(int, const uschar *, BOOL, BOOL); -extern BOOL filter_system_interpret(address_item **, uschar **); extern uschar * fn_hdrs_added(void); extern void force_fd(int, int); @@ -311,7 +266,7 @@ extern BOOL host_is_tls_on_connect_port(int); extern int host_item_get_port(host_item *); extern void host_mask(int, int *, int); extern int host_name_lookup(void); -extern int host_nmtoa(int, int *, int, uschar *, int); +extern int host_nmtoa(int, const int *, int, uschar *, int); extern uschar *host_ntoa(int, const void *, uschar *, int *); extern int host_scan_for_local_hosts(host_item *, host_item **, BOOL *); @@ -338,6 +293,11 @@ extern int ipv6_nmtoa(int *, uschar *); extern const uschar *local_part_quote(const uschar *); extern int log_open_as_exim(const uschar * const); extern void log_close_all(void); +extern const lookup_info * lookup_with_acq_num(unsigned); +#ifdef LOOKUP_MODULE_DIR +extern BOOL lookup_one_mod_load(const uschar *, uschar **); +#endif + extern macro_item * macro_create(const uschar *, const uschar *, BOOL); extern BOOL macro_read_assignment(uschar *); @@ -375,6 +335,14 @@ extern ssize_t mime_decode_base64(FILE *, FILE *, uschar *); extern int mime_regex(const uschar **, BOOL); extern void mime_set_anomaly(int); #endif + +extern gstring *misc_mod_authres(gstring *); +extern int misc_mod_conn_init(const uschar *, const uschar *); +extern misc_module_info * misc_mod_find(const uschar * modname, uschar **); +extern misc_module_info * misc_mod_findonly(const uschar * modname); +extern int misc_mod_msg_init(void); +extern void misc_mod_smtp_reset(void); + extern uschar *moan_check_errorcopy(const uschar *); extern BOOL moan_skipped_syntax_errors(uschar *, error_block *, uschar *, BOOL, uschar *); @@ -386,6 +354,9 @@ extern void moan_tell_someone(uschar *, address_item *, extern BOOL moan_to_sender(int, error_block *, header_line *, FILE *, BOOL); extern void moan_write_from(FILE *); extern void moan_write_references(FILE *, uschar *); +#ifdef LOOKUP_MODULE_DIR +//extern void mod_load_check(const uschar *); +#endif extern FILE *modefopen(const uschar *, const char *, mode_t); extern int open_cutthrough_connection( address_item * addr ); @@ -420,14 +391,14 @@ extern void queue_run(qrunner *, const uschar *, const uschar *, BOOL); extern int random_number(int); extern const uschar *rc_to_string(int); -extern int rda_interpret(redirect_block *, int, const uschar *, const uschar *, - const uschar *, const uschar *, const uschar *, const ugid_block *, address_item **, - uschar **, error_block **, int *, const uschar *); +extern int rda_interpret(redirect_block *, int, const uschar *, + const sieve_block *, const ugid_block *, address_item **, + uschar **, error_block **, int *, const uschar *); extern int rda_is_filter(const uschar *); extern BOOL readconf_depends(driver_instance *, uschar *); -extern void readconf_driver_init(uschar *, driver_instance **, - driver_info *, int, void *, int, optionlist *, int); -extern uschar *readconf_find_option(void *); +extern void readconf_driver_init(driver_instance **, driver_info **, int, + void *, int, optionlist *, int, const uschar *); +extern const uschar *readconf_find_option(void *); extern void readconf_main(BOOL); extern void readconf_options_from_list(optionlist *, unsigned, const uschar *, uschar *); extern BOOL readconf_print(const uschar *, const uschar *, BOOL); @@ -444,6 +415,7 @@ extern BOOL receive_check_set_sender(const uschar *); extern BOOL receive_msg(BOOL); extern int_eximarith_t receive_statvfs(BOOL, int *); extern void receive_swallow_smtp(void); +extern int recv_fd_from_sock(int); #ifdef WITH_CONTENT_SCAN extern int regex(const uschar **, BOOL); extern void regex_vars_clear(void); @@ -454,11 +426,14 @@ extern BOOL regex_match_and_setup(const pcre2_code *, const uschar *, int, in extern const pcre2_code *regex_compile(const uschar *, mcs_flags, uschar **, pcre2_compile_context *); extern const pcre2_code *regex_must_compile(const uschar *, mcs_flags, BOOL); -extern void retry_add_item(address_item *, uschar *, int); + +extern void retry_add_item(address_item *, const uschar *, int); extern BOOL retry_check_address(const uschar *, host_item *, uschar *, BOOL, - uschar **, uschar **); + const uschar **, const uschar **); extern retry_config *retry_find_config(const uschar *, const uschar *, int, int); -extern BOOL retry_ultimate_address_timeout(uschar *, const uschar *, +extern const uschar *retry_host_key_build(const host_item *, BOOL, + const uschar *); +extern BOOL retry_ultimate_address_timeout(const uschar *, const uschar *, dbdata_retry *, time_t); extern void retry_update(address_item **, address_item **, address_item **); extern const uschar *rewrite_address(const uschar *, BOOL, BOOL, rewrite_rule *, int); @@ -486,22 +461,22 @@ extern gstring * route_show_supported(gstring *); extern void route_tidyup(void); extern uschar *router_current_name(void); -extern uschar *search_args(int, uschar *, uschar *, uschar **, const uschar *); -extern uschar *search_find(void *, const uschar *, uschar *, int, +extern uschar *search_args(const lookup_info *, uschar *, uschar *, uschar **, + const uschar *); +extern uschar *search_find(void *, const uschar *, const uschar *, int, const uschar *, int, int, int *, const uschar *); -extern int search_findtype(const uschar *, int); -extern int search_findtype_partial(const uschar *, int *, const uschar **, int *, - int *, const uschar **); -extern void *search_open(const uschar *, int, int, uid_t *, gid_t *); +extern const lookup_info * search_findtype(const uschar *, int); +extern const lookup_info * search_findtype_partial(const uschar *, int *, + const uschar **, int *, int *, const uschar **); +extern void *search_open(const uschar *, const lookup_info *, int, + uid_t *, gid_t *); extern void search_tidyup(void); +extern BOOL send_fd_over_socket(int, int); extern uschar *sender_helo_verified_boolstr(void); extern void set_process_info(const char *, ...) PRINTF_FUNCTION(1,2); extern void sha1_end(hctx *, const uschar *, int, uschar *); extern void sha1_mid(hctx *, const uschar *); extern void sha1_start(hctx *); -extern int sieve_interpret(const uschar *, int, const uschar *, - const uschar *, const uschar *, const uschar *, - address_item **, uschar **); extern void sigalrm_handler(int); extern void single_queue_run(qrunner *, const uschar *, const uschar *); extern int smtp_boundsock(smtp_connect_args *); @@ -537,6 +512,7 @@ extern int smtp_setup_msg(void); extern int smtp_sock_connect(smtp_connect_args *, int, const blob *); extern BOOL smtp_start_session(void); extern int smtp_ungetc(int); +extern void smtp_verify_feed(const uschar *, unsigned); extern BOOL smtp_verify_helo(void); extern int smtp_write_command(void *, int, const char *, ...) PRINTF_FUNCTION(3,4); #ifdef WITH_CONTENT_SCAN @@ -564,10 +540,10 @@ extern void store_writeprotect(int); extern gstring *string_append(gstring *, int, ...) WARN_UNUSED_RESULT; extern gstring *string_append_listele(gstring *, uschar, const uschar *) WARN_UNUSED_RESULT; extern gstring *string_append_listele_n(gstring *, uschar, const uschar *, unsigned) WARN_UNUSED_RESULT; +extern gstring *string_append_listele_fmt(gstring *, uschar, BOOL, const char *, ...) WARN_UNUSED_RESULT; extern gstring *string_append2_listele_n(gstring *, const uschar *, const uschar *, unsigned) WARN_UNUSED_RESULT; extern uschar *string_base62_32(unsigned long int); extern uschar *string_base62_64(unsigned long int); -extern gstring *string_cat (gstring *, const uschar * ) WARN_UNUSED_RESULT; extern gstring *string_catn(gstring *, const uschar *, int) WARN_UNUSED_RESULT; extern int string_compare_by_pointer(const void *, const void *); extern uschar *string_copy_dnsdomain(uschar *); @@ -631,15 +607,10 @@ extern uschar *transport_current_name(void); extern void transport_do_pass_socket(const uschar *, const uschar *, const uschar *, uschar *, int); extern void transport_init(void); -extern BOOL transport_pass_socket(const uschar *, const uschar *, const uschar *, uschar *, int -#ifndef DISABLE_ESMTP_LIMITS - , unsigned, unsigned, unsigned -#endif - ); extern const uschar *transport_rcpt_address(address_item *, BOOL); extern BOOL transport_set_up_command(const uschar ***, const uschar *, unsigned, int, address_item *, const uschar *, uschar **); -extern void transport_update_waiting(host_item *, uschar *); +extern void transport_update_waiting(host_item *, const uschar *); extern BOOL transport_write_block(transport_ctx *, uschar *, int, BOOL); extern void transport_write_reset(int); extern BOOL transport_write_string(int, const char *, ...); @@ -695,6 +666,8 @@ extern uschar *wrap_header(const uschar *, unsigned, unsigned, const uschar *, u extern uschar * xclient_smtp_command(uschar *, int *, BOOL *); extern gstring * xclient_smtp_advertise_str(gstring *); #endif +extern uschar *xtextencode(uschar *, int); +extern int xtextdecode(uschar *, uschar **); /******************************************************************************/ @@ -1050,6 +1023,18 @@ if (g) store_release_above_3(g->s + (g->size = g->ptr + 1), file, line); } +/* plain string append to a growable-string */ + +static inline gstring * string_cat(gstring * g, const uschar * s) + WARN_UNUSED_RESULT; + +static inline gstring * +string_cat(gstring * g, const uschar * s) +{ +return string_catn(g, s, Ustrlen(s)); +} + + /* sprintf-append to a growable-string */ #define string_fmt_append(g, fmt, ...) \ @@ -1085,10 +1070,11 @@ g->s = s; } /* Append one gstring to another */ + static inline gstring * gstring_append(gstring * dest, gstring * item) { -return string_catn(dest, item->s, item->ptr); +return item ? string_catn(dest, item->s, item->ptr) : dest; } @@ -1244,12 +1230,13 @@ timediff(diff, then); static inline uschar * string_timediff(const struct timeval * diff) { -static uschar buf[sizeof("0.000s")]; +static uschar buf[16]; if (diff->tv_sec >= 5 || !LOGGING(millisec)) return readconf_printtime((int)diff->tv_sec); -snprintf(CS buf, sizeof(buf), "%u.%03us", (uint)diff->tv_sec, (uint)diff->tv_usec/1000); +snprintf(CS buf, sizeof(buf), "%u.%03us", + (uint)diff->tv_sec, (uint)diff->tv_usec/1000); return buf; } @@ -1340,6 +1327,20 @@ return NULL; /******************************************************************************/ # if !defined(COMPILE_UTILITY) + +/* We use the PID of the head process for a connection-id. Note that +this is only for tracking a received connection and what it directly +causes; there is no inttent to describe transport-initiated TCP connections. +The value is intented to be a cookie usable for logging, and we might change +the generator for it at any time. */ + +static inline void +set_connection_id(void) +{ +connection_id = string_sprintf("%lu", (u_long)getpid()); +} + + /* Process manipulation */ static inline pid_t @@ -1389,6 +1390,19 @@ return poll(&p, 1, tmo_millisec); /******************************************************************************/ /* Client-side smtp log string, for debug */ +static inline void +smtp_debug_cmd_log_init(void) +{ +# ifndef DISABLE_CLIENT_CMD_LOG +int old_pool = store_pool; +store_pool = POOL_PERM; +client_cmd_log = string_get_tainted(56, GET_TAINTED); +*client_cmd_log->s = '\0'; +store_pool = old_pool; +# endif +} + + static inline void smtp_debug_cmd(const uschar * buf, int mode) { @@ -1397,31 +1411,46 @@ HDEBUG(D_transport|D_acl|D_v) debug_printf_indent(" SMTP%c> %s\n", # ifndef DISABLE_CLIENT_CMD_LOG { - int len = Ustrcspn(buf, " \n"); - int old_pool = store_pool; + int len = Ustrcspn(buf, " \n"), old_pool = store_pool; store_pool = POOL_PERM; /* Main pool ACL allocations eg. callouts get released */ client_cmd_log = string_append_listele_n(client_cmd_log, ':', buf, MIN(len, 8)); if (mode == SCMD_BUFFER) - { client_cmd_log = string_catn(client_cmd_log, US"|", 1); - (void) string_from_gstring(client_cmd_log); - } else if (mode == SCMD_MORE) - { client_cmd_log = string_catn(client_cmd_log, US"+", 1); - (void) string_from_gstring(client_cmd_log); - } store_pool = old_pool; } # endif } +/* This might be called both due to callout and then from delivery. +Use memory that will not be released between those phases. +*/ +static inline void +smtp_debug_resp(const uschar * buf) +{ +# ifndef DISABLE_CLIENT_CMD_LOG +int old_pool = store_pool; +store_pool = POOL_PERM; +client_cmd_log = string_append_listele_n(client_cmd_log, ':', buf, + buf[3] == '-' ? 4 : 3); +store_pool = old_pool; +# endif +} + + static inline void smtp_debug_cmd_report(void) { # ifndef DISABLE_CLIENT_CMD_LOG -debug_printf("cmdlog: '%s'\n", client_cmd_log ? client_cmd_log->s : US"(unset)"); +if (client_cmd_log && *client_cmd_log->s) + { + debug_printf("cmdlog: '%Y'\n", client_cmd_log); + gstring_reset(client_cmd_log); + } +else + debug_printf("cmdlog: (unset)\n"); # endif }