Testsuite: output changes resulting
[exim.git] / src / src / functions.h
... / ...
CommitLineData
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
5/* Copyright (c) University of Cambridge 1995 - 2018 */
6/* See the file NOTICE for conditions of use and distribution. */
7
8
9/* Prototypes for functions that appear in various modules. Gathered together
10to avoid having a lot of tiddly little headers with only a couple of lines in
11them. However, some functions that are used (or not used) by utility programs
12are in in fact in separate headers. */
13#ifndef _FUNCTIONS_H_
14#define _FUNCTIONS_H_
15
16
17#ifdef EXIM_PERL
18extern gstring *call_perl_cat(gstring *, uschar **, uschar *,
19 uschar **) WARN_UNUSED_RESULT;
20extern void cleanup_perl(void);
21extern uschar *init_perl(uschar *);
22#endif
23
24
25#ifdef SUPPORT_TLS
26extern const char *
27 std_dh_prime_default(void);
28extern const char *
29 std_dh_prime_named(const uschar *);
30
31extern uschar * tls_cert_crl_uri(void *, uschar * mod);
32extern uschar * tls_cert_ext_by_oid(void *, uschar *, int);
33extern uschar * tls_cert_issuer(void *, uschar * mod);
34extern uschar * tls_cert_not_before(void *, uschar * mod);
35extern uschar * tls_cert_not_after(void *, uschar * mod);
36extern uschar * tls_cert_ocsp_uri(void *, uschar * mod);
37extern uschar * tls_cert_serial_number(void *, uschar * mod);
38extern uschar * tls_cert_signature(void *, uschar * mod);
39extern uschar * tls_cert_signature_algorithm(void *, uschar * mod);
40extern uschar * tls_cert_subject(void *, uschar * mod);
41extern uschar * tls_cert_subject_altname(void *, uschar * mod);
42extern uschar * tls_cert_version(void *, uschar * mod);
43
44extern uschar * tls_cert_der_b64(void * cert);
45extern uschar * tls_cert_fprt_md5(void *);
46extern uschar * tls_cert_fprt_sha1(void *);
47extern uschar * tls_cert_fprt_sha256(void *);
48
49extern BOOL tls_client_start(client_conn_ctx *, smtp_connect_args *,
50 void *, tls_support *, uschar **);
51
52extern void tls_close(void *, int);
53extern BOOL tls_could_read(void);
54extern int tls_export_cert(uschar *, size_t, void *);
55extern int tls_feof(void);
56extern int tls_ferror(void);
57extern void tls_free_cert(void **);
58extern int tls_getc(unsigned);
59extern uschar *tls_getbuf(unsigned *);
60extern void tls_get_cache(void);
61extern int tls_import_cert(const uschar *, void **);
62extern int tls_read(void *, uschar *, size_t);
63extern int tls_server_start(const uschar *, uschar **);
64extern BOOL tls_smtp_buffered(void);
65extern int tls_ungetc(int);
66extern int tls_write(void *, const uschar *, size_t, BOOL);
67extern uschar *tls_validate_require_cipher(void);
68extern void tls_version_report(FILE *);
69# ifndef USE_GNUTLS
70extern BOOL tls_openssl_options_parse(uschar *, long *);
71# endif
72extern uschar * tls_field_from_dn(uschar *, const uschar *);
73extern BOOL tls_is_name_for_cert(const uschar *, void *);
74
75# ifdef SUPPORT_DANE
76extern int tlsa_lookup(const host_item *, dns_answer *, BOOL);
77# endif
78
79#endif /*SUPPORT_TLS*/
80
81
82/* Everything else... */
83
84extern acl_block *acl_read(uschar *(*)(void), uschar **);
85extern int acl_check(int, uschar *, uschar *, uschar **, uschar **);
86extern int acl_eval(int, uschar *, uschar **, uschar **);
87
88extern tree_node *acl_var_create(uschar *);
89extern void acl_var_write(uschar *, uschar *, void *);
90
91#ifdef EXPERIMENTAL_ARC
92extern void *arc_ams_setup_sign_bodyhash(void);
93extern const uschar *arc_header_feed(gstring *, BOOL);
94extern gstring *arc_sign(const uschar *, gstring *, uschar **);
95extern void arc_sign_init(void);
96extern const uschar *acl_verify_arc(void);
97extern uschar * fn_arc_domains(void);
98#endif
99
100extern void assert_no_variables(void *, int, const char *, int);
101extern int auth_call_pam(const uschar *, uschar **);
102extern int auth_call_pwcheck(uschar *, uschar **);
103extern int auth_call_radius(const uschar *, uschar **);
104extern int auth_call_saslauthd(const uschar *, const uschar *,
105 const uschar *, const uschar *, uschar **);
106extern int auth_check_serv_cond(auth_instance *);
107extern int auth_check_some_cond(auth_instance *, uschar *, uschar *, int);
108extern int auth_client_item(void *, auth_instance *, const uschar **,
109 unsigned, int, uschar *, int);
110
111
112extern int auth_get_data(uschar **, const uschar *, int);
113extern int auth_get_no64_data(uschar **, uschar *);
114extern int auth_prompt(const uschar *);
115extern int auth_read_input(const uschar *);
116extern void auth_show_supported(FILE *);
117extern uschar *auth_xtextencode(uschar *, int);
118extern int auth_xtextdecode(uschar *, uschar **);
119
120#ifdef EXPERIMENTAL_ARC
121extern gstring *authres_arc(gstring *);
122#endif
123#ifndef DISABLE_DKIM
124extern gstring *authres_dkim(gstring *);
125#endif
126#ifdef EXPERIMENTAL_DMARC
127extern gstring *authres_dmarc(gstring *);
128#endif
129extern gstring *authres_smtpauth(gstring *);
130#ifdef SUPPORT_SPF
131extern gstring *authres_spf(gstring *);
132#endif
133
134extern uschar *b64encode(const uschar *, int);
135extern int b64decode(const uschar *, uschar **);
136extern int bdat_getc(unsigned);
137extern uschar *bdat_getbuf(unsigned *);
138extern int bdat_ungetc(int);
139extern void bdat_flush_data(void);
140
141extern void bits_clear(unsigned int *, size_t, int *);
142extern void bits_set(unsigned int *, size_t, int *);
143
144extern void cancel_cutthrough_connection(BOOL, const uschar *);
145extern int check_host(void *, const uschar *, const uschar **, uschar **);
146extern uschar **child_exec_exim(int, BOOL, int *, BOOL, int, ...);
147extern pid_t child_open_uid(const uschar **, const uschar **, int,
148 uid_t *, gid_t *, int *, int *, uschar *, BOOL);
149extern BOOL cleanup_environment(void);
150extern void cutthrough_data_puts(uschar *, int);
151extern void cutthrough_data_put_nl(void);
152extern uschar *cutthrough_finaldot(void);
153extern BOOL cutthrough_flush_send(void);
154extern BOOL cutthrough_headers_send(void);
155extern BOOL cutthrough_predata(void);
156extern void release_cutthrough_connection(const uschar *);
157
158extern void daemon_go(void);
159
160#ifdef EXPERIMENTAL_DCC
161extern int dcc_process(uschar **);
162#endif
163
164extern void debug_logging_activate(uschar *, uschar *);
165extern void debug_logging_stop(void);
166extern void debug_print_argv(const uschar **);
167extern void debug_print_ids(uschar *);
168extern void debug_printf_indent(const char *, ...) PRINTF_FUNCTION(1,2);
169extern void debug_print_string(uschar *);
170extern void debug_print_tree(tree_node *);
171extern void debug_vprintf(int, const char *, va_list);
172extern void decode_bits(unsigned int *, size_t, int *,
173 uschar *, bit_table *, int, uschar *, int);
174extern address_item *deliver_make_addr(uschar *, BOOL);
175extern void deliver_init(void);
176extern void delivery_log(int, address_item *, int, uschar *);
177extern int deliver_message(uschar *, BOOL, BOOL);
178extern void deliver_msglog(const char *, ...) PRINTF_FUNCTION(1,2);
179extern void deliver_set_expansions(address_item *);
180extern int deliver_split_address(address_item *);
181extern void deliver_succeeded(address_item *);
182
183extern uschar *deliver_get_sender_address (uschar *id);
184extern void delivery_re_exec(int);
185
186extern BOOL directory_make(const uschar *, const uschar *, int, BOOL);
187#ifndef DISABLE_DKIM
188extern uschar *dkim_exim_query_dns_txt(uschar *);
189extern void dkim_exim_sign_init(void);
190
191extern BOOL dkim_transport_write_message(transport_ctx *,
192 struct ob_dkim *, const uschar ** errstr);
193#endif
194extern dns_address *dns_address_from_rr(dns_answer *, dns_record *);
195extern int dns_basic_lookup(dns_answer *, const uschar *, int);
196extern void dns_build_reverse(const uschar *, uschar *);
197extern void dns_init(BOOL, BOOL, BOOL);
198extern BOOL dns_is_aa(const dns_answer *);
199extern BOOL dns_is_secure(const dns_answer *);
200extern int dns_lookup(dns_answer *, const uschar *, int, const uschar **);
201extern void dns_pattern_init(void);
202extern int dns_special_lookup(dns_answer *, const uschar *, int, const uschar **);
203extern dns_record *dns_next_rr(const dns_answer *, dns_scan *, int);
204extern uschar *dns_text_type(int);
205extern void dscp_list_to_stream(FILE *);
206extern BOOL dscp_lookup(const uschar *, int, int *, int *, int *);
207
208extern void enq_end(uschar *);
209extern BOOL enq_start(uschar *, unsigned);
210#ifndef DISABLE_EVENT
211extern uschar *event_raise(uschar *, const uschar *, uschar *);
212extern void msg_event_raise(const uschar *, const address_item *);
213#endif
214
215extern int exim_chown_failure(int, const uschar*, uid_t, gid_t);
216extern const uschar * exim_errstr(int);
217extern void exim_exit(int, const uschar *);
218extern void exim_nullstd(void);
219extern void exim_setugid(uid_t, gid_t, BOOL, uschar *);
220extern void exim_wait_tick(struct timeval *, int);
221extern int exp_bool(address_item *addr,
222 uschar *mtype, uschar *mname, unsigned dgb_opt, uschar *oname, BOOL bvalue,
223 uschar *svalue, BOOL *rvalue);
224extern BOOL expand_check_condition(uschar *, uschar *, uschar *);
225extern uschar *expand_file_big_buffer(const uschar *);
226extern uschar *expand_string(uschar *); /* public, cannot make const */
227extern const uschar *expand_cstring(const uschar *); /* ... so use this one */
228extern uschar *expand_hide_passwords(uschar * );
229extern uschar *expand_string_copy(const uschar *);
230extern int_eximarith_t expand_string_integer(uschar *, BOOL);
231extern void modify_variable(uschar *, void *);
232
233extern BOOL fd_ready(int, int);
234
235extern int filter_interpret(uschar *, int, address_item **, uschar **);
236extern BOOL filter_personal(string_item *, BOOL);
237extern BOOL filter_runtest(int, uschar *, BOOL, BOOL);
238extern BOOL filter_system_interpret(address_item **, uschar **);
239
240extern uschar * fn_hdrs_added(void);
241
242extern void gstring_reset_unused(gstring *);
243
244extern void header_add(int, const char *, ...);
245extern header_line *header_add_at_position_internal(BOOL, uschar *, BOOL, int, const char *, ...);
246extern int header_checkname(header_line *, BOOL);
247extern BOOL header_match(uschar *, BOOL, BOOL, string_item *, int, ...);
248extern int host_address_extract_port(uschar *);
249extern uschar *host_and_ident(BOOL);
250extern int host_aton(const uschar *, int *);
251extern void host_build_hostlist(host_item **, const uschar *, BOOL);
252extern ip_address_item *host_build_ifacelist(const uschar *, uschar *);
253extern void host_build_log_info(void);
254extern void host_build_sender_fullhost(void);
255extern int host_find_byname(host_item *, const uschar *, int,
256 const uschar **, BOOL);
257extern int host_find_bydns(host_item *, const uschar *, int, uschar *, uschar *,
258 uschar *, const dnssec_domains *, const uschar **, BOOL *);
259extern ip_address_item *host_find_interfaces(void);
260extern BOOL host_is_in_net(const uschar *, const uschar *, int);
261extern BOOL host_is_tls_on_connect_port(int);
262extern int host_item_get_port(host_item *);
263extern void host_mask(int, int *, int);
264extern int host_name_lookup(void);
265extern int host_nmtoa(int, int *, int, uschar *, int);
266extern uschar *host_ntoa(int, const void *, uschar *, int *);
267extern int host_scan_for_local_hosts(host_item *, host_item **, BOOL *);
268
269extern uschar *imap_utf7_encode(uschar *, const uschar *,
270 uschar, uschar *, uschar **);
271
272extern void invert_address(uschar *, uschar *);
273extern int ip_addr(void *, int, const uschar *, int);
274extern int ip_bind(int, int, uschar *, int);
275extern int ip_connect(int, int, const uschar *, int, int, const blob *);
276extern int ip_connectedsocket(int, const uschar *, int, int,
277 int, host_item *, uschar **, const blob *);
278extern int ip_get_address_family(int);
279extern void ip_keepalive(int, const uschar *, BOOL);
280extern int ip_recv(client_conn_ctx *, uschar *, int, int);
281extern int ip_socket(int, int);
282
283extern int ip_tcpsocket(const uschar *, uschar **, int);
284extern int ip_unixsocket(const uschar *, uschar **);
285extern int ip_streamsocket(const uschar *, uschar **, int);
286
287extern int ipv6_nmtoa(int *, uschar *);
288
289extern uschar *local_part_quote(uschar *);
290extern int log_create(uschar *);
291extern int log_create_as_exim(uschar *);
292extern void log_close_all(void);
293
294extern macro_item * macro_create(const uschar *, const uschar *, BOOL);
295extern BOOL macro_read_assignment(uschar *);
296extern uschar *macros_expand(int, int *, BOOL *);
297extern void mainlog_close(void);
298#ifdef WITH_CONTENT_SCAN
299extern int malware(const uschar *, int);
300extern int malware_in_file(uschar *);
301extern void malware_init(void);
302extern void malware_show_supported(FILE *);
303#endif
304extern int match_address_list(const uschar *, BOOL, BOOL, const uschar **,
305 unsigned int *, int, int, const uschar **);
306extern int match_address_list_basic(const uschar *, const uschar **, int);
307extern int match_check_list(const uschar **, int, tree_node **, unsigned int **,
308 int(*)(void *, const uschar *, const uschar **, uschar **), void *, int,
309 const uschar *, const uschar **);
310extern int match_isinlist(const uschar *, const uschar **, int, tree_node **,
311 unsigned int *, int, BOOL, const uschar **);
312extern int match_check_string(const uschar *, const uschar *, int, BOOL, BOOL, BOOL,
313 const uschar **);
314extern void md5_end(md5 *, const uschar *, int, uschar *);
315extern void md5_mid(md5 *, const uschar *);
316extern void md5_start(md5 *);
317extern void millisleep(int);
318#ifdef WITH_CONTENT_SCAN
319struct mime_boundary_context;
320extern int mime_acl_check(uschar *acl, FILE *f,
321 struct mime_boundary_context *, uschar **, uschar **);
322extern int mime_decode(const uschar **);
323extern ssize_t mime_decode_base64(FILE *, FILE *, uschar *);
324extern int mime_regex(const uschar **);
325extern void mime_set_anomaly(int);
326#endif
327extern uschar *moan_check_errorcopy(uschar *);
328extern BOOL moan_skipped_syntax_errors(uschar *, error_block *, uschar *,
329 BOOL, uschar *);
330extern void moan_smtp_batch(uschar *, const char *, ...) PRINTF_FUNCTION(2,3);
331extern BOOL moan_send_message(uschar *, int, error_block *eblock,
332 header_line *, FILE *, uschar *);
333extern void moan_tell_someone(uschar *, address_item *,
334 const uschar *, const char *, ...) PRINTF_FUNCTION(4,5);
335extern BOOL moan_to_sender(int, error_block *, header_line *, FILE *, BOOL);
336extern void moan_write_from(FILE *);
337extern FILE *modefopen(const uschar *, const char *, mode_t);
338
339extern int open_cutthrough_connection( address_item * addr );
340
341extern uschar *parse_extract_address(uschar *, uschar **, int *, int *, int *,
342 BOOL);
343extern int parse_forward_list(uschar *, int, address_item **, uschar **,
344 const uschar *, uschar *, error_block **);
345extern uschar *parse_find_address_end(uschar *, BOOL);
346extern uschar *parse_find_at(uschar *);
347extern const uschar *parse_fix_phrase(const uschar *, int, uschar *, int);
348extern uschar *parse_message_id(uschar *, uschar **, uschar **);
349extern const uschar *parse_quote_2047(const uschar *, int, uschar *, uschar *, int, BOOL);
350extern uschar *parse_date_time(uschar *str, time_t *t);
351extern int vaguely_random_number(int);
352#ifdef SUPPORT_TLS
353extern int vaguely_random_number_fallback(int);
354#endif
355
356extern BOOL queue_action(uschar *, int, uschar **, int, int);
357extern void queue_check_only(void);
358extern void queue_list(int, uschar **, int);
359extern void queue_count(void);
360extern void queue_run(uschar *, uschar *, BOOL);
361
362extern int random_number(int);
363extern const uschar *rc_to_string(int);
364extern int rda_interpret(redirect_block *, int, uschar *, uschar *,
365 uschar *, uschar *, uschar *, ugid_block *, address_item **,
366 uschar **, error_block **, int *, uschar *);
367extern int rda_is_filter(const uschar *);
368extern BOOL readconf_depends(driver_instance *, uschar *);
369extern void readconf_driver_init(uschar *, driver_instance **,
370 driver_info *, int, void *, int, optionlist *, int);
371extern uschar *readconf_find_option(void *);
372extern void readconf_main(BOOL);
373extern void readconf_options_from_list(optionlist *, unsigned, const uschar *, uschar *);
374extern BOOL readconf_print(uschar *, uschar *, BOOL);
375extern uschar *readconf_printtime(int);
376extern uschar *readconf_readname(uschar *, int, uschar *);
377extern int readconf_readtime(const uschar *, int, BOOL);
378extern void readconf_rest(void);
379extern uschar *readconf_retry_error(const uschar *, const uschar *, int *, int *);
380extern void readconf_save_config(const uschar *);
381extern void read_message_body(BOOL);
382extern void receive_bomb_out(uschar *, uschar *);
383extern BOOL receive_check_fs(int);
384extern BOOL receive_check_set_sender(uschar *);
385extern BOOL receive_msg(BOOL);
386extern int_eximarith_t receive_statvfs(BOOL, int *);
387extern void receive_swallow_smtp(void);
388#ifdef WITH_CONTENT_SCAN
389extern int regex(const uschar **);
390#endif
391extern BOOL regex_match_and_setup(const pcre *, const uschar *, int, int);
392extern const pcre *regex_must_compile(const uschar *, BOOL, BOOL);
393extern void retry_add_item(address_item *, uschar *, int);
394extern BOOL retry_check_address(const uschar *, host_item *, uschar *, BOOL,
395 uschar **, uschar **);
396extern retry_config *retry_find_config(const uschar *, const uschar *, int, int);
397extern BOOL retry_ultimate_address_timeout(uschar *, const uschar *,
398 dbdata_retry *, time_t);
399extern void retry_update(address_item **, address_item **, address_item **);
400extern uschar *rewrite_address(uschar *, BOOL, BOOL, rewrite_rule *, int);
401extern uschar *rewrite_address_qualify(uschar *, BOOL);
402extern header_line *rewrite_header(header_line *,
403 const uschar *, const uschar *,
404 rewrite_rule *, int, BOOL);
405extern uschar *rewrite_one(uschar *, int, BOOL *, BOOL, uschar *,
406 rewrite_rule *);
407extern void rewrite_test(uschar *);
408extern uschar *rfc2047_decode2(uschar *, BOOL, uschar *, int, int *, int *,
409 uschar **);
410extern int route_address(address_item *, address_item **, address_item **,
411 address_item **, address_item **, int);
412extern int route_check_prefix(const uschar *, const uschar *);
413extern int route_check_suffix(const uschar *, const uschar *);
414extern BOOL route_findgroup(uschar *, gid_t *);
415extern BOOL route_finduser(const uschar *, struct passwd **, uid_t *);
416extern BOOL route_find_expanded_group(uschar *, uschar *, uschar *, gid_t *,
417 uschar **);
418extern BOOL route_find_expanded_user(uschar *, uschar *, uschar *,
419 struct passwd **, uid_t *, uschar **);
420extern void route_init(void);
421extern void route_show_supported(FILE *);
422extern void route_tidyup(void);
423
424extern uschar *search_find(void *, uschar *, uschar *, int, const uschar *, int,
425 int, int *);
426extern int search_findtype(const uschar *, int);
427extern int search_findtype_partial(const uschar *, int *, const uschar **, int *,
428 int *);
429extern void *search_open(uschar *, int, int, uid_t *, gid_t *);
430extern void search_tidyup(void);
431extern void set_process_info(const char *, ...) PRINTF_FUNCTION(1,2);
432extern void sha1_end(hctx *, const uschar *, int, uschar *);
433extern void sha1_mid(hctx *, const uschar *);
434extern void sha1_start(hctx *);
435extern int sieve_interpret(uschar *, int, uschar *, uschar *, uschar *,
436 uschar *, address_item **, uschar **);
437extern void sigalrm_handler(int);
438extern BOOL smtp_buffered(void);
439extern void smtp_closedown(uschar *);
440extern void smtp_command_timeout_exit(void);
441extern void smtp_command_sigterm_exit(void);
442extern void smtp_data_timeout_exit(void);
443extern void smtp_data_sigint_exit(void);
444extern uschar *smtp_cmd_hist(void);
445extern int smtp_connect(smtp_connect_args *, const blob *);
446extern int smtp_sock_connect(host_item *, int, int, uschar *,
447 transport_instance * tb, int, const blob *);
448extern int smtp_feof(void);
449extern int smtp_ferror(void);
450extern uschar *smtp_get_connection_info(void);
451extern BOOL smtp_get_interface(uschar *, int, address_item *,
452 uschar **, uschar *);
453extern BOOL smtp_get_port(uschar *, address_item *, int *, uschar *);
454extern int smtp_getc(unsigned);
455extern uschar *smtp_getbuf(unsigned *);
456extern void smtp_get_cache(void);
457extern int smtp_handle_acl_fail(int, int, uschar *, uschar *);
458extern void smtp_log_no_mail(void);
459extern void smtp_message_code(uschar **, int *, uschar **, uschar **, BOOL);
460extern void smtp_proxy_tls(void *, uschar *, size_t, int *, int);
461extern BOOL smtp_read_response(void *, uschar *, int, int, int);
462extern void smtp_reset(void *);
463extern void smtp_respond(uschar *, int, BOOL, uschar *);
464extern void smtp_notquit_exit(uschar *, uschar *, uschar *, ...);
465extern void smtp_port_for_connect(host_item *, int);
466extern void smtp_send_prohibition_message(int, uschar *);
467extern int smtp_setup_msg(void);
468extern BOOL smtp_start_session(void);
469extern int smtp_ungetc(int);
470extern BOOL smtp_verify_helo(void);
471extern int smtp_write_command(void *, int, const char *, ...) PRINTF_FUNCTION(3,4);
472#ifdef WITH_CONTENT_SCAN
473extern int spam(const uschar **);
474extern FILE *spool_mbox(unsigned long *, const uschar *, uschar **);
475#endif
476extern void spool_clear_header_globals(void);
477extern uschar *spool_dname(const uschar *, uschar *);
478extern uschar *spool_fname(const uschar *, const uschar *, const uschar *, const uschar *);
479extern BOOL spool_move_message(uschar *, uschar *, uschar *, uschar *);
480extern int spool_open_datafile(uschar *);
481extern int spool_open_temp(uschar *);
482extern int spool_read_header(uschar *, BOOL, BOOL);
483extern uschar *spool_sname(const uschar *, uschar *);
484extern int spool_write_header(uschar *, int, uschar **);
485extern int stdin_getc(unsigned);
486extern int stdin_feof(void);
487extern int stdin_ferror(void);
488extern int stdin_ungetc(int);
489extern gstring *string_append(gstring *, int, ...) WARN_UNUSED_RESULT;
490extern gstring *string_append_listele(gstring *, uschar, const uschar *) WARN_UNUSED_RESULT;
491extern gstring *string_append_listele_n(gstring *, uschar, const uschar *, unsigned) WARN_UNUSED_RESULT;
492extern gstring *string_append2_listele_n(gstring *, const uschar *, const uschar *, unsigned) WARN_UNUSED_RESULT;
493extern uschar *string_base62(unsigned long int);
494extern gstring *string_cat (gstring *, const uschar * ) WARN_UNUSED_RESULT;
495extern gstring *string_catn(gstring *, const uschar *, int) WARN_UNUSED_RESULT;
496extern int string_compare_by_pointer(const void *, const void *);
497extern uschar *string_copy_dnsdomain(uschar *);
498extern uschar *string_copy_malloc(const uschar *);
499extern uschar *string_copylc(const uschar *);
500extern uschar *string_copynlc(uschar *, int);
501extern uschar *string_dequote(const uschar **);
502extern gstring *string_fmt_append(gstring *, const char *, ...) ALMOST_PRINTF(2,3);
503extern BOOL string_format(uschar *, int, const char *, ...) ALMOST_PRINTF(3,4);
504extern uschar *string_format_size(int, uschar *);
505extern uschar *string_from_gstring(gstring *);
506extern gstring *string_get(unsigned);
507extern int string_interpret_escape(const uschar **);
508extern int string_is_ip_address(const uschar *, int *);
509#ifdef SUPPORT_I18N
510extern BOOL string_is_utf8(const uschar *);
511#endif
512extern uschar *string_nextinlist(const uschar **, int *, uschar *, int);
513extern uschar *string_open_failed(int, const char *, ...) PRINTF_FUNCTION(2,3);
514extern const uschar *string_printing2(const uschar *, BOOL);
515extern uschar *string_split_message(uschar *);
516extern uschar *string_timediff(struct timeval *);
517extern uschar *string_timesince(struct timeval *);
518extern uschar *string_unprinting(uschar *);
519#ifdef SUPPORT_I18N
520extern uschar *string_address_utf8_to_alabel(const uschar *, uschar **);
521extern uschar *string_domain_alabel_to_utf8(const uschar *, uschar **);
522extern uschar *string_domain_utf8_to_alabel(const uschar *, uschar **);
523extern uschar *string_localpart_alabel_to_utf8(const uschar *, uschar **);
524extern uschar *string_localpart_utf8_to_alabel(const uschar *, uschar **);
525#endif
526extern gstring *string_vformat(gstring *, BOOL, const char *, va_list);
527extern int strcmpic(const uschar *, const uschar *);
528extern int strncmpic(const uschar *, const uschar *, int);
529extern uschar *strstric(uschar *, uschar *, BOOL);
530
531#ifdef EXIM_TFO_PROBE
532extern void tfo_probe(void);
533#endif
534extern void timesince(struct timeval * diff, struct timeval * then);
535extern void tls_modify_variables(tls_support *);
536extern uschar *tod_stamp(int);
537
538extern BOOL transport_check_waiting(const uschar *, const uschar *, int, uschar *,
539 BOOL *, oicf, void*);
540extern void transport_init(void);
541extern void transport_do_pass_socket(const uschar *, const uschar *,
542 const uschar *, uschar *, int);
543extern BOOL transport_pass_socket(const uschar *, const uschar *, const uschar *, uschar *,
544 int);
545extern uschar *transport_rcpt_address(address_item *, BOOL);
546extern BOOL transport_set_up_command(const uschar ***, uschar *,
547 BOOL, int, address_item *, uschar *, uschar **);
548extern void transport_update_waiting(host_item *, uschar *);
549extern BOOL transport_write_block(transport_ctx *, uschar *, int, BOOL);
550extern void transport_write_reset(int);
551extern BOOL transport_write_string(int, const char *, ...);
552extern BOOL transport_headers_send(transport_ctx *,
553 BOOL (*)(transport_ctx *, uschar *, int));
554extern void transport_show_supported(FILE *);
555extern BOOL transport_write_message(transport_ctx *, int);
556extern void tree_add_duplicate(uschar *, address_item *);
557extern void tree_add_nonrecipient(uschar *);
558extern void tree_add_unusable(host_item *);
559extern int tree_insertnode(tree_node **, tree_node *);
560extern tree_node *tree_search(tree_node *, const uschar *);
561extern void tree_write(tree_node *, FILE *);
562extern void tree_walk(tree_node *, void (*)(uschar*, uschar*, void*), void *);
563
564#ifdef WITH_CONTENT_SCAN
565extern void unspool_mbox(void);
566#endif
567#ifdef SUPPORT_I18N
568extern void utf8_version_report(FILE *);
569#endif
570
571extern int verify_address(address_item *, FILE *, int, int, int, int,
572 uschar *, uschar *, BOOL *);
573extern int verify_check_dnsbl(int, const uschar **, uschar **);
574extern int verify_check_header_address(uschar **, uschar **, int, int, int,
575 uschar *, uschar *, int, int *);
576extern int verify_check_headers(uschar **);
577extern int verify_check_header_names_ascii(uschar **);
578extern int verify_check_host(uschar **);
579extern int verify_check_notblind(BOOL);
580extern int verify_check_given_host(const uschar **, const host_item *);
581extern int verify_check_this_host(const uschar **, unsigned int *,
582 const uschar*, const uschar *, const uschar **);
583extern address_item *verify_checked_sender(uschar *);
584extern void verify_get_ident(int);
585extern BOOL verify_sender(int *, uschar **);
586extern BOOL verify_sender_preliminary(int *, uschar **);
587extern void version_init(void);
588
589extern BOOL write_chunk(transport_ctx *, uschar *, int);
590extern ssize_t write_to_fd_buf(int, const uschar *, size_t);
591
592
593/* exim_chown - in some NFSv4 setups *seemes* to be an issue with
594chown(<exim-uid>, <exim-gid>).
595
596Probably because the idmapping is broken, misconfigured or set up in
597an unusal way. (see Bug 2931). As I'm not sure, if this was a single
598case of misconfiguration, or if there are more such broken systems
599out, I try to impose as least impact as possible and for now just write
600a panic log entry pointing to the bug report. You're encouraged to
601contact the developers, if you experience this issue.
602
603fd the file descriptor (or -1 if not valid)
604name the file name for error messages or for file operations,
605 if fd is < 0
606owner the owner
607group the group
608
609returns 0 on success, -1 on failure */
610
611static inline int
612exim_fchown(int fd, uid_t owner, gid_t group, const uschar *name)
613{
614return fchown(fd, owner, group)
615 ? exim_chown_failure(fd, name, owner, group) : 0;
616}
617
618static inline int
619exim_chown(const uschar *name, uid_t owner, gid_t group)
620{
621return chown(CCS name, owner, group)
622 ? exim_chown_failure(-1, name, owner, group) : 0;
623}
624
625#endif /* _FUNCTIONS_H_ */
626
627/* vi: aw
628*/
629/* End of functions.h */