X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/1e835086d1592bdfbcd8577133965b78470840ac..HEAD:/src/src/structs.h diff --git a/src/src/structs.h b/src/src/structs.h index 3f237fce5..a32c55675 100644 --- a/src/src/structs.h +++ b/src/src/structs.h @@ -2,11 +2,13 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) The Exim Maintainers 2020 - 2022 */ +/* Copyright (c) The Exim Maintainers 2020 - 2024 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef STRUCTS_H +#define STRUCTS_H /* Definitions of various structures. In addition, those that are visible for the compilation of local_scan() are defined in local_scan.h. These are @@ -130,9 +132,9 @@ three, the layout of the start of the blocks is kept the same, and represented by the generic structures driver_info and driver_instance. */ typedef struct driver_instance { - struct driver_instance *next; + void *next; uschar *name; /* Instance name */ - struct driver_info *info; /* Points to info for this driver */ + void *info; /* Points to info for this driver */ void *options_block; /* Pointer to private options */ uschar *driver_name; /* All start with this generic option */ @@ -141,6 +143,7 @@ typedef struct driver_instance { } driver_instance; typedef struct driver_info { + struct driver_info * next; uschar *driver_name; /* Name of driver */ optionlist *options; /* Table of private options names */ @@ -148,9 +151,20 @@ typedef struct driver_info { void *options_block; /* Points to default private block */ int options_len; /* Length of same in bytes */ void (*init)( /* Initialization entry point */ - struct driver_instance *); + struct driver_instance *); + uint dyn_magic; /* Magic num if dynamic, else zero */ } driver_info; +/* Values for dyn_magic. Encode types and api version. */ +#define ROUTER_MAGIC 0x52544d31 /* RTM1 */ +#define TRANSPORT_MAGIC 0x54504d31 /* TPM1 */ +#define AUTH_MAGIC 0x65554d31 /* AUM1 */ + +typedef struct { + uint magic; + uschar * class; +} driver_magics; + /* Structure for holding information about the configured transports. Some of the generally accessible options are set from the configuration file; others @@ -159,13 +173,7 @@ transports. They need to be generally accessible, however, as they are used by the main transport code. */ typedef struct transport_instance { - struct transport_instance *next; - uschar *name; /* Instance name */ - struct transport_info *info; /* Info for this driver */ - void *options_block; /* Pointer to private options */ - uschar *driver_name; /* Must be first */ - const uschar *srcfile; - int srcline; + driver_instance drinst; int (*setup)( /* Setup entry point */ struct transport_instance *, @@ -227,18 +235,12 @@ typedef struct transport_instance { } transport_instance; -/* Structure for holding information about a type of transport. The first six -fields must match driver_info above. */ +/* Structure for holding information about a type of transport. The first +element must be a struct driver_info, to match auths and routers. */ typedef struct transport_info { - uschar *driver_name; /* Driver name */ - optionlist *options; /* Table of private options names */ - int *options_count; /* -> Number of entries in table */ - void *options_block; /* Points to default private block */ - int options_len; /* Length of same in bytes */ - void (*init)( /* Initialization function */ - struct transport_instance *); -/****/ + driver_info drinfo; + BOOL (*code)( /* Main entry point */ transport_instance *, struct address_item *); @@ -286,13 +288,7 @@ typedef struct { /* Structure for holding information about the configured routers. */ typedef struct router_instance { - struct router_instance *next; - uschar *name; - struct router_info *info; - void *options_block; /* Pointer to private options */ - uschar *driver_name; /* Must be first */ - const uschar *srcfile; - int srcline; + driver_instance drinst; uschar *address_data; /* Arbitrary data */ #ifdef EXPERIMENTAL_BRIGHTMAIL @@ -369,18 +365,12 @@ typedef struct router_instance { } router_instance; -/* Structure for holding information about a type of router. The first six -fields must match driver_info above. */ +/* Structure for holding information about a type of router. The first element +must be a struct driver_info, to match auths and transports. */ typedef struct router_info { - uschar *driver_name; - optionlist *options; /* Table of private options names */ - int *options_count; /* -> Number of entries in table */ - void *options_block; /* Points to default private block */ - int options_len; /* Length of same in bytes */ - void (*init)( /* Initialization function */ - struct router_instance *); -/****/ + driver_info drinfo; + int (*code)( /* Main entry point */ router_instance *, struct address_item *, @@ -405,13 +395,7 @@ typedef struct router_info { mechanisms */ typedef struct auth_instance { - struct auth_instance *next; - uschar *name; /* Exim instance name */ - struct auth_info *info; /* Pointer to driver info block */ - void *options_block; /* Pointer to private options */ - uschar *driver_name; /* Must be first */ - const uschar *srcfile; - int srcline; + driver_instance drinst; uschar *advertise_condition; /* Are we going to advertise this?*/ uschar *client_condition; /* Should the client try this? */ @@ -428,17 +412,11 @@ typedef struct auth_instance { /* Structure for holding information about an authentication mechanism. The -first six fields must match driver_info above. */ +first element must be a struct driver_info, to match routers and transports. */ typedef struct auth_info { - uschar *driver_name; /* e.g. "condition" */ - optionlist *options; /* Table of private options names */ - int *options_count; /* -> Number of entries in table */ - void *options_block; /* Points to default private block */ - int options_len; /* Length of same in bytes */ - void (*init)( /* initialization function */ - struct auth_instance *); -/****/ + driver_info drinfo; + int (*servercode)( /* server function */ auth_instance *, /* the instance data */ uschar *); /* rest of AUTH command */ @@ -469,8 +447,8 @@ typedef struct ip_address_item { /* Structure for chaining together arbitrary strings. */ typedef struct string_item { - struct string_item *next; - uschar *text; + struct string_item * next; + uschar * text; } string_item; /* Information about a soft delivery failure, for use when calculating @@ -480,7 +458,7 @@ can be tried. */ typedef struct retry_item { struct retry_item *next; /* for chaining */ - uschar *key; /* string identifying host/address/message */ + const uschar *key; /* string identifying host/address/message */ int basic_errno; /* error code for this destination */ int more_errno; /* additional error information */ uschar *message; /* local error message */ @@ -526,7 +504,7 @@ typedef struct address_item_propagated { uschar *address_data; /* arbitrary data to keep with the address */ uschar *domain_data; /* from "domains" lookup */ uschar *localpart_data; /* from "local_parts" lookup */ - uschar *errors_address; /* where to send errors (NULL => sender) */ + const uschar *errors_address; /* where to send errors (NULL => sender) */ header_line *extra_headers; /* additional headers */ uschar *remove_headers; /* list of those to remove */ void *variables; /* router-vasriables */ @@ -561,15 +539,15 @@ typedef struct address_item { reply_item *reply; /* data for autoreply */ retry_item *retries; /* chain of retry information */ - uschar *address; /* address being delivered or routed */ + const uschar *address; /* address being delivered or routed */ uschar *unique; /* used for disambiguating */ - uschar *cc_local_part; /* caseful local part */ - uschar *lc_local_part; /* lowercased local part */ - uschar *local_part; /* points to cc or lc version */ - uschar *prefix; /* stripped prefix of local part */ - uschar *prefix_v; /* variable part of above */ - uschar *suffix; /* stripped suffix of local part */ - uschar *suffix_v; /* variable part of above */ + const uschar *cc_local_part; /* caseful local part */ + const uschar *lc_local_part; /* lowercased local part */ + const uschar *local_part; /* points to cc or lc version */ + const uschar *prefix; /* stripped prefix of local part */ + const uschar *prefix_v; /* variable part of above */ + const uschar *suffix; /* stripped suffix of local part */ + const uschar *suffix_v; /* variable part of above */ const uschar *domain; /* working domain (lower cased) */ uschar *address_retry_key; /* retry key including full address */ @@ -580,12 +558,15 @@ typedef struct address_item { uschar *message; /* error message */ uschar *user_message; /* error message that can be sent over SMTP or quoted in bounce message */ - uschar *onetime_parent; /* saved original parent for onetime */ + const uschar *onetime_parent; /* saved original parent for onetime */ uschar **pipe_expandn; /* numeric expansions for pipe from filter */ uschar *return_filename; /* name of return file */ uschar *self_hostname; /* after self=pass */ uschar *shadow_message; /* info about shadow transporting */ + uid_t uid; /* uid for transporting */ + gid_t gid; /* gid for transporting */ + #ifndef DISABLE_TLS const uschar *tlsver; /* version used for transport */ uschar *cipher; /* Cipher used for transport */ @@ -608,9 +589,9 @@ typedef struct address_item { int dsn_flags; /* DSN flags */ int dsn_aware; /* DSN aware flag */ - uid_t uid; /* uid for transporting */ - gid_t gid; /* gid for transporting */ - +#ifndef DISABLE_DKIM + const uschar * dkim_used; /* DKIM info, or NULL */ +#endif /* flags */ struct { BOOL af_allow_file:1; /* allow file in generated address */ @@ -763,7 +744,7 @@ to close. */ typedef struct search_cache { void *handle; /* lookup handle, or NULL if closed */ - int search_type; /* search type */ + const lookup_info * li; /* info struct for search type */ tree_node *up; /* LRU up pointer */ tree_node *down; /* LRU down pointer */ tree_node *item_cache; /* tree of cached results */ @@ -890,6 +871,16 @@ typedef struct redirect_block { BOOL check_group; /* TRUE, FALSE, or TRUE_UNSET */ } redirect_block; +/* Sieve control data */ + +typedef struct sieve_block { + const uschar * inbox; + const uschar * enotify_mailto_owner; + const uschar * subaddress; + const uschar * useraddress; + const uschar * vacation_dir; +} sieve_block; + /* Structure for passing arguments to check_host() */ typedef struct check_host_block { @@ -964,7 +955,7 @@ typedef struct qrunner { struct qrunner * next; /* list sorted by next tick */ uschar * name; /* NULL for the default queue */ - unsigned interval; /* tick rate, seconds */ + unsigned interval; /* tick rate, seconds. Zero for a one-time run */ time_t next_tick; /* next run should, or should have, start(ed) */ unsigned run_max; /* concurrent queue runner limit */ unsigned run_count; /* current runners */ @@ -976,4 +967,78 @@ typedef struct qrunner { BOOL queue_2stage :1; } qrunner; + +/* Types of variable table entry */ + +enum vtypes { + vtype_int, /* value is address of int */ + vtype_filter_int, /* ditto, but recognized only when filtering */ + vtype_ino, /* value is address of ino_t (not always an int) */ + vtype_uid, /* value is address of uid_t (not always an int) */ + vtype_gid, /* value is address of gid_t (not always an int) */ + vtype_bool, /* value is address of bool */ + vtype_stringptr, /* value is address of pointer to string */ + vtype_msgbody, /* as stringptr, but read when first required */ + vtype_msgbody_end, /* ditto, the end of the message */ + vtype_msgheaders, /* the message's headers, processed */ + vtype_msgheaders_raw, /* the message's headers, unprocessed */ + vtype_localpart, /* extract local part from string */ + vtype_domain, /* extract domain from string */ + vtype_string_func, /* value is string returned by given function */ + vtype_todbsdin, /* value not used; generate BSD inbox tod */ + vtype_tode, /* value not used; generate tod in epoch format */ + vtype_todel, /* value not used; generate tod in epoch/usec format */ + vtype_todf, /* value not used; generate full tod */ + vtype_todl, /* value not used; generate log tod */ + vtype_todlf, /* value not used; generate log file datestamp tod */ + vtype_todzone, /* value not used; generate time zone only */ + vtype_todzulu, /* value not used; generate zulu tod */ + vtype_reply, /* value not used; get reply from headers */ + vtype_pid, /* value not used; result is pid */ + vtype_host_lookup, /* value not used; get host name */ + vtype_load_avg, /* value not used; result is int from os_getloadavg */ + vtype_pspace, /* partition space; value is T/F for spool/log */ + vtype_pinodes, /* partition inodes; value is T/F for spool/log */ + vtype_cert, /* SSL certificate */ +#ifndef DISABLE_DKIM + vtype_dkim, /* Lookup of value in DKIM signature */ +#endif + vtype_module, /* variable lives in a module; value is module name */ +}; + +/* Type for main variable table */ + +typedef struct { + const char *name; + enum vtypes type; + void *value; +} var_entry; + + + +/* dynamic-load module info */ + +typedef struct misc_module_info { + struct misc_module_info * next; + + const uschar * name; + unsigned dyn_magic; + BOOL (*init)(void *); /* arg is the misc_module_info ptr */ + gstring * (*lib_vers_report)(gstring *); /* underlying library */ + int (*conn_init)(const uschar *, const uschar *); + void (*smtp_reset)(void); + int (*msg_init)(void); + gstring * (*authres)(gstring *); + + void * options; + unsigned options_count; + void * functions; + unsigned functions_count; + void * variables; + unsigned variables_count; +} misc_module_info; + +#define MISC_MODULE_MAGIC 0x4d4d4d31 /* MMM1 */ + +#endif /* whole file */ /* End of structs.h */