Sqlite: new-style option to specify db file
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 6 Jun 2020 17:04:36 +0000 (18:04 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 6 Jun 2020 17:04:36 +0000 (18:04 +0100)
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/expand.c
src/src/functions.h
src/src/match.c
src/src/search.c
test/confs/2600
test/runtest
test/scripts/2600-SQLite/2600
test/stderr/2600
test/stdout/2600

index ccfa4424af467d75b478db3fc4a67a06218c45d5..e5a3c4be80d340bed640e382d4a245ea8efc37d8 100644 (file)
@@ -6606,14 +6606,15 @@ cause parts of the string to be replaced by data that is obtained from the
 lookup. Lookups of this type are conditional expansion items. Different results
 can be defined for the cases of lookup success and failure. See chapter
 &<<CHAPexpand>>&, where string expansions are described in detail.
 lookup. Lookups of this type are conditional expansion items. Different results
 can be defined for the cases of lookup success and failure. See chapter
 &<<CHAPexpand>>&, where string expansions are described in detail.
-The key for the lookup is specified as part of the string expansion.
+The key for the lookup is &*specified*& as part of the string expansion.
 .next
 Lists of domains, hosts, and email addresses can contain lookup requests as a
 way of avoiding excessively long linear lists. In this case, the data that is
 returned by the lookup is often (but not always) discarded; whether the lookup
 succeeds or fails is what really counts. These kinds of list are described in
 chapter &<<CHAPdomhosaddlists>>&.
 .next
 Lists of domains, hosts, and email addresses can contain lookup requests as a
 way of avoiding excessively long linear lists. In this case, the data that is
 returned by the lookup is often (but not always) discarded; whether the lookup
 succeeds or fails is what really counts. These kinds of list are described in
 chapter &<<CHAPdomhosaddlists>>&.
-The key for the lookup is given by the context in which the list is expanded.
+The key for the lookup is &*implicit*&,
+given by the context in which the list is expanded.
 .endlist
 
 String expansions, lists, and lookups interact with each other in such a way
 .endlist
 
 String expansions, lists, and lookups interact with each other in such a way
@@ -6648,7 +6649,8 @@ The result of the expansion is not tainted.
 
 In the second example, the lookup is a single item in a domain list. It causes
 Exim to use a lookup to see if the domain that is being processed can be found
 
 In the second example, the lookup is a single item in a domain list. It causes
 Exim to use a lookup to see if the domain that is being processed can be found
-in the file. The file could contains lines like this:
+in the file.
+The file could contains lines like this:
 .code
 domain1:
 domain2:
 .code
 domain1:
 domain2:
@@ -7093,10 +7095,7 @@ passed to a Redis database. See section &<<SECTsql>>&.
 .cindex "sqlite lookup type"
 .cindex "lookup" "sqlite"
 &(sqlite)&: The format of the query is
 .cindex "sqlite lookup type"
 .cindex "lookup" "sqlite"
 &(sqlite)&: The format of the query is
-new
-an optional filename
-followed by an SQL statement
-that is passed to an SQLite database. See section &<<SECTsqlite>>&.
+an SQL statement that is passed to an SQLite database. See section &<<SECTsqlite>>&.
 
 .next
 &(testdb)&: This is a lookup type that is used for testing Exim. It is
 
 .next
 &(testdb)&: This is a lookup type that is used for testing Exim. It is
@@ -8155,18 +8154,28 @@ SQLite is different to the other SQL lookups because a filename is required in
 addition to the SQL query. An SQLite database is a single file, and there is no
 daemon as in the other SQL databases.
 
 addition to the SQL query. An SQLite database is a single file, and there is no
 daemon as in the other SQL databases.
 
+.new
 .oindex &%sqlite_dbfile%&
 .oindex &%sqlite_dbfile%&
-The preferred way of specifying the file is by using the
-&%sqlite_dbfile%& option, set to
-an absolute path.
+There are two ways of
+specifying the file.
+The first is is by using the &%sqlite_dbfile%& main option.
+The second, which allows separate files for each query,
+is to use an option appended, comma-separated, to the &"sqlite"&
+lookup type word.  The option is the word &"file"&, then an equals,
+then the filename.
+The filename in this case cannot contain whitespace or open-brace charachters.
+.wen
+
 A deprecated method is available, prefixing the query with the filename
 separated by white space.
 A deprecated method is available, prefixing the query with the filename
 separated by white space.
-This means that the path name cannot contain white space.
+This means that
 .cindex "tainted data" "sqlite file"
 .cindex "tainted data" "sqlite file"
-It also means that the query cannot use any tainted values, as that taints
+the query cannot use any tainted values, as that taints
 the entire query including the filename - resulting in a refusal to open
 the file.
 
 the entire query including the filename - resulting in a refusal to open
 the file.
 
+In all the above cases the filename must be an absolute path.
+
 Here is a lookup expansion example:
 .code
 sqlite_dbfile = /some/thing/sqlitedb
 Here is a lookup expansion example:
 .code
 sqlite_dbfile = /some/thing/sqlitedb
@@ -10193,11 +10202,8 @@ in a list using the given separator.
 
 
 .vitem "&*${lookup{*&<&'key'&>&*}&~*&<&'search&~type'&>&*&~&&&
 
 
 .vitem "&*${lookup{*&<&'key'&>&*}&~*&<&'search&~type'&>&*&~&&&
-        {*&<&'file'&>&*}&~{*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&"
-This is the first of one of two different types of lookup item, which are both
-described in the next item.
-
-.vitem "&*${lookup&~*&<&'search&~type'&>&*&~{*&<&'query'&>&*}&~&&&
+        {*&<&'file'&>&*}&~{*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&" &&&
+       "&*${lookup&~*&<&'search&~type'&>&*&~{*&<&'query'&>&*}&~&&&
         {*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&"
 .cindex "expansion" "lookup in"
 .cindex "file" "lookups"
         {*&<&'string1'&>&*}&~{*&<&'string2'&>&*}}*&"
 .cindex "expansion" "lookup in"
 .cindex "file" "lookups"
index 5769a9733f264d024a19409dc7e0624620d1f0fb..ecb9814f4e6ae91d6608d81a1169d92985452104 100644 (file)
@@ -29,6 +29,10 @@ Version 4.95
  7. Quota checking during reception (i.e. at SMTP time) for appendfile-
     transport-managed quotas.
 
  7. Quota checking during reception (i.e. at SMTP time) for appendfile-
     transport-managed quotas.
 
+ 8. Sqlite lookups accept a "file=<path>" option to specify a per-operation
+    db file, replacing the previous prefix to the SQL string (which had
+    issues when the SQL used tainted values).
+
 
 Version 4.94
 ------------
 
 Version 4.94
 ------------
index 37be216bbe45e7c58d3ade279b03973abfceb5e1..34e32325ee25de35bb1f93cc1d1c5e9f2baf7111 100644 (file)
@@ -4875,7 +4875,7 @@ while (*s)
       file types, the query (i.e. "key") starts with a file name. */
 
       if (!key)
       file types, the query (i.e. "key") starts with a file name. */
 
       if (!key)
-       key = search_args(stype, name, filename, &filename);
+       key = search_args(stype, name, filename, &filename, opts);
 
       /* If skipping, don't do the next bit - just lookup_value == NULL, as if
       the entry was not found. Note that there is no search_close() function.
 
       /* If skipping, don't do the next bit - just lookup_value == NULL, as if
       the entry was not found. Note that there is no search_close() function.
index e6b78dbe60257a900c3509897dfa2da95dc25ea8..1f0c30d0eb433d4f4f44e5148842110d9e307b95 100644 (file)
@@ -448,7 +448,7 @@ extern void    route_init(void);
 extern gstring * route_show_supported(gstring *);
 extern void    route_tidyup(void);
 
 extern gstring * route_show_supported(gstring *);
 extern void    route_tidyup(void);
 
-extern uschar *search_args(int, uschar *, uschar *, uschar **);
+extern uschar *search_args(int, uschar *, uschar *, uschar **, const uschar *);
 extern uschar *search_find(void *, const uschar *, uschar *, int,
                 const uschar *, int, int, int *, const uschar *);
 extern int     search_findtype(const uschar *, int);
 extern uschar *search_find(void *, const uschar *, uschar *, int,
                 const uschar *, int, int, int *, const uschar *);
 extern int     search_findtype(const uschar *, int);
index 45537413d24d44ff140ebd5c7260f6f88a574bd0..2f6c922510483ed1b310caec94fece34c948f84a 100644 (file)
@@ -286,7 +286,7 @@ if (!cb->use_partial) partial = -1;
 
 /* Set the parameters for the three different kinds of lookup. */
 
 
 /* Set the parameters for the three different kinds of lookup. */
 
-keyquery = search_args(search_type, s, semicolon+1, &filename);
+keyquery = search_args(search_type, s, semicolon+1, &filename, opts);
 
 /* Now do the actual lookup; throw away the data returned unless it was asked
 for; partial matching is all handled inside search_find(). Note that there is
 
 /* Now do the actual lookup; throw away the data returned unless it was asked
 for; partial matching is all handled inside search_find(). Note that there is
index 061a9e8644df9a05dbad8f8f844a18d793781ccf..421d9c789c0ef08d06c29079bf39c61990c533c8 100644 (file)
@@ -223,18 +223,31 @@ Arguments:
  search                the search-type string
  query         argument for the search; filename or query
  fnamep                pointer to return filename
  search                the search-type string
  query         argument for the search; filename or query
  fnamep                pointer to return filename
+ opts          options
 
 Return:        keyquery        the search-type (for single-key) or query (for query-type)
  */
 uschar *
 
 Return:        keyquery        the search-type (for single-key) or query (for query-type)
  */
 uschar *
-search_args(int search_type, uschar * search, uschar * query, uschar ** fnamep)
+search_args(int search_type, uschar * search, uschar * query, uschar ** fnamep,
+  const uschar * opts)
 {
 Uskip_whitespace(&query);
 if (mac_islookup(search_type, lookup_absfilequery))
   {                                    /* query-style but with file (sqlite) */
 {
 Uskip_whitespace(&query);
 if (mac_islookup(search_type, lookup_absfilequery))
   {                                    /* query-style but with file (sqlite) */
-  uschar * s = query;
+  int sep = ',';
+
+  /* Check options first for new-style file spec */
+  if (opts) for (uschar * s; s = string_nextinlist(&opts, &sep, NULL, 0); )
+    if (Ustrncmp(s, "file=", 5) == 0)
+      {
+      *fnamep = s+5;
+      return query;
+      }
+
+  /* If no filename from options, use old-tyle space-sep prefix on query */
   if (*query == '/')
     {
   if (*query == '/')
     {
+    uschar * s = query;
     while (*query && !isspace(*query)) query++;
     *fnamep = string_copyn(s, query - s);
     Uskip_whitespace(&query);
     while (*query && !isspace(*query)) query++;
     *fnamep = string_copyn(s, query - s);
     Uskip_whitespace(&query);
index e42cbe33c5f57e433a5498fc23b0215e383d19b8..29f5afbbedb9850bb2f7460f23ee8fb5153dcf57 100644 (file)
@@ -7,9 +7,15 @@ primary_hostname = myhost.test.ex
 # ----- Main settings -----
 
 domainlist local_domains = @
 # ----- Main settings -----
 
 domainlist local_domains = @
+.ifdef OPT
+hostlist   relay_hosts = sqlite,file=DIR/aux-fixed/sqlitedb; \
+                                     select * from them where \
+                                     id='$sender_host_address'
+.else
 hostlist   relay_hosts = sqlite;DIR/aux-fixed/sqlitedb \
                                      select * from them where \
                                      id='$sender_host_address'
 hostlist   relay_hosts = sqlite;DIR/aux-fixed/sqlitedb \
                                      select * from them where \
                                      id='$sender_host_address'
+.endif
 
 acl_smtp_rcpt = check_recipient
 sqlite_lock_timeout = 2
 
 acl_smtp_rcpt = check_recipient
 sqlite_lock_timeout = 2
index e4cf7ad6da5f65e79d0356dd479d56823d9e850a..93aa82fc942e955d4b7681c189339ce6930fe685 100755 (executable)
@@ -951,12 +951,6 @@ RESET_AFTER_EXTRA_LINE_READ:
   s/^\d\d\d(?=[PFS*])/ddd/;
 
 
   s/^\d\d\d(?=[PFS*])/ddd/;
 
 
-  # ========= Exim lookups ==================
-  # Lookups have a char which depends on the number of lookup types compiled in,
-  # in stderr output.  Replace with a "0".  Recognising this while avoiding
-  # other output is fragile; perhaps the debug output should be revised instead.
-  s%(?<!sqlite)(?<!lsearch\*@)(?<!lsearch\*)(?<!lsearch)[0-?]TESTSUITE/aux-fixed/%0TESTSUITE/aux-fixed/%g;
-
   # ==========================================================
   # MIME boundaries in RFC3461 DSN messages
   s/\d{8,10}-eximdsn-\d+/NNNNNNNNNN-eximdsn-MMMMMMMMMM/;
   # ==========================================================
   # MIME boundaries in RFC3461 DSN messages
   s/\d{8,10}-eximdsn-\d+/NNNNNNNNNN-eximdsn-MMMMMMMMMM/;
@@ -1056,6 +1050,12 @@ RESET_AFTER_EXTRA_LINE_READ:
     # we don't care what TZ enviroment the testhost was running
     next if /^Reset TZ to/;
 
     # we don't care what TZ enviroment the testhost was running
     next if /^Reset TZ to/;
 
+    # ========= Exim lookups ==================
+    # Lookups have a char which depends on the number of lookup types compiled in,
+    # in stderr output.  Replace with a "0".  Recognising this while avoiding
+    # other output is fragile; perhaps the debug output should be revised instead.
+    s%^\s+(:?closing )?\K[0-?]TESTSUITE/aux-fixed/%0TESTSUITE/aux-fixed/%g;
+
     # drop gnutls version strings
     next if /GnuTLS compile-time version: \d+[\.\d]+$/;
     next if /GnuTLS runtime version: \d+[\.\d]+$/;
     # drop gnutls version strings
     next if /GnuTLS compile-time version: \d+[\.\d]+$/;
     next if /GnuTLS runtime version: \d+[\.\d]+$/;
index 2a557a46ac2e6ebb2a02a4ef0b3e1177118001dc..d7e4d69d86b22f4d9ed47bc2654a939f4c933411 100644 (file)
@@ -1,15 +1,23 @@
 # sqlite lookups
 exim -d-all+lookup -be
 # sqlite lookups
 exim -d-all+lookup -be
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select name from them where id='userx';}}
 ${lookup sqlite{DIR/aux-fixed/sqlitedb select name from them where id='userx';}}
 ${lookup sqlite{DIR/aux-fixed/sqlitedb select name from them where id='userx';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select name from them where id='userx';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select name from them where id='xxxx';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select name from them where id='nothing';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select id,name from them where id='nothing';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select * from them where id='quote2';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select * from them where id='newline';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select * from them where id='tab';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select * from them where id='its';}}
-${lookup sqlite{DIR/aux-fixed/sqlitedb select * from them where name='${quote_sqlite:it's}';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{ select name from them where id='userx';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{ select name from them where id='userx';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{ select name from them where id='xxxx';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select name from them where id='nothing';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select id,name from them where id='nothing';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb {select * from them where id='quote2';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select * from them where id='newline';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select * from them where id='tab';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select * from them where id='its';}}
+${lookup sqlite,file=DIR/aux-fixed/sqlitedb{select * from them where name='${quote_sqlite:it's}';}}
+****
+exim -d -DOPT=y -bh 10.0.0.0
+mail from:<a@b>
+rcpt to:<c@d>
+rcpt to:<c@d>
+quit
 ****
 exim -d -bh 10.0.0.0
 mail from:<a@b>
 ****
 exim -d -bh 10.0.0.0
 mail from:<a@b>
@@ -23,7 +31,7 @@ rcpt to:<c@d>
 rcpt to:<c@d>
 quit
 ****
 rcpt to:<c@d>
 quit
 ****
-exim -odi -d userx
+exim -DOPT=y -odi -d userx
 Test message
 .
 ****
 Test message
 .
 ****
index e5dd60a27ef0524ab638cdb6fb3d5c28e166f656..ecc3c2091bb8edaff8588c509ded9214e76d2c16 100644 (file)
@@ -4,10 +4,10 @@ admin user
 dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
 dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select name from them where id='userx';" opts=NULL
+   type=sqlite key="select name from them where id='userx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select name from them where id='userx';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select name from them where id='userx';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -19,16 +19,38 @@ dropping to exim gid; retaining priv uid
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
    type=sqlite key="select name from them where id='userx';" opts=NULL
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
    type=sqlite key="select name from them where id='userx';" opts=NULL
+ cached data found but wrong opts;  file lookup required for select name from them where id='userx';
+ c  in TESTSUITE/aux-fixed/sqlitedb
+ replacing old cache entry
+ lookup yielded: Ayen Other
+ search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+   cached open
+ search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+   key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+ LRU list:
+ internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+   type=sqlite key="select name from them where id='userx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
+ cached data found but wrong opts;  file lookup required for select name from them where id='userx';
+ c  in TESTSUITE/aux-fixed/sqlitedb
+ replacing old cache entry
+ lookup yielded: Ayen Other
+ search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+   cached open
+ search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+   key="select name from them where id='userx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+ LRU list:
+ internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+   type=sqlite key="select name from them where id='userx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  cached data used for lookup of select name from them where id='userx';
    in TESTSUITE/aux-fixed/sqlitedb
  lookup yielded: Ayen Other
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  cached data used for lookup of select name from them where id='userx';
    in TESTSUITE/aux-fixed/sqlitedb
  lookup yielded: Ayen Other
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select name from them where id='xxxx';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select name from them where id='xxxx';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select name from them where id='xxxx';" opts=NULL
+   type=sqlite key="select name from them where id='xxxx';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select name from them where id='xxxx';
    in TESTSUITE/aux-fixed/sqlitedb
  lookup forced cache cleanup
  file lookup required for select name from them where id='xxxx';
    in TESTSUITE/aux-fixed/sqlitedb
  lookup forced cache cleanup
@@ -36,10 +58,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select name from them where id='nothing';" opts=NULL
+   type=sqlite key="select name from them where id='nothing';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select name from them where id='nothing';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select name from them where id='nothing';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -47,10 +69,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select id,name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select id,name from them where id='nothing';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select id,name from them where id='nothing';" opts=NULL
+   type=sqlite key="select id,name from them where id='nothing';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select id,name from them where id='nothing';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select id,name from them where id='nothing';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -58,10 +80,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select * from them where id='quote2';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select * from them where id='quote2';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select * from them where id='quote2';" opts=NULL
+   type=sqlite key="select * from them where id='quote2';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select * from them where id='quote2';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select * from them where id='quote2';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -69,10 +91,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select * from them where id='newline';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select * from them where id='newline';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select * from them where id='newline';" opts=NULL
+   type=sqlite key="select * from them where id='newline';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select * from them where id='newline';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select * from them where id='newline';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -81,10 +103,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select * from them where id='tab';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select * from them where id='tab';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select * from them where id='tab';" opts=NULL
+   type=sqlite key="select * from them where id='tab';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select * from them where id='tab';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select * from them where id='tab';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -92,10 +114,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select * from them where id='its';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select * from them where id='its';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select * from them where id='its';" opts=NULL
+   type=sqlite key="select * from them where id='its';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select * from them where id='its';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select * from them where id='its';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -103,10 +125,10 @@ dropping to exim gid; retaining priv uid
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
    cached open
  search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   key="select * from them where name='it''s';" partial=-1 affix=NULL starflags=0 opts=NULL
+   key="select * from them where name='it''s';" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
  LRU list:
  internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
-   type=sqlite key="select * from them where name='it''s';" opts=NULL
+   type=sqlite key="select * from them where name='it''s';" opts="file=TESTSUITE/aux-fixed/sqlitedb"
  file lookup required for select * from them where name='it''s';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
  file lookup required for select * from them where name='it''s';
    in TESTSUITE/aux-fixed/sqlitedb
  creating new cache entry
@@ -145,12 +167,107 @@ log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
 SMTP>> 250 OK
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
 SMTP>> 250 OK
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
+check domains = +local_domains
+d in "@"? no (end of list)
+d in "+local_domains"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 33)
+check hosts = +relay_hosts
+search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+  key="select * from them where id='10.0.0.0'" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+LRU list:
+internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+  type=sqlite key="select * from them where id='10.0.0.0'" opts="file=TESTSUITE/aux-fixed/sqlitedb"
+file lookup required for select * from them where id='10.0.0.0'
+  in TESTSUITE/aux-fixed/sqlitedb
+lookup forced cache cleanup
+lookup failed
+host in "sqlite,file=TESTSUITE/aux-fixed/sqlitedb; select * from them where id='10.0.0.0'"? no (end of list)
+host in "+relay_hosts"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "deny" (TESTSUITE/test-config 34)
+  message: relay not permitted
+deny: condition test succeeded in ACL "check_recipient"
+end of ACL "check_recipient": DENY
+SMTP>> 550 relay not permitted
+LOG: MAIN REJECT
+  H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
+SMTP<< rcpt to:<c@d>
+using ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 32)
+check domains = +local_domains
+d in "@"? no (end of list)
+d in "+local_domains"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 33)
+check hosts = +relay_hosts
+search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
+  cached open
+search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+  key="select * from them where id='10.0.0.0'" partial=-1 affix=NULL starflags=0 opts="file=TESTSUITE/aux-fixed/sqlitedb"
+LRU list:
+internal_search_find: file="TESTSUITE/aux-fixed/sqlitedb"
+  type=sqlite key="select * from them where id='10.0.0.0'" opts="file=TESTSUITE/aux-fixed/sqlitedb"
+file lookup required for select * from them where id='10.0.0.0'
+  in TESTSUITE/aux-fixed/sqlitedb
+lookup forced cache cleanup
+lookup failed
+host in "sqlite,file=TESTSUITE/aux-fixed/sqlitedb; select * from them where id='10.0.0.0'"? no (end of list)
+host in "+relay_hosts"? no (end of list)
+accept: condition test failed in ACL "check_recipient"
+processing "deny" (TESTSUITE/test-config 34)
+  message: relay not permitted
+deny: condition test succeeded in ACL "check_recipient"
+end of ACL "check_recipient": DENY
+SMTP>> 550 relay not permitted
+LOG: MAIN REJECT
+  H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
+SMTP<< quit
+SMTP>> 221 myhost.test.ex closing connection
+LOG: smtp_connection MAIN
+  SMTP connection from [10.0.0.0] closed by QUIT
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=pppp (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
+Exim version x.yz ....
+changed uid/gid: forcing real = effective
+  uid=uuuu gid=CALLER_GID pid=pppp
+configuration file is TESTSUITE/test-config
+admin user
+changed uid/gid: privilege not needed
+  uid=EXIM_UID gid=EXIM_GID pid=pppp
+seeking password data for user "CALLER": cache not available
+getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
+originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
+sender address = CALLER@myhost.test.ex
+sender_fullhost = [10.0.0.0]
+sender_rcvhost = [10.0.0.0]
+host in hosts_connection_nolog? no (option unset)
+LOG: smtp_connection MAIN
+  SMTP connection from [10.0.0.0]
+host in host_lookup? no (option unset)
+set_process_info: pppp handling incoming connection from [10.0.0.0]
+host in host_reject_connection? no (option unset)
+host in sender_unqualified_hosts? no (option unset)
+host in recipient_unqualified_hosts? no (option unset)
+host in helo_verify_hosts? no (option unset)
+host in helo_try_verify_hosts? no (option unset)
+host in helo_accept_junk_hosts? no (option unset)
+SMTP>> 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+smtp_setup_msg entered
+SMTP<< mail from:<a@b>
+spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
+log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
+SMTP>> 250 OK
+SMTP<< rcpt to:<c@d>
+using ACL "check_recipient"
+processing "accept" (TESTSUITE/test-config 32)
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
 search_find: file="TESTSUITE/aux-fixed/sqlitedb"
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
 search_find: file="TESTSUITE/aux-fixed/sqlitedb"
@@ -165,7 +282,7 @@ lookup failed
 host in "sqlite;TESTSUITE/aux-fixed/sqlitedb select * from them where id='10.0.0.0'"? no (end of list)
 host in "+relay_hosts"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
 host in "sqlite;TESTSUITE/aux-fixed/sqlitedb select * from them where id='10.0.0.0'"? no (end of list)
 host in "+relay_hosts"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
-processing "deny" (TESTSUITE/test-config 28)
+processing "deny" (TESTSUITE/test-config 34)
   message: relay not permitted
 deny: condition test succeeded in ACL "check_recipient"
 end of ACL "check_recipient": DENY
   message: relay not permitted
 deny: condition test succeeded in ACL "check_recipient"
 end of ACL "check_recipient": DENY
@@ -174,12 +291,12 @@ LOG: MAIN REJECT
   H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
   H=[10.0.0.0] F=<a@b> rejected RCPT <c@d>: relay not permitted
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
   cached open
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
   cached open
@@ -195,7 +312,7 @@ lookup failed
 host in "sqlite;TESTSUITE/aux-fixed/sqlitedb select * from them where id='10.0.0.0'"? no (end of list)
 host in "+relay_hosts"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
 host in "sqlite;TESTSUITE/aux-fixed/sqlitedb select * from them where id='10.0.0.0'"? no (end of list)
 host in "+relay_hosts"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
-processing "deny" (TESTSUITE/test-config 28)
+processing "deny" (TESTSUITE/test-config 34)
   message: relay not permitted
 deny: condition test succeeded in ACL "check_recipient"
 end of ACL "check_recipient": DENY
   message: relay not permitted
 deny: condition test succeeded in ACL "check_recipient"
 end of ACL "check_recipient": DENY
@@ -240,12 +357,12 @@ log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
 SMTP>> 250 OK
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
 SMTP>> 250 OK
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
 search_find: file="TESTSUITE/aux-fixed/sqlitedb"
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
 search_find: file="TESTSUITE/aux-fixed/sqlitedb"
@@ -264,12 +381,12 @@ end of ACL "check_recipient": ACCEPT
 SMTP>> 250 Accepted
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
 SMTP>> 250 Accepted
 SMTP<< rcpt to:<c@d>
 using ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 26)
+processing "accept" (TESTSUITE/test-config 32)
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
 check domains = +local_domains
 d in "@"? no (end of list)
 d in "+local_domains"? no (end of list)
 accept: condition test failed in ACL "check_recipient"
-processing "accept" (TESTSUITE/test-config 27)
+processing "accept" (TESTSUITE/test-config 33)
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
   cached open
 check hosts = +relay_hosts
 search_open: sqlite "TESTSUITE/aux-fixed/sqlitedb"
   cached open
@@ -335,7 +452,7 @@ LOG: MAIN
   <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 created log directory TESTSUITE/spool/log
 search_tidyup called
   <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 created log directory TESTSUITE/spool/log
 search_tidyup called
-exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-0005vi-00
+exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -DOPT=y -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -odi -Mc 10HmaX-0005vi-00
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=EXIM_GID pid=pppp
 Exim version x.yz ....
 changed uid/gid: forcing real = effective
   uid=uuuu gid=EXIM_GID pid=pppp
index 53d6b9b23bbccdfba7e3505ca54e4aed7e2efb2c..c21783b864a1613c70238f948fc977ccde982548 100644 (file)
@@ -1,5 +1,7 @@
 > Ayen Other
 > Ayen Other
 > Ayen Other
 > Ayen Other
+> Ayen Other
+> Ayen Other
 > 
 > 
 > id=nothing name="" 
 > 
 > 
 > id=nothing name="" 
@@ -21,6 +23,16 @@ after" id=newline
 550 relay not permitted\r
 221 myhost.test.ex closing connection\r
 
 550 relay not permitted\r
 221 myhost.test.ex closing connection\r
 
+**** SMTP testing session as if from host 10.0.0.0
+**** but without any ident (RFC 1413) callback.
+**** This is not for real!
+
+220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000\r
+250 OK\r
+550 relay not permitted\r
+550 relay not permitted\r
+221 myhost.test.ex closing connection\r
+
 **** SMTP testing session as if from host 10.10.10.10
 **** but without any ident (RFC 1413) callback.
 **** This is not for real!
 **** SMTP testing session as if from host 10.10.10.10
 **** but without any ident (RFC 1413) callback.
 **** This is not for real!