build: use pkg-config for i18n
[exim.git] / src / src / structs.h
index 209d657c6294319a86303c8a0b0d0e4c1d77371a..a32c55675d0bf9308904eaaad854695009e6b9e3 100644 (file)
@@ -2,11 +2,13 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) The Exim Maintainers 2020 - 2023 */
+/* 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 */
 
 /* 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
 
 /* 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 {
 by the generic structures driver_info and driver_instance. */
 
 typedef struct driver_instance {
-  struct driver_instance *next;
+  void   *next;
   uschar *name;                   /* Instance name */
   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 */
   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 {
 } driver_instance;
 
 typedef struct driver_info {
+  struct driver_info * next;
   uschar *driver_name;            /* Name of driver */
 
   optionlist *options;            /* Table of private options names */
   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 */
   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;
 
 } 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
 
 /* 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 {
 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 *,
 
   int   (*setup)(                 /* Setup entry point */
     struct transport_instance *,
@@ -227,18 +235,12 @@ typedef struct transport_instance {
 } 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 {
 
 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 *);
   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 {
 /* 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
 
   uschar *address_data;           /* Arbitrary data */
 #ifdef EXPERIMENTAL_BRIGHTMAIL
@@ -369,18 +365,12 @@ typedef struct router_instance {
 } 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 {
 
 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 *,
   int (*code)(                    /* Main entry point */
     router_instance *,
     struct address_item *,
@@ -405,13 +395,7 @@ typedef struct router_info {
 mechanisms */
 
 typedef struct auth_instance {
 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? */
 
   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
 
 
 /* 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 {
 
 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 */
   int (*servercode)(              /* server function */
     auth_instance *,              /* the instance data */
     uschar *);                    /* rest of AUTH command */
@@ -480,7 +458,7 @@ can be tried. */
 
 typedef struct retry_item {
   struct retry_item *next;        /* for chaining */
 
 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 */
   int     basic_errno;            /* error code for this destination */
   int     more_errno;             /* additional error information */
   uschar *message;                /* local error message */
@@ -586,6 +564,9 @@ typedef struct address_item {
   uschar *self_hostname;          /* after self=pass */
   uschar *shadow_message;         /* info about shadow transporting */
 
   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 */
 #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 */
 
   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 */
                                  /* 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 */
 
 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 */
   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;
 
   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 {
 /* 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 */
   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 */
   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;
 
   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 */
 /* End of structs.h */