X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=blobdiff_plain;f=src%2Fsrc%2Ffunctions.h;h=fbddd35199517d98b35854daa91308e5cc85b229;hp=03596064678024e7cd0bcab74592b661f463d2e9;hb=1e1ddfac79fbcd052f199500a6493c7f79cb8462;hpb=46d2a5e6f6e7709d172903b13945d23fc0a2c888 diff --git a/src/src/functions.h b/src/src/functions.h index 035960646..fbddd3519 100644 --- a/src/src/functions.h +++ b/src/src/functions.h @@ -3,6 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2018 */ +/* Copyright (c) The Exim Maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -13,6 +14,7 @@ are in in fact in separate headers. */ #ifndef _FUNCTIONS_H_ #define _FUNCTIONS_H_ +#include #include @@ -118,7 +120,7 @@ extern int auth_get_data(uschar **, const uschar *, int); extern int auth_get_no64_data(uschar **, uschar *); extern int auth_prompt(const uschar *); extern int auth_read_input(const uschar *); -extern void auth_show_supported(FILE *); +extern gstring * auth_show_supported(gstring *); extern uschar *auth_xtextencode(uschar *, int); extern int auth_xtextdecode(uschar *, uschar **); @@ -148,6 +150,8 @@ extern void bits_clear(unsigned int *, size_t, int *); extern void bits_set(unsigned int *, size_t, int *); extern void cancel_cutthrough_connection(BOOL, const uschar *); +extern gstring *cat_file(FILE *, gstring *, uschar *); +extern gstring *cat_file_tls(void *, gstring *, 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 *); @@ -239,6 +243,8 @@ extern BOOL expand_check_condition(uschar *, uschar *, uschar *); extern uschar *expand_file_big_buffer(const uschar *); extern uschar *expand_string(uschar *); /* public, cannot make const */ extern const uschar *expand_cstring(const uschar *); /* ... so use this one */ +extern uschar *expand_getkeyed(const uschar *, const uschar *); + extern uschar *expand_hide_passwords(uschar * ); extern uschar *expand_string_copy(const uschar *); extern int_eximarith_t expand_string_integer(uschar *, BOOL); @@ -311,7 +317,7 @@ extern void mainlog_close(void); extern int malware(const uschar *, int); extern int malware_in_file(uschar *); extern void malware_init(void); -extern void malware_show_supported(FILE *); +extern gstring * malware_show_supported(gstring *); #endif extern int match_address_list(const uschar *, BOOL, BOOL, const uschar **, unsigned int *, int, int, const uschar **); @@ -435,15 +441,15 @@ extern BOOL route_find_expanded_group(uschar *, uschar *, uschar *, gid_t *, extern BOOL route_find_expanded_user(uschar *, uschar *, uschar *, struct passwd **, uid_t *, uschar **); extern void route_init(void); -extern void route_show_supported(FILE *); +extern gstring * route_show_supported(gstring *); extern void route_tidyup(void); -extern uschar *search_find(void *, uschar *, uschar *, int, const uschar *, int, - int, int *); +extern uschar *search_find(void *, const uschar *, 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 *); -extern void *search_open(uschar *, int, int, uid_t *, gid_t *); + int *, const uschar **); +extern void *search_open(const uschar *, int, int, uid_t *, gid_t *); extern void search_tidyup(void); extern void set_process_info(const char *, ...) PRINTF_FUNCTION(1,2); extern void sha1_end(hctx *, const uschar *, int, uschar *); @@ -520,7 +526,6 @@ extern int string_is_ip_address(const uschar *, int *); #ifdef SUPPORT_I18N extern BOOL string_is_utf8(const uschar *); #endif -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_unprinting(uschar *); @@ -548,6 +553,11 @@ extern gstring *string_vformat_trc(gstring *, const uschar *, unsigned, extern uschar *string_open_failed_trc(int, const uschar *, unsigned, const char *, ...) PRINTF_FUNCTION(4,5); +#define string_nextinlist(lp, sp, b, l) \ + string_nextinlist_trc((lp), (sp), (b), (l), US __FUNCTION__, __LINE__) +extern uschar *string_nextinlist_trc(const uschar **listptr, int *separator, uschar *buffer, int buflen, + const uschar * func, int line); + extern int strcmpic(const uschar *, const uschar *); extern int strncmpic(const uschar *, const uschar *, int); extern uschar *strstric(uschar *, uschar *, BOOL); @@ -576,7 +586,7 @@ extern void transport_write_reset(int); extern BOOL transport_write_string(int, const char *, ...); extern BOOL transport_headers_send(transport_ctx *, BOOL (*)(transport_ctx *, uschar *, int)); -extern void transport_show_supported(FILE *); +extern gstring * transport_show_supported(gstring *); extern BOOL transport_write_message(transport_ctx *, int); extern void tree_add_duplicate(uschar *, address_item *); extern void tree_add_nonrecipient(uschar *); @@ -666,6 +676,15 @@ return US strncpy(CS dst, CCS src, n); /*XXX will likely need unchecked copy also */ +/* Advance the string pointer given over any whitespace. +Return the next char as there's enought places using it to be useful. */ + +#define Uskip_whitespace(sp) skip_whitespace(CUSS sp) + +static inline uschar skip_whitespace(const uschar ** sp) +{ while (isspace(**sp)) (*sp)++; return **sp; } + + /******************************************************************************/ #if !defined(MACRO_PREDEF) && !defined(COMPILE_UTILITY) @@ -1066,7 +1085,7 @@ static inline int exim_open2(const char *pathname, int flags) { if (!is_tainted(pathname)) return open(pathname, flags); -log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'\n", pathname); +log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'", pathname); errno = EACCES; return -1; } @@ -1074,7 +1093,7 @@ static inline int exim_open(const char *pathname, int flags, mode_t mode) { if (!is_tainted(pathname)) return open(pathname, flags, mode); -log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'\n", pathname); +log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'", pathname); errno = EACCES; return -1; } @@ -1082,7 +1101,7 @@ static inline int exim_openat(int dirfd, const char *pathname, int flags) { if (!is_tainted(pathname)) return openat(dirfd, pathname, flags); -log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'\n", pathname); +log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'", pathname); errno = EACCES; return -1; } @@ -1090,7 +1109,7 @@ static inline int exim_openat4(int dirfd, const char *pathname, int flags, mode_t mode) { if (!is_tainted(pathname)) return openat(dirfd, pathname, flags, mode); -log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'\n", pathname); +log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'", pathname); errno = EACCES; return -1; } @@ -1099,12 +1118,22 @@ static inline FILE * exim_fopen(const char *pathname, const char *mode) { if (!is_tainted(pathname)) return fopen(pathname, mode); -log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'\n", pathname); +log_write(0, LOG_MAIN|LOG_PANIC, "Tainted filename '%s'", pathname); +errno = EACCES; +return NULL; +} + +static inline DIR * +exim_opendir(const uschar * name) +{ +if (!is_tainted(name)) return opendir(CCS name); +log_write(0, LOG_MAIN|LOG_PANIC, "Tainted dirname '%s'", name); errno = EACCES; return NULL; } /******************************************************************************/ +# if !defined(COMPILE_UTILITY) /* Process manipulation */ static inline pid_t @@ -1142,6 +1171,7 @@ child_open(uschar **argv, uschar **envp, int newumask, int *infdptr, outfdptr, make_leader, purpose); } +# endif /* !COMPILE_UTILITY */ /******************************************************************************/ #endif /* !MACRO_PREDEF */