-/* $Cambridge: exim/src/src/local_scan.h,v 1.2 2004/12/16 15:11:47 tom Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* This file is the header that is the only Exim header to be included in the
source for the local_scan.c() function. It contains definitions that are made
-available for use in that function, and which are documented. */
+available for use in that function, and which are documented.
+
+This API is also used for functions called by the ${dlfunc expansion item. */
-/* Some basic types that make some things easier, and the store functions. */
+/* Some basic types that make some things easier, the Exim configuration
+settings, and the store functions. */
+#include <stdarg.h>
#include <sys/types.h>
+#include "config.h"
#include "mytypes.h"
#include "store.h"
};
-/* Return codes from the support functions lss_match_xxx(). */
+/* Functions called by ${dlfunc{file}{func}{arg}...} return one of the five
+status codes defined immediately below. The function's first argument is either
+the result of expansion, or the error message in case of failure. The second
+and third arguments are standard argument count and vector, comprising the
+{arg} values specified in the expansion item. */
+
+typedef int exim_dlfunc_t(uschar **yield, int argc, uschar *argv[]);
+
+
+/* Return codes from the support functions lss_match_xxx(). These are also the
+codes that dynamically-loaded ${dlfunc functions must return. */
#define OK 0 /* Successful match */
#define DEFER 1 /* Defer - some problem */
#define FAIL 2 /* Matching failed */
#define ERROR 3 /* Internal or config error */
+/* Extra return code for ${dlfunc functions */
+
+#define FAIL_FORCED 4 /* "Forced" failure */
+
/* Available logging destinations */
each time a new feature is added (in a way that doesn't break backward
compatibility). */
-#define LOCAL_SCAN_ABI_VERSION_MAJOR 1
+#define LOCAL_SCAN_ABI_VERSION_MAJOR 2
#define LOCAL_SCAN_ABI_VERSION_MINOR 0
+#define LOCAL_SCAN_ABI_VERSION \
+ LOCAL_SCAN_ABI_VERSION_MAJOR.LOCAL_SCAN_ABI_VERSION_MINOR
/* Structure definitions that are documented as visible in the function. */
/* Entries in lists options are in this form. */
typedef struct {
- char *name;
- int type;
- void *value;
+ const char *name; /* should have been uschar but too late now */
+ int type;
+ void *value;
} optionlist;
/*Structure for holding information about an envelope address. The errors_to
uschar *address; /* the recipient address */
int pno; /* parent number for "one_time" alias, or -1 */
uschar *errors_to; /* the errors_to address or NULL */
+ uschar *orcpt; /* DSN orcpt */
+ int dsn_flags; /* DSN flags */
#ifdef EXPERIMENTAL_BRIGHTMAIL
uschar *bmi_optin;
#endif
extern unsigned int debug_selector; /* Debugging bits */
+extern int body_linecount; /* Line count in body */
+extern int body_zerocount; /* Binary zero count in body */
extern uschar *expand_string_message; /* Error info for failing expansion */
extern uschar *headers_charset; /* Charset for RFC 2047 decoding */
extern header_line *header_last; /* Final header */
extern int child_close(pid_t, int);
extern pid_t child_open(uschar **, uschar **, int, int *, int *, BOOL);
extern pid_t child_open_exim(int *);
-extern void debug_printf(char *, ...) PRINTF_FUNCTION;
+extern pid_t child_open_exim2(int *, uschar *, uschar *);
+extern void debug_printf(const char *, ...) PRINTF_FUNCTION(1,2);
extern uschar *expand_string(uschar *);
-extern void header_add(int, char *, ...);
-extern void header_add_at_position(BOOL, uschar *, BOOL, int, char *, ...);
-extern void header_remove(int, uschar *);
-extern BOOL header_testname(header_line *, uschar *, int, BOOL);
-extern BOOL header_testname_incomplete(header_line *, uschar *, int, BOOL);
-extern void log_write(unsigned int, int, char *format, ...);
+extern void header_add(int, const char *, ...);
+extern void header_add_at_position(BOOL, uschar *, BOOL, int, const char *, ...);
+extern void header_remove(int, const uschar *);
+extern BOOL header_testname(header_line *, const uschar *, int, BOOL);
+extern BOOL header_testname_incomplete(header_line *, const uschar *, int, BOOL);
+extern void log_write(unsigned int, int, const char *format, ...) PRINTF_FUNCTION(3,4);
extern int lss_b64decode(uschar *, uschar **);
extern uschar *lss_b64encode(uschar *, int);
extern int lss_match_domain(uschar *, uschar *);
extern BOOL receive_remove_recipient(uschar *);
extern uschar *rfc2047_decode(uschar *, BOOL, uschar *, int, int *, uschar **);
extern int smtp_fflush(void);
-extern void smtp_printf(char *, ...) PRINTF_FUNCTION;
-extern uschar *string_copy(uschar *);
-extern uschar *string_copyn(uschar *, int);
-extern uschar *string_sprintf(char *, ...);
+extern void smtp_printf(const char *, BOOL, ...) PRINTF_FUNCTION(1,3);
+extern void smtp_vprintf(const char *, BOOL, va_list);
+extern uschar *string_copy(const uschar *);
+extern uschar *string_copyn(const uschar *, int);
+extern uschar *string_sprintf(const char *, ...) ALMOST_PRINTF(1,2);
/* End of local_scan.h */