X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Ffunctions.h;h=35f8b6c832116ff308f6f371fe2c851542a2ff3f;hb=7d4064fb2ca678359a6fa29a30a00c08fa75e70a;hp=0602789597788209395d5d53a7b548429ce6d88b;hpb=237613d06f9e3b90138bef9f3d9f6401bdd378f3;p=exim.git diff --git a/src/src/functions.h b/src/src/functions.h index 060278959..35f8b6c83 100644 --- a/src/src/functions.h +++ b/src/src/functions.h @@ -13,6 +13,8 @@ are in in fact in separate headers. */ #ifndef _FUNCTIONS_H_ #define _FUNCTIONS_H_ +#include + #ifdef EXIM_PERL extern gstring *call_perl_cat(gstring *, uschar **, uschar *, @@ -46,20 +48,21 @@ extern uschar * tls_cert_fprt_md5(void *); extern uschar * tls_cert_fprt_sha1(void *); extern uschar * tls_cert_fprt_sha256(void *); +extern void tls_clean_env(void); extern BOOL tls_client_start(client_conn_ctx *, smtp_connect_args *, void *, tls_support *, uschar **); extern void tls_close(void *, int); extern BOOL tls_could_read(void); extern void tls_daemon_init(void); -extern int tls_export_cert(uschar *, size_t, void *); +extern BOOL tls_export_cert(uschar *, size_t, void *); extern int tls_feof(void); extern int tls_ferror(void); extern void tls_free_cert(void **); extern int tls_getc(unsigned); extern uschar *tls_getbuf(unsigned *); extern void tls_get_cache(void); -extern int tls_import_cert(const uschar *, void **); +extern BOOL tls_import_cert(const uschar *, void **); extern int tls_read(void *, uschar *, size_t); extern int tls_server_start(const uschar *, uschar **); extern BOOL tls_smtp_buffered(void); @@ -124,7 +127,7 @@ extern gstring *authres_arc(gstring *); #ifndef DISABLE_DKIM extern gstring *authres_dkim(gstring *); #endif -#ifdef EXPERIMENTAL_DMARC +#ifdef SUPPORT_DMARC extern gstring *authres_dmarc(gstring *); #endif extern gstring *authres_smtpauth(gstring *); @@ -186,7 +189,7 @@ extern void delivery_re_exec(int); extern BOOL directory_make(const uschar *, const uschar *, int, BOOL); #ifndef DISABLE_DKIM -extern uschar *dkim_exim_query_dns_txt(uschar *); +extern uschar *dkim_exim_query_dns_txt(const uschar *); extern void dkim_exim_sign_init(void); extern BOOL dkim_transport_write_message(transport_ctx *, @@ -195,6 +198,7 @@ extern BOOL dkim_transport_write_message(transport_ctx *, extern dns_address *dns_address_from_rr(dns_answer *, dns_record *); extern int dns_basic_lookup(dns_answer *, const uschar *, int); extern void dns_build_reverse(const uschar *, uschar *); +extern time_t dns_expire_from_soa(dns_answer *, int); extern void dns_init(BOOL, BOOL, BOOL); extern BOOL dns_is_aa(const dns_answer *); extern BOOL dns_is_secure(const dns_answer *); @@ -334,6 +338,7 @@ extern void moan_tell_someone(uschar *, address_item *, const uschar *, const char *, ...) PRINTF_FUNCTION(4,5); 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 *); extern FILE *modefopen(const uschar *, const char *, mode_t); extern int open_cutthrough_connection( address_item * addr ); @@ -474,13 +479,10 @@ extern int spam(const uschar **); extern FILE *spool_mbox(unsigned long *, const uschar *, uschar **); #endif extern void spool_clear_header_globals(void); -extern uschar *spool_dname(const uschar *, uschar *); -extern uschar *spool_fname(const uschar *, const uschar *, const uschar *, const uschar *); extern BOOL spool_move_message(uschar *, uschar *, uschar *, uschar *); extern int spool_open_datafile(uschar *); extern int spool_open_temp(uschar *); extern int spool_read_header(uschar *, BOOL, BOOL); -extern uschar *spool_sname(const uschar *, uschar *); extern int spool_write_header(uschar *, int, uschar **); extern int stdin_getc(unsigned); extern int stdin_feof(void); @@ -508,8 +510,6 @@ extern BOOL string_is_utf8(const uschar *); extern uschar *string_nextinlist(const uschar **, int *, uschar *, int); extern const uschar *string_printing2(const uschar *, BOOL); extern uschar *string_split_message(uschar *); -extern uschar *string_timediff(struct timeval *); -extern uschar *string_timesince(struct timeval *); extern uschar *string_unprinting(uschar *); #ifdef SUPPORT_I18N extern uschar *string_address_utf8_to_alabel(const uschar *, uschar **); @@ -539,10 +539,10 @@ extern int strcmpic(const uschar *, const uschar *); extern int strncmpic(const uschar *, const uschar *, int); extern uschar *strstric(uschar *, uschar *, BOOL); +extern int test_harness_fudged_queue_time(int); #ifdef EXIM_TFO_PROBE extern void tfo_probe(void); #endif -extern void timesince(struct timeval * diff, struct timeval * then); extern void tls_modify_variables(tls_support *); extern uschar *tod_stamp(int); @@ -850,6 +850,126 @@ return g; } /******************************************************************************/ + +#define store_get_dns_answer() store_get_dns_answer_trc(CUS __FUNCTION__, __LINE__) + +static inline dns_answer * +store_get_dns_answer_trc(const uschar * func, unsigned line) +{ +return store_get_3(sizeof(dns_answer), TRUE, CCS func, line); /* use tainted mem */ +} + +/******************************************************************************/ +/* Routines with knowledge of spool layout */ + +# ifndef COMPILE_UTILITY +static inline void +spool_pname_buf(uschar * buf, int len) +{ +snprintf(CS buf, len, "%s/%s/input", spool_directory, queue_name); +} + +static inline uschar * +spool_dname(const uschar * purpose, uschar * subdir) +{ +return string_sprintf("%s/%s/%s/%s", + spool_directory, queue_name, purpose, subdir); +} +# endif + +static inline uschar * +spool_q_sname(const uschar * purpose, const uschar * q, uschar * subdir) +{ +return string_sprintf("%s%s%s%s%s", + q, *q ? "/" : "", + purpose, + *subdir ? "/" : "", subdir); +} + +static inline uschar * +spool_sname(const uschar * purpose, uschar * subdir) +{ +return spool_q_sname(purpose, queue_name, subdir); +} + +static inline uschar * +spool_q_fname(const uschar * purpose, const uschar * q, + const uschar * subdir, const uschar * fname, const uschar * suffix) +{ +return string_sprintf("%s/%s/%s/%s/%s%s", + spool_directory, q, purpose, subdir, fname, suffix); +} + +static inline uschar * +spool_fname(const uschar * purpose, const uschar * subdir, const uschar * fname, + const uschar * suffix) +{ +return spool_q_fname(purpose, queue_name, subdir, fname, suffix); +} + +static inline void +set_subdir_str(uschar * subdir_str, const uschar * name, + int search_sequence) +{ +subdir_str[0] = split_spool_directory == (search_sequence == 0) + ? name[5] : '\0'; +subdir_str[1] = '\0'; +} + +/******************************************************************************/ +static inline void +timesince(struct timeval * diff, struct timeval * then) +{ +gettimeofday(diff, NULL); +diff->tv_sec -= then->tv_sec; +if ((diff->tv_usec -= then->tv_usec) < 0) + { + diff->tv_sec--; + diff->tv_usec += 1000*1000; + } +} + +static inline uschar * +string_timediff(struct timeval * diff) +{ +static uschar buf[sizeof("0.000s")]; + +if (diff->tv_sec >= 5 || !LOGGING(millisec)) + return readconf_printtime((int)diff->tv_sec); + +sprintf(CS buf, "%u.%03us", (uint)diff->tv_sec, (uint)diff->tv_usec/1000); +return buf; +} + + +static inline uschar * +string_timesince(struct timeval * then) +{ +struct timeval diff; +timesince(&diff, then); +return string_timediff(&diff); +} + +static inline void +report_time_since(struct timeval * t0, uschar * where) +{ +# ifdef MEASURE_TIMING +struct timeval diff; +timesince(&diff, t0); +fprintf(stderr, "%d %s:\t%ld.%06ld\n", + (uint)getpid(), where, (long)diff.tv_sec, (long)diff.tv_usec); +# endif +} + + +static inline void +testharness_pause_ms(int millisec) +{ +#ifndef MEASURE_TIMING +if (f.running_in_test_harness) millisleep(millisec); +#endif +} + #endif /* !MACRO_PREDEF */ #endif /* _FUNCTIONS_H_ */