[exim-cvs] move router infos to individual driver files

Top Page
Delete this message
Reply to this message
Author: Exim Git Commits Mailing List
Date:  
To: exim-cvs
Subject: [exim-cvs] move router infos to individual driver files
Gitweb: https://git.exim.org/exim.git/commitdiff/51d2588be64b116d4b4318b182e0ab2bad14570c
Commit:     51d2588be64b116d4b4318b182e0ab2bad14570c
Parent:     d6e20136b71dc5f3cd333a6342223f814ec2e7a2
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Tue Aug 13 13:14:12 2024 +0100
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Wed Aug 14 10:51:22 2024 +0100


    move router infos to individual driver files
---
 src/src/drtables.c             | 95 +-----------------------------------------
 src/src/lookups/cdb.c          |  2 +-
 src/src/route.c                | 67 +++++++++++++++++++++++++++--
 src/src/routers/accept.c       | 24 +++++++++++
 src/src/routers/dnslookup.c    | 25 +++++++++++
 src/src/routers/ipliteral.c    | 24 +++++++++++
 src/src/routers/iplookup.c     | 24 +++++++++++
 src/src/routers/manualroute.c  | 25 +++++++++++
 src/src/routers/queryprogram.c | 24 +++++++++++
 src/src/routers/redirect.c     | 24 +++++++++++
 src/src/structs.h              |  7 +++-
 11 files changed, 242 insertions(+), 99 deletions(-)


diff --git a/src/src/drtables.c b/src/src/drtables.c
index 9225fafe1..1a3a80460 100644
--- a/src/src/drtables.c
+++ b/src/src/drtables.c
@@ -230,10 +230,7 @@ exim binary. */

#include "routers/rf_functions.h"

-#ifdef ROUTER_ACCEPT
-# include "routers/accept.h"
-#endif
-
+/*XXX delete */
#ifdef ROUTER_DNSLOOKUP
# include "routers/dnslookup.h"
#endif
@@ -288,96 +285,6 @@ router_info * routers_available_newlist = NULL;
/* Now set up the structures, terminated by an entry with a null name. */

 router_info routers_available_oldarray[] = {
-#ifdef ROUTER_ACCEPT
-  {
-  .drinfo = {
-    .driver_name =    US"accept",
-    .options =        accept_router_options,
-    .options_count =    &accept_router_options_count,
-    .options_block =    &accept_router_option_defaults,
-    .options_len =    sizeof(accept_router_options_block),
-    .init =        accept_router_init,
-    },
-  .code =        accept_router_entry,
-  .tidyup =        NULL,     /* no tidyup entry */
-  .ri_flags =        ri_yestransport
-  },
-#endif
-#ifdef ROUTER_DNSLOOKUP
-  {
-  .drinfo = {
-    .driver_name =    US"dnslookup",
-    .options =        dnslookup_router_options,
-    .options_count =    &dnslookup_router_options_count,
-    .options_block =    &dnslookup_router_option_defaults,
-    .options_len =    sizeof(dnslookup_router_options_block),
-    .init =        dnslookup_router_init,
-    },
-  .code =        dnslookup_router_entry,
-  .tidyup =        NULL,     /* no tidyup entry */
-  .ri_flags =        ri_yestransport
-  },
-#endif
-#ifdef ROUTER_IPLITERAL
-  {
-  .drinfo = {
-    .driver_name =    US"ipliteral",
-    .options =        ipliteral_router_options,
-    .options_count =    &ipliteral_router_options_count,
-    .options_block =    &ipliteral_router_option_defaults,
-    .options_len =    sizeof(ipliteral_router_options_block),
-    .init =        ipliteral_router_init,
-    },
-  .code =        ipliteral_router_entry,
-  .tidyup =        NULL,     /* no tidyup entry */
-  .ri_flags =        ri_yestransport
-  },
-#endif
-#ifdef ROUTER_IPLOOKUP
-  {
-  .drinfo = {
-    .driver_name =    US"iplookup",
-    .options =        iplookup_router_options,
-    .options_count =    &iplookup_router_options_count,
-    .options_block =    &iplookup_router_option_defaults,
-    .options_len =    sizeof(iplookup_router_options_block),
-    .init =        iplookup_router_init,
-    },
-  .code =        iplookup_router_entry,
-  .tidyup =        NULL,     /* no tidyup entry */
-  .ri_flags =        ri_notransport
-  },
-#endif
-#ifdef ROUTER_MANUALROUTE
-  {
-  .drinfo = {
-    .driver_name =    US"manualroute",
-    .options =        manualroute_router_options,
-    .options_count =    &manualroute_router_options_count,
-    .options_block =    &manualroute_router_option_defaults,
-    .options_len =    sizeof(manualroute_router_options_block),
-    .init =        manualroute_router_init,
-    },
-  .code =        manualroute_router_entry,
-  .tidyup =        NULL,     /* no tidyup entry */
-  .ri_flags =        0
-  },
-#endif
-#ifdef ROUTER_REDIRECT
-  {
-  .drinfo = {
-    .driver_name =    US"redirect",
-    .options =        redirect_router_options,
-    .options_count =    &redirect_router_options_count,
-    .options_block =    &redirect_router_option_defaults,
-    .options_len =    sizeof(redirect_router_options_block),
-    .init =        redirect_router_init,
-    },
-  .code =        redirect_router_entry,
-  .tidyup =        NULL,     /* no tidyup entry */
-  .ri_flags =        ri_notransport
-  },
-#endif
   { .drinfo = { .driver_name = US"" }}
 };


diff --git a/src/src/lookups/cdb.c b/src/src/lookups/cdb.c
index 696e52019..a0f668b98 100644
--- a/src/src/lookups/cdb.c
+++ b/src/src/lookups/cdb.c
@@ -482,7 +482,7 @@ lookup_info cdb_lookup_info = {
};

#ifdef DYNLOOKUP
-#define cdb_lookup_module_info _lookup_module_info
+# define cdb_lookup_module_info _lookup_module_info
#endif

 static lookup_info *_lookup_list[] = { &cdb_lookup_info };
diff --git a/src/src/route.c b/src/src/route.c
index c0cc1fee9..cce120967 100644
--- a/src/src/route.c
+++ b/src/src/route.c
@@ -220,6 +220,17 @@ if (after && !afterthis)
 *             Initialize router list             *
 *************************************************/


+/*XXX will likely want to rename to generic */
+
+static void
+add_router(driver_info ** drlist_p, const driver_info * newent, size_t size)
+{
+driver_info * listent = store_get(size, newent);
+memcpy(listent, newent, size);
+listent->next = *drlist_p;
+*drlist_p= listent;
+}
+
/* Read the routers section of the configuration file, and set up a chain of
router instances according to its contents. Each router has generic options and
may also have its own private options. This function is only ever called when
@@ -230,10 +241,9 @@ function. */
void
route_init(void)
{
-/*XXX temp loop just copying the old array to build the new list.
-Will replace with haul from either static build file or dyn module
-done by readconf_driver_init() */

+#ifdef old
+/*XXX temp loop just copying the old array to build the new list. */
 for (router_info * tblent = routers_available_oldarray;
     *tblent->drinfo.driver_name; tblent++)
   {
@@ -242,7 +252,58 @@ for (router_info * tblent = routers_available_oldarray;
   listent->next = (driver_info *)routers_available_newlist;
   routers_available_newlist = (router_info *)listent;
   }
+#else
+
+/*XXX
+Will replace with ifdeffed explicit calls in drtab.c just building list
+(2 lists?) of names for -bV (DONE),
+plut ifdeffed repeated code here adding static-build modules to list (DONE)
+plus code in readconf.c for dlopen()s just before per-driver init api call.
+*/
+
+int old_pool = store_pool;
+store_pool = POOL_PERM;
+  {
+  driver_info ** anchor = (driver_info **) &routers_available_newlist;
+  extern router_info accept_router_info;
+  extern router_info dnslookup_router_info;
+  extern router_info ipliteral_router_info;
+  extern router_info iplookup_router_info;
+  extern router_info manualroute_router_info;
+  extern router_info redirect_router_info;
+  extern router_info queryprogram_router_info;
+
+  /*XXX this addsonly the statics.  We can't get the dynamics as they
+  are not linked.  Until dlopen(), when we can use dlsym().  So the discovery
+  is by the file exitence, via the filename pattern. */
+  /*XXX TODO: move the info structs to individual driver files */
+#if defined(ROUTER_ACCEPT) && ROUTER_ACCEPT!=2
+  add_router(anchor, &accept_router_info.drinfo, sizeof(router_info));
+#endif
+#if defined(ROUTER_DNSLOOKUP) && ROUTER_DNSLOOKUP!=2
+  add_router(anchor, &dnslookup_router_info.drinfo, sizeof(router_info));
+#endif
+# if defined(ROUTER_IPLITERAL) && ROUTER_IPLITERAL!=2
+  add_router(anchor, &ipliteral_router_info.drinfo, sizeof(router_info));
+#endif
+#if defined(ROUTER_IPLOOKUP) && ROUTER_IPLOOKUP!=2
+  add_router(anchor, &iplookup_router_info.drinfo, sizeof(router_info));
+#endif
+#if defined(ROUTER_MANUALROUTE) && ROUTER_MANUALROUTE!=2
+  add_router(anchor, &manualroute_router_info.drinfo, sizeof(router_info));
+#endif
+#if defined(ROUTER_REDIRECT) && ROUTER_REDIRECT!=2
+  add_router(anchor, &redirect_router_info.drinfo, sizeof(router_info));
+#endif
+#if defined(ROUTER_QUERYPROGRAM) && ROUTER_QUERYPROGRAM!=2
+  add_router(anchor, &queryprogram_router_info.drinfo, sizeof(router_info));
+#endif
+  }
+store_pool = old_pool;
+
+#endif /*!old*/


+/*XXX this does the config file "routers" section reading */
 readconf_driver_init((driver_instance **)&routers,     /* chain anchor */
   (driver_info *)routers_available_newlist,   /* available drivers */
   sizeof(router_info),                /* size of info blocks */
diff --git a/src/src/routers/accept.c b/src/src/routers/accept.c
index 6cbde6dec..353d1762c 100644
--- a/src/src/routers/accept.c
+++ b/src/src/routers/accept.c
@@ -140,6 +140,30 @@ addr->prop.remove_headers = remove_headers;
 return rf_queue_add(addr, addr_local, addr_remote, rblock, pw) ? OK : DEFER;
 }


+
+
+# ifdef DYNLOOKUP
+#  define accept_router_info _router_info
+# endif
+
+router_info accept_router_info =
+{
+.drinfo = {
+  .driver_name =    US"accept",
+  .options =        accept_router_options,
+  .options_count =    &accept_router_options_count,
+  .options_block =    &accept_router_option_defaults,
+  .options_len =    sizeof(accept_router_options_block),
+  .init =        accept_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =        ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =        accept_router_entry,
+.tidyup =        NULL,     /* no tidyup entry */
+.ri_flags =        ri_yestransport
+};
+
 #endif    /*!MACRO_PREDEF*/
 #endif    /*ROUTER_ACCEPT*/


diff --git a/src/src/routers/dnslookup.c b/src/src/routers/dnslookup.c
index 8a6f72d5d..90ea0f613 100644
--- a/src/src/routers/dnslookup.c
+++ b/src/src/routers/dnslookup.c
@@ -475,6 +475,31 @@ addr->transport = rblock->transport;
return rf_queue_add(addr, addr_local, addr_remote, rblock, pw) ? OK : DEFER;
}

+
+
+
+# ifdef DYNLOOKUP
+#  define dnslookup_router_info _router_info
+# endif
+
+router_info dnslookup_router_info =
+{
+.drinfo = {
+  .driver_name =    US"dnslookup",
+  .options =        dnslookup_router_options,
+  .options_count =    &dnslookup_router_options_count,
+  .options_block =    &dnslookup_router_option_defaults,
+  .options_len =    sizeof(dnslookup_router_options_block),
+  .init =        dnslookup_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =        ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =            dnslookup_router_entry,
+.tidyup =        NULL,     /* no tidyup entry */
+.ri_flags =        ri_yestransport
+};
+
 #endif    /*!MACRO_PREDEF*/
 #endif    /*ROUTER_DNSLOOKUP*/
 /* End of routers/dnslookup.c */
diff --git a/src/src/routers/ipliteral.c b/src/src/routers/ipliteral.c
index 790ef15f0..a5ef20d32 100644
--- a/src/src/routers/ipliteral.c
+++ b/src/src/routers/ipliteral.c
@@ -201,6 +201,30 @@ return rf_queue_add(addr, addr_local, addr_remote, rblock, pw)?
   OK : DEFER;
 }


+
+
+# ifdef DYNLOOKUP
+#  define ipliteral_router_info _router_info
+# endif
+
+router_info ipliteral_router_info =
+{
+.drinfo = {
+  .driver_name =    US"ipliteral",
+  .options =        ipliteral_router_options,
+  .options_count =    &ipliteral_router_options_count,
+  .options_block =    &ipliteral_router_option_defaults,
+  .options_len =    sizeof(ipliteral_router_options_block),
+  .init =        ipliteral_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =        ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =            ipliteral_router_entry,
+.tidyup =        NULL,     /* no tidyup entry */
+.ri_flags =        ri_yestransport
+};
+
 #endif    /*!MACRO_PREDEF*/
 #endif    /*ROUTER_IPLITERAL*/
 /* End of routers/ipliteral.c */
diff --git a/src/src/routers/iplookup.c b/src/src/routers/iplookup.c
index 26e9b7ce7..24362fa88 100644
--- a/src/src/routers/iplookup.c
+++ b/src/src/routers/iplookup.c
@@ -417,6 +417,30 @@ if (rc != OK) return rc;
 return OK;
 }


+
+
+# ifdef DYNLOOKUP
+#  define iplookup_router_info _router_info
+# endif
+
+router_info iplookup_router_info =
+{
+.drinfo = {
+  .driver_name =    US"iplookup",
+  .options =        iplookup_router_options,
+  .options_count =    &iplookup_router_options_count,
+  .options_block =    &iplookup_router_option_defaults,
+  .options_len =    sizeof(iplookup_router_options_block),
+  .init =        iplookup_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =        ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =            iplookup_router_entry,
+.tidyup =        NULL,     /* no tidyup entry */
+.ri_flags =        ri_notransport
+};
+
 #endif    /*!MACRO_PREDEF*/
 #endif    /*ROUTER_IPLOOKUP*/
 /* End of routers/iplookup.c */
diff --git a/src/src/routers/manualroute.c b/src/src/routers/manualroute.c
index 05043a814..095a3af16 100644
--- a/src/src/routers/manualroute.c
+++ b/src/src/routers/manualroute.c
@@ -495,6 +495,31 @@ addr->transport = transport;
 return OK;
 }


+
+
+
+# ifdef DYNLOOKUP
+#  define manualroute_router_info _router_info
+# endif
+
+router_info manualroute_router_info =
+{
+.drinfo = {
+  .driver_name =    US"manualroute",
+  .options =        manualroute_router_options,
+  .options_count =    &manualroute_router_options_count,
+  .options_block =    &manualroute_router_option_defaults,
+  .options_len =    sizeof(manualroute_router_options_block),
+  .init =        manualroute_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =        ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =            manualroute_router_entry,
+.tidyup =        NULL,     /* no tidyup entry */
+.ri_flags =        0
+};
+
 #endif    /*!MACRO_PREDEF*/
 #endif    /*ROUTER_MANUALROUTE*/
 /* End of routers/manualroute.c */
diff --git a/src/src/routers/queryprogram.c b/src/src/routers/queryprogram.c
index 82c3f2001..606124e7e 100644
--- a/src/src/routers/queryprogram.c
+++ b/src/src/routers/queryprogram.c
@@ -534,6 +534,30 @@ addr->prop = addr_prop;
 return rf_queue_add(addr, addr_local, addr_remote, rblock, pw) ? OK : DEFER;
 }


+
+
+# ifdef DYNLOOKUP
+#  define queryprogram_router_info _router_info
+# endif
+
+router_info queryprogram_router_info =
+{
+.drinfo = {
+  .driver_name =      US"queryprogram",
+  .options =          queryprogram_router_options,
+  .options_count =    &queryprogram_router_options_count,
+  .options_block =    &queryprogram_router_option_defaults,
+  .options_len =      sizeof(queryprogram_router_options_block),
+  .init =             queryprogram_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =          ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =               queryprogram_router_entry,
+.tidyup =             NULL,     /* no tidyup entry */
+.ri_flags =           0
+};
+
 #endif    /*!MACRO_PREDEF*/
 #endif    /*ROUTER_QUERYPROGRAM*/
 /* End of routers/queryprogram.c */
diff --git a/src/src/routers/redirect.c b/src/src/routers/redirect.c
index 936cfca14..50b180372 100644
--- a/src/src/routers/redirect.c
+++ b/src/src/routers/redirect.c
@@ -788,6 +788,30 @@ addr->next = *addr_succeed;
 return yield;
 }


+
+
+# ifdef DYNLOOKUP
+#  define redirect_router_info _router_info
+# endif
+
+router_info redirect_router_info =
+{
+.drinfo = {
+  .driver_name =    US"redirect",
+  .options =        redirect_router_options,
+  .options_count =    &redirect_router_options_count,
+  .options_block =    &redirect_router_option_defaults,
+  .options_len =    sizeof(redirect_router_options_block),
+  .init =        redirect_router_init,
+# ifdef DYNLOOKUP
+  .dyn_magic =        ROUTER_MAGIC,           /*XXX*/
+# endif
+  },
+.code =            redirect_router_entry,
+.tidyup =        NULL,     /* no tidyup entry */
+.ri_flags =        ri_notransport
+};
+
 #endif   /*!MACRO_PREDEF*/
 #endif    /*ROUTER_REDIRECT*/
 /* End of routers/redirect.c */
diff --git a/src/src/structs.h b/src/src/structs.h
index 392a4a08c..3446664cd 100644
--- a/src/src/structs.h
+++ b/src/src/structs.h
@@ -150,9 +150,14 @@ typedef struct driver_info {
   int     options_len;            /* Length of same in bytes */
   void  (*init)(                  /* Initialization entry point */
       struct driver_instance *);
-  BOOL      dynamic;          /* Built as dynamic-load module */
+  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 */
+


/* Structure for holding information about the configured transports. Some
of the generally accessible options are set from the configuration file; others

--
## subscription configuration (requires account):
## https://lists.exim.org/mailman3/postorius/lists/exim-cvs.lists.exim.org/
## unsubscribe (doesn't require an account):
## exim-cvs-unsubscribe@???
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/