Version reporting & module ABI change.
authorPhil Pennock <pdp@exim.org>
Fri, 21 Jan 2011 08:25:51 +0000 (03:25 -0500)
committerPhil Pennock <pdp@exim.org>
Fri, 21 Jan 2011 08:25:51 +0000 (03:25 -0500)
Debug version display reports library info.

Bumps lookup API magic constant, adds new field to module API.

When invoking { exim -d -bV } we can display more version information.
Show versions for many external libraries, including both compile-time
and run-time information if we can.

Optional for modules, may be NULL.  Implemented for MySQL, SQLite &
Whoson lookups.  For all lookups, if dynamically loaded, report the
Exim version number from the build.  (Packagers will bundle stuff, but
dynamic modules are no longer just available for packagers, so we need
to deal with less managed environments and people forgetting to install
new modules).

Suggest in EDITME that users of modules not using package management
consider embedding a version number in the path to the modules.

Should consider removing the TLS (OpenSSL/GnuTLS) reporting from the
default -bV display and moving it into the debug display.  Not done.

Created version.h, now support a version extension string for
distributors who patch heavily. Henceforth release engineer should
change the version in version.h not version.c.

28 files changed:
doc/doc-txt/ChangeLog
src/scripts/MakeLinks
src/src/EDITME
src/src/auths/cyrus_sasl.c
src/src/drtables.c
src/src/exim.c
src/src/exim.h
src/src/lookupapi.h
src/src/lookups/README
src/src/lookups/cdb.c
src/src/lookups/dbmdb.c
src/src/lookups/dnsdb.c
src/src/lookups/dsearch.c
src/src/lookups/ibase.c
src/src/lookups/ldap.c
src/src/lookups/lsearch.c
src/src/lookups/mysql.c
src/src/lookups/nis.c
src/src/lookups/nisplus.c
src/src/lookups/oracle.c
src/src/lookups/passwd.c
src/src/lookups/pgsql.c
src/src/lookups/spf.c
src/src/lookups/sqlite.c
src/src/lookups/testdb.c
src/src/lookups/whoson.c
src/src/version.c
src/src/version.h [new file with mode: 0644]

index 0780fc7da718589a148286420b9a6279a76dd72f..ff375d39898aeaa36c454b9ca0010fe0d7e41898 100644 (file)
@@ -27,6 +27,11 @@ PP/02 Let /dev/null have normal permissions.
       permissions on /dev/null.  Exempt it from some checks.
       Reported by Andreas M. Kirchwitz.
 
+PP/03 Report version information for many libraries, including
+      Exim version information for dynamically loaded libraries.  Created
+      version.h, now support a version extension string for distributors
+      who patch heavily. Dynamic module ABI change.
+
 
 Exim version 4.73
 -----------------
index c021ace0e8e548994b8d8ee93e7564c751890b48..ac092095570b78157c8ac44f3c6347422922f6bf 100755 (executable)
@@ -182,6 +182,7 @@ ln -s ../src/osfunctions.h     osfunctions.h
 ln -s ../src/store.h           store.h
 ln -s ../src/structs.h         structs.h
 ln -s ../src/lookupapi.h       lookupapi.h
+ln -s ../src/version.h         version.h
 
 ln -s ../src/acl.c             acl.c
 ln -s ../src/buildconfig.c     buildconfig.c
index 74c507d3a22ea5db7949f18feebab70830a65f2d..833c3f8cac77130f4048bdd8bd9e1368cf507a9e 100644 (file)
@@ -251,6 +251,10 @@ TRANSPORT_SMTP=yes
 #------------------------------------------------------------------------------
 # See below for dynamic lookup modules.
 # LOOKUP_MODULE_DIR=/usr/lib/exim/lookups/
+# If not using package management but using this anyway, then think about how
+# you perform upgrades and revert them. You should consider the benefit of
+# embedding the Exim version number into LOOKUP_MODULE_DIR, so that you can
+# maintain two concurrent sets of modules.
 
 # To build a module dynamically, you'll need to define CFLAGS_DYNAMIC for
 # your platform.  Eg:
index 2ab028c2c543a9fef1003978746291eddeaaf02d..7e97acb794bdda927dda9a5aa62bab6ca3249693 100644 (file)
@@ -345,6 +345,21 @@ while(rc==SASL_CONTINUE)
 return 0;  /* Stop compiler complaints */
 }
 
+/*************************************************
+*                Diagnostic API                  *
+*************************************************/
+
+void
+auth_cyrus_sasl_version_report(FILE *f)
+{
+  const char *implementation, *version;
+  sasl_version_info(&implementation, &version, NULL, NULL, NULL, NULL);
+  fprintf(f, "Library version: Cyrus SASL: Compile: %d.%d.%d\n"
+             "                             Runtime: %s [%s]\n",
+          SASL_VERSION_MAJOR, SASL_VERSION_MINOR, SASL_VERSION_STEP,
+          version, implementation);
+}
+
 /*************************************************
 *              Client entry point                *
 *************************************************/
index e54202f430cf3a2cf1ac420cac78c329271ad15b..563670a38add5b6d5820c0195a912c8f7cf956b1 100644 (file)
@@ -21,6 +21,8 @@ all described in src/EDITME. */
 lookup_info **lookup_list;
 int lookup_list_count = 0;
 
+static int lookup_list_init_done = 0;
+
 /* Table of information about all possible authentication mechamisms. All
 entries are always present if any mechanism is declared, but the functions are
 set to NULL for those that are not compiled into the binary. */
@@ -398,6 +400,10 @@ void init_lookup_list(void)
   int moduleerrors = 0;
   struct lookupmodulestr *p;
 
+  if (lookup_list_init_done)
+    return;
+  lookup_list_init_done = 1;
+
 #if defined(LOOKUP_CDB) && LOOKUP_CDB!=2
 extern lookup_module_info cdb_lookup_module_info;
   addlookupmodule(NULL, &cdb_lookup_module_info);
index bda61909a3fb5af922fe3fbad503c711415c816b..dd3b5f9e7ecc38ed1932ab81804d5e29886cf295 100644 (file)
@@ -14,6 +14,8 @@ Also a few functions that don't naturally fit elsewhere. */
 
 #include "exim.h"
 
+extern void init_lookup_list(void);
+
 
 
 /*************************************************
@@ -914,6 +916,33 @@ come. */
 #ifdef SUPPORT_TLS
 tls_version_report(f);
 #endif
+
+/* Everything else is details which are only worth reporting when debugging.
+Perhaps the tls_version_report should move into this too. */
+DEBUG(D_any) do {
+
+  int i;
+
+#ifdef AUTH_CYRUS_SASL
+  auth_cyrus_sasl_version_report(f);
+#endif
+
+  fprintf(f, "Library version: PCRE: Compile: %d.%d%s\n"
+             "                       Runtime: %s\n",
+          PCRE_MAJOR, PCRE_MINOR,
+          /* PRE_PRERELEASE is either defined and empty or a string.
+           * This should work: */
+          PCRE_PRERELEASE "",
+          pcre_version());
+
+  init_lookup_list();
+  for (i = 0; i < lookup_list_count; i++)
+    {
+    if (lookup_list[i]->version_report)
+      lookup_list[i]->version_report(f);
+    }
+
+} while (0);
 }
 
 
@@ -3143,7 +3172,8 @@ if (debug_selector != 0)
     debug_printf("Exim version %s uid=%ld gid=%ld pid=%d D=%x\n",
       version_string, (long int)real_uid, (long int)real_gid, (int)getpid(),
       debug_selector);
-    show_whats_supported(stderr);
+    if (!version_printed)
+      show_whats_supported(stderr);
     }
   }
 
@@ -3510,8 +3540,11 @@ if (opt_perl_at_start && opt_perl_startup != NULL)
   }
 #endif /* EXIM_PERL */
 
-/* Initialise lookup_list */
-extern void init_lookup_list(void);
+/* Initialise lookup_list
+If debugging, already called above via version reporting.
+This does mean that debugging causes the list to be initialised while root.
+This *should* be harmless -- all modules are loaded from a fixed dir and
+it's code that would, if not a module, be part of Exim already. */
 init_lookup_list();
 
 /* Log the arguments of the call if the configuration file said so. This is
index b9b2ab0eba65fe431dbbd3d66693e87fe804a3e4..be7c55e88f888a2ac1662ede835808333546bb1f 100644 (file)
@@ -533,5 +533,12 @@ default to EDQUOT if it exists, otherwise ENOSPC. */
   #endif
 #endif
 
+/* These are for reporting version information from various componenents, to
+figure out what's actually happening. They need to be available to the main
+function, so we declare them here. Unfortunate. */
+
+#ifdef AUTH_CYRUS_SASL
+extern void auth_cyrus_sasl_version_report(FILE *);
+#endif
 
 /* End of exim.h */
index 97f92ab3a582df2d2aa12936d0c73f96bed6a9ec..3c9b1bb6c949b294f75e020c50ec3db1f5af5530 100644 (file)
@@ -43,11 +43,14 @@ typedef struct lookup_info {
   uschar *(*quote)(               /* quoting function */
     uschar *,                     /* string to quote */
     uschar *);                    /* additional data from quote name */
+  void (*version_report)(         /* diagnostic function */
+    FILE *);                      /* fh to write to */
 } lookup_info;
 
 /* This magic number is used by the following lookup_module_info structure
-   for checking API compatibility. It's equivalent to the string"LMM1" */
-#define LOOKUP_MODULE_INFO_MAGIC 0x4c4d4d31
+   for checking API compatibility. It's equivalent to the string"LMM2" */
+#define LOOKUP_MODULE_INFO_MAGIC 0x4c4d4d32
+/* Version 2 adds: version_report */
 
 typedef struct lookup_module_info {
   uint magic;
index cdaf308f3b77e7a1bc3a020af465dffcc8a1f824..7490f0a27a8ba263a316bd9244611503bc83d267 100644 (file)
@@ -5,7 +5,10 @@ LOOKUPS
 
 Each lookup type is implemented by 6 functions, xxx_open(), xxx_check(),
 xxx_find(), xxx_close(), xxx_tidy(), and xxx_quote(), where xxx is the name of
-the lookup type (e.g. lsearch, dbm, or whatever).
+the lookup type (e.g. lsearch, dbm, or whatever). In addition, there is
+a version reporting function used to trace compile-vs-runtime conflicts and
+to help administrators ensure that the modules from the correct build are
+in use by the main binary.
 
 The xxx_check(), xxx_close(), xxx_tidy(), and xxx_quote() functions need not
 exist. There is a table in drtables.c which links the lookup names to the
@@ -158,4 +161,14 @@ needed, it can return its single argument, which is a uschar *. This function
 does NOT use the POOL_SEARCH store, because it's usually never called from any
 lookup code.
 
+xxx_report_version()
+--------------------
+
+This is called to report diagnostic information to a file stream.
+Typically it would report both compile-time and run-time version information.
+The arguments are:
+
+  FILE *stream    where to fprintf() the data to
+
+
 ****
index 6e8b88790a77956090b8eb78bb05ddfc3a8acd51..a8fb6b096b2b87e1c7a456ed80a47f98fe0c5062 100644 (file)
@@ -435,6 +435,25 @@ struct cdb_state * cdbp = handle;
  (void)close(cdbp->fileno);
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+cdb_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: CDB: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 lookup_info cdb_lookup_info = {
   US"cdb",                       /* lookup name */
   lookup_absfile,                /* uses absolute file name */
@@ -443,7 +462,8 @@ lookup_info cdb_lookup_info = {
   cdb_find,                      /* find function */
   cdb_close,                     /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  cdb_version_report             /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 29a4a3adb60905f2ca342a848721e9db6768dc25..1b5e69eeb7200a818acee5507047da44f33cdf98 100644 (file)
@@ -142,6 +142,25 @@ static dbmdb_close(void *handle)
 EXIM_DBCLOSE((EXIM_DB *)handle);
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+dbm_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: DBM: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 lookup_info dbm_lookup_info = {
   US"dbm",                       /* lookup name */
   lookup_absfile,                /* uses absolute file name */
@@ -150,7 +169,8 @@ lookup_info dbm_lookup_info = {
   dbmdb_find,                    /* find function */
   dbmdb_close,                   /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  dbm_version_report             /* version reporting */
 };
 
 lookup_info dbmz_lookup_info = {
@@ -161,7 +181,8 @@ lookup_info dbmz_lookup_info = {
   dbmnz_find,                    /* find function */
   dbmdb_close,     /* sic */     /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 #ifdef DYNLOOKUP
index 5c9f96b79873b890a3957d53b984c3bb0b55879d..5e7c158aa1dda04d70a5f1f37a09a3f6ef47a808 100644 (file)
@@ -429,6 +429,25 @@ yield[ptr] = 0;
 return OK;
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+dnsdb_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: DNSDB: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"dnsdb",                     /* lookup name */
   lookup_querystyle,             /* query style */
@@ -437,7 +456,8 @@ static lookup_info _lookup_info = {
   dnsdb_find,                    /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  dnsdb_version_report           /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 575872c41c29d41bc07099ea1515617ecfdede71..7395065e76f6f2e52be71625c81d3eed6ce108e4 100644 (file)
@@ -119,6 +119,24 @@ static dsearch_close(void *handle)
 handle = handle;   /* Avoid compiler warning */
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+dsearch_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: dsearch: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"dsearch",                   /* lookup name */
   lookup_absfile,                /* uses absolute file name */
@@ -127,7 +145,8 @@ static lookup_info _lookup_info = {
   dsearch_find,                  /* find function */
   dsearch_close,                 /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  dsearch_version_report         /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 553d3681df87444fb5f28e64d6a47743f57d0592..72c8de015ae73c574ddb55285b1cc3c6b1f1ea76 100644 (file)
@@ -546,6 +546,24 @@ static uschar *ibase_quote(uschar * s, uschar * opt)
     return quoted;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+ibase_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: ibase: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"ibase",                     /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -554,7 +572,8 @@ static lookup_info _lookup_info = {
   ibase_find,                    /* find function */
   NULL,                          /* no close function */
   ibase_tidy,                    /* tidy function */
-  ibase_quote                    /* quoting function */
+  ibase_quote,                   /* quoting function */
+  ibase_version_report           /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 461ec15e388ad09a94fd1ef929aaf63165fc16c3..943e431db99e53bf5d7a1a4fa13eb9646aabc91d 100644 (file)
@@ -1456,6 +1456,25 @@ else
 return quoted;
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+ldap_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: LDAP: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info ldap_lookup_info = {
   US"ldap",                      /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -1464,7 +1483,8 @@ static lookup_info ldap_lookup_info = {
   eldap_find,                    /* find function */
   NULL,                          /* no close function */
   eldap_tidy,                    /* tidy function */
-  eldap_quote                    /* quoting function */
+  eldap_quote,                   /* quoting function */
+  ldap_version_report            /* version reporting */
 };
 
 static lookup_info ldapdn_lookup_info = {
@@ -1475,7 +1495,8 @@ static lookup_info ldapdn_lookup_info = {
   eldapdn_find,                  /* find function */
   NULL,                          /* no close function */
   eldap_tidy,       /* sic */    /* tidy function */
-  eldap_quote       /* sic */    /* quoting function */
+  eldap_quote,      /* sic */    /* quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 static lookup_info ldapm_lookup_info = {
@@ -1486,7 +1507,8 @@ static lookup_info ldapm_lookup_info = {
   eldapm_find,                   /* find function */
   NULL,                          /* no close function */
   eldap_tidy,       /* sic */    /* tidy function */
-  eldap_quote       /* sic */    /* quoting function */
+  eldap_quote,      /* sic */    /* quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 #ifdef DYNLOOKUP
index 5d64638023bd42ae063bf7b01d9b05980952878b..b96f70980edbc3c85d61074ffd1c776403d880e3 100644 (file)
@@ -410,6 +410,25 @@ lsearch_close(void *handle)
 (void)fclose((FILE *)handle);
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+lsearch_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: lsearch: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info iplsearch_lookup_info = {
   US"iplsearch",                 /* lookup name */
   lookup_absfile,                /* uses absolute file name */
@@ -418,7 +437,8 @@ static lookup_info iplsearch_lookup_info = {
   iplsearch_find,                /* find function */
   lsearch_close,                 /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 static lookup_info lsearch_lookup_info = {
@@ -429,7 +449,8 @@ static lookup_info lsearch_lookup_info = {
   lsearch_find,                  /* find function */
   lsearch_close,                 /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  lsearch_version_report         /* version reporting */
 };
 
 static lookup_info nwildlsearch_lookup_info = {
@@ -440,7 +461,8 @@ static lookup_info nwildlsearch_lookup_info = {
   nwildlsearch_find,             /* find function */
   lsearch_close,                 /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 static lookup_info wildlsearch_lookup_info = {
@@ -451,7 +473,8 @@ static lookup_info wildlsearch_lookup_info = {
   wildlsearch_find,              /* find function */
   lsearch_close,                 /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 #ifdef DYNLOOKUP
index 97b9c11390b1d093a86e01fedc8d0ac2d8e0bdfb..755676e8f37e53b7abdca5392ce8e78976be5474 100644 (file)
@@ -413,6 +413,27 @@ while ((c = *s++) != 0)
 return quoted;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+mysql_version_report(FILE *f)
+{
+fprintf(f, "Library version: MySQL: Compile: %s [%s]\n"
+           "                        Runtime: %s\n",
+        MYSQL_SERVER_VERSION, MYSQL_COMPILATION_COMMENT,
+        mysql_get_client_info());
+#ifdef DYNLOOKUP
+fprintf(f, "                        Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
 /* These are the lookup_info blocks for this driver */
 
 static lookup_info mysql_lookup_info = {
@@ -423,7 +444,8 @@ static lookup_info mysql_lookup_info = {
   mysql_find,                    /* find function */
   NULL,                          /* no close function */
   mysql_tidy,                    /* tidy function */
-  mysql_quote                    /* quoting function */
+  mysql_quote,                   /* quoting function */
+  mysql_version_report           /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 8177f4b7e15f45601a965044b9d3fb1aa960f8db..995f45d201e81fe4fcdc70e183af448bff04a3e8 100644 (file)
@@ -86,6 +86,25 @@ if ((rc = yp_match(CS handle, CS filename, CS keystring, length + 1,
 return (rc == YPERR_KEY || rc == YPERR_MAP)? FAIL : DEFER;
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+nis_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: NIS: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info nis_lookup_info = {
   US"nis",                       /* lookup name */
   0,                             /* not abs file, not query style*/
@@ -94,7 +113,8 @@ static lookup_info nis_lookup_info = {
   nis_find,                      /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  nis_version_report             /* version reporting */
 };
 
 static lookup_info nis0_lookup_info = {
@@ -105,7 +125,8 @@ static lookup_info nis0_lookup_info = {
   nis0_find,                     /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  NULL                           /* no version reporting (redundant) */
 };
 
 #ifdef DYNLOOKUP
index 5213af35ca732fbf9faec6af103d41575a2bf423..966fd74344ef5f99ee9080b8be845696997e4bee 100644 (file)
@@ -259,6 +259,24 @@ while (*s != 0)
 return quoted;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+nisplus_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: NIS+: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"nisplus",                   /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -267,7 +285,8 @@ static lookup_info _lookup_info = {
   nisplus_find,                  /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  nisplus_quote                  /* quoting function */
+  nisplus_quote,                 /* quoting function */
+  nisplus_version_report         /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 50dfb4aeeb7bce2b666bd393f3ebdfde5f9344d7..83092f07178280fa4f620cf9e92406b5d59d22c2 100644 (file)
@@ -604,6 +604,24 @@ while ((c = *s++) != 0)
 return quoted;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+oracle_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: Oracle: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"oracle",                    /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -612,7 +630,8 @@ static lookup_info _lookup_info = {
   oracle_find,                   /* find function */
   NULL,                          /* no close function */
   oracle_tidy,                   /* tidy function */
-  oracle_quote                   /* quoting function */
+  oracle_quote,                  /* quoting function */
+  oracle_version_report          /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 420eefc27984bcba2ec9effd566310d4c26648b8..45c9af266ed146b9f7f9414744ebf09a8d7f3f31 100644 (file)
@@ -52,6 +52,24 @@ if (!route_finduser(keystring, &pw, NULL)) return FAIL;
 return OK;
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+passwd_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: passwd: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
 static lookup_info _lookup_info = {
   US"passwd",                    /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -60,7 +78,8 @@ static lookup_info _lookup_info = {
   passwd_find,                   /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  passwd_version_report          /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 5bd96275fd08599d1ea44c07893497188a4f1442..e94e9a71d6fe6bfaabef7f967ddfdafde45f691b 100644 (file)
@@ -486,6 +486,30 @@ while ((c = *s++) != 0)
 return quoted;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+pgsql_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: PostgreSQL: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+
+/* Version reporting: there appears to be no available information about
+the client library in libpq-fe.h; once you have a connection object, you
+can access the server version and the chosen protocol version, but those
+aren't really what we want.  It might make sense to debug_printf those
+when the connection is established though? */
+}
+
+
 static lookup_info _lookup_info = {
   US"pgsql",                     /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -494,7 +518,8 @@ static lookup_info _lookup_info = {
   pgsql_find,                    /* find function */
   NULL,                          /* no close function */
   pgsql_tidy,                    /* tidy function */
-  pgsql_quote                    /* quoting function */
+  pgsql_quote,                   /* quoting function */
+  pgsql_version_report           /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 2ca4bbab4b5bdb5484d779505e8c7a7c3941801b..b95d0ff1ac038d76071728f668d4d8930ba5aa01 100644 (file)
@@ -74,6 +74,24 @@ static int spf_find(void *handle, uschar *filename, uschar *keystring, int key_l
   return OK;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+spf_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: SPF: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"spf",                       /* lookup name */
   0,                             /* not absfile, not query style */
@@ -82,7 +100,8 @@ static lookup_info _lookup_info = {
   spf_find,                      /* find function */
   spf_close,                     /* close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  spf_version_report             /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 5759c437ab27c2d8d9e19b436ea1f312664d434a..e679973b30e002d4d87142960e05589b4b181adc 100644 (file)
@@ -155,6 +155,27 @@ while ((c = *s++) != 0)
 return quoted;
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+sqlite_version_report(FILE *f)
+{
+fprintf(f, "Library version: SQLite: Compile: %s\n"
+           "                         Runtime: %s\n",
+        SQLITE_VERSION, sqlite3_libversion());
+#ifdef DYNLOOKUP
+fprintf(f, "                         Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
 static lookup_info _lookup_info = {
   US"sqlite",                    /* lookup name */
   lookup_absfilequery,           /* query-style lookup, starts with file name */
@@ -163,7 +184,8 @@ static lookup_info _lookup_info = {
   sqlite_find,                   /* find function */
   sqlite_close,                  /* close function */
   NULL,                          /* no tidy function */
-  sqlite_quote                   /* quoting function */
+  sqlite_quote,                  /* quoting function */
+  sqlite_version_report          /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 03404d82f8db82ede4d5ba1cafa4316d96081a44..4c4558fe405d52edb7496b13e4e3a2134dc9bd5a 100644 (file)
@@ -65,6 +65,24 @@ if (Ustrcmp(query, "nocache") == 0) *do_cache = FALSE;
 return OK;
 }
 
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+testdb_version_report(FILE *f)
+{
+#ifdef DYNLOOKUP
+fprintf(f, "Library version: TestDB: Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
+
 static lookup_info _lookup_info = {
   US"testdb",                    /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -73,7 +91,8 @@ static lookup_info _lookup_info = {
   testdb_find,                   /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  testdb_version_report          /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index d1979058fa3f32ee80cd1f1c549ba711b5aad3d7..b4527a95cd6fab403f62b4545d559205cb2ac960 100644 (file)
@@ -62,6 +62,25 @@ switch (wso_query(query, CS buffer, sizeof(buffer)))
   }
 }
 
+
+
+/*************************************************
+*         Version reporting entry point          *
+*************************************************/
+
+/* See local README for interface description. */
+
+#include "../version.h"
+
+void
+whoson_version_report(FILE *f)
+{
+fprintf(f, "Library version: Whoson: Runtime: %s\n", wso_version());
+#ifdef DYNLOOKUP
+fprintf(f, "                         Exim version %s\n", EXIM_VERSION_STR);
+#endif
+}
+
 static lookup_info _lookup_info = {
   US"whoson",                    /* lookup name */
   lookup_querystyle,             /* query-style lookup */
@@ -70,7 +89,8 @@ static lookup_info _lookup_info = {
   whoson_find,                   /* find function */
   NULL,                          /* no close function */
   NULL,                          /* no tidy function */
-  NULL                           /* no quoting function */
+  NULL,                          /* no quoting function */
+  whoson_version_report          /* version reporting */
 };
 
 #ifdef DYNLOOKUP
index 6cddce6d89d7207305108ac700f3a9fc2f8d3432..ef994a893af73848d0d2806b7bf1efadc9c5daa9 100644 (file)
@@ -11,8 +11,7 @@
 
 #include "exim.h"
 
-
-#define THIS_VERSION  "4.73"
+#include "version.h"
 
 
 /* The header file cnumber.h contains a single line containing the
@@ -41,7 +40,7 @@ sprintf() call is the gcc -Wall warns about a \0 in a format string. */
 version_cnumber = cnumber_buffer;
 version_cnumber_format = US"%d\0<<eximcnumber>>";
 sprintf(CS version_cnumber, CS version_cnumber_format, cnumber);
-version_string = US THIS_VERSION "\0<<eximversion>>";
+version_string = US EXIM_VERSION_STR "\0<<eximversion>>";
 
 Ustrcpy(today, __DATE__);
 if (today[4] == ' ') today[4] = '0';
diff --git a/src/src/version.h b/src/src/version.h
new file mode 100644 (file)
index 0000000..4e544e0
--- /dev/null
@@ -0,0 +1,15 @@
+/*************************************************
+*     Exim - an Internet mail transport agent    *
+*************************************************/
+
+/* Copyright (c) Google, Inc. 2010 */
+/* See the file NOTICE for conditions of use and distribution. */
+
+/* This is bumped by the Exim Maintainers, the release engineer: */
+#define EXIM_RELEASE_VERSION_STR        "4.73"
+/* If you apply extensive local patches, consider putting -foo into here */
+#define EXIM_VARIANT_VERSION            ""
+
+#define EXIM_VERSION_STR        EXIM_RELEASE_VERSION_STR EXIM_VARIANT_VERSION
+
+/* End of version.h */