extern void cancel_cutthrough_connection(BOOL, const uschar *);
extern int check_host(void *, const uschar *, const uschar **, uschar **);
extern uschar **child_exec_exim(int, BOOL, int *, BOOL, int, ...);
+extern pid_t child_open_exim_function(int *, const uschar *);
+extern pid_t child_open_exim2_function(int *, uschar *, uschar *,
+ const uschar *);
extern pid_t child_open_uid(const uschar **, const uschar **, int,
uid_t *, gid_t *, int *, int *, uschar *, BOOL);
extern BOOL cleanup_environment(void);
extern void exim_exit(int, const uschar *) NORETURN;
extern void exim_nullstd(void);
extern void exim_setugid(uid_t, gid_t, BOOL, uschar *);
-extern void exim_underbar_exit(int);
+extern void exim_underbar_exit(int, const uschar *);
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,
extern int ip_recv(client_conn_ctx *, uschar *, int, time_t);
extern int ip_socket(int, int);
-extern int ip_tcpsocket(const uschar *, uschar **, int);
+extern int ip_tcpsocket(const uschar *, uschar **, int, host_item *);
extern int ip_unixsocket(const uschar *, uschar **);
-extern int ip_streamsocket(const uschar *, uschar **, int);
+extern int ip_streamsocket(const uschar *, uschar **, int, host_item *);
extern int ipv6_nmtoa(int *, uschar *);
extern BOOL queue_action(uschar *, int, uschar **, int, int);
extern void queue_check_only(void);
+extern unsigned queue_count(void);
+extern unsigned queue_count_cached(void);
extern void queue_list(int, uschar **, int);
-extern void queue_count(void);
+#ifdef EXPERIMENTAL_QUEUE_RAMP
+extern void queue_notify_daemon(const uschar * hostname);
+#endif
extern void queue_run(uschar *, uschar *, BOOL);
extern int random_number(int);
uschar **);
extern int route_address(address_item *, address_item **, address_item **,
address_item **, address_item **, int);
-extern int route_check_prefix(const uschar *, const uschar *);
-extern int route_check_suffix(const uschar *, const uschar *);
+extern int route_check_prefix(const uschar *, const uschar *, unsigned *);
+extern int route_check_suffix(const uschar *, const uschar *, unsigned *);
extern BOOL route_findgroup(uschar *, gid_t *);
extern BOOL route_finduser(const uschar *, struct passwd **, uid_t *);
extern BOOL route_find_expanded_group(uschar *, uschar *, uschar *, gid_t *,
#else
extern BOOL is_tainted_fn(const void *);
-extern void * tainted_base, * tainted_top;
-
-return f.taint_check_slow
- ? is_tainted_fn(p) : p >= tainted_base && p < tainted_top;
+return is_tainted_fn(p);
#endif
}
return g;
}
+
+/* Copy the content of a string to tainted memory */
+
+static inline void
+gstring_rebuffer(gstring * g)
+{
+uschar * s = store_get(g->size, TRUE);
+memcpy(s, g->s, g->ptr);
+g->s = s;
+}
+
+
/******************************************************************************/
#define store_get_dns_answer() store_get_dns_answer_trc(CUS __FUNCTION__, __LINE__)
testharness_pause_ms(int millisec)
{
#ifndef MEASURE_TIMING
-if (f.running_in_test_harness) millisleep(millisec);
+if (f.running_in_test_harness && f.testsuite_delays) millisleep(millisec);
#endif
}
return NULL;
}
+/******************************************************************************/
+/* Process manipulation */
+
+static inline pid_t
+exim_fork(const unsigned char * purpose)
+{
+pid_t pid = fork();
+if (pid == 0) process_purpose = purpose;
+return pid;
+}
+
+#define child_open_exim(p, r) child_open_exim_function((p), (r))
+#define child_open_exim2(p, s, a, r) child_open_exim2_function((p), (s), (a), (r))
+
+/******************************************************************************/
#endif /* !MACRO_PREDEF */
#endif /* _FUNCTIONS_H_ */