exim_dumpdb: keys-only output option
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 19 Apr 2022 20:44:17 +0000 (21:44 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 19 Apr 2022 20:44:17 +0000 (21:44 +0100)
doc/doc-docbook/spec.xfpt
src/src/exim_dbutil.c
test/scripts/5892-Resume-OpenSSL/5892
test/stdout/5892

index 89f76243687908184d1f59f96b17459fab3da81f..2b445e3281eef063c0c3c909fa652248071fffa4 100644 (file)
@@ -39954,8 +39954,9 @@ The entire contents of a database are written to the standard output by the
 &'exim_dumpdb'& program,
 .new
 taking as arguments the spool and database names.
-An option &'-z'& may be given to regest times in UTC;
+An option &'-z'& may be given to request times in UTC;
 otherwise times are in the local timezone.
+An option &'-k'& may be given to dump only the record keys.
 .wen
 For example, to dump the retry database:
 .code
index 2cee43b8507ad7d3dcbb13e99939535999892108..3a38c8df26d6c2441f66cdac088dba3d88b45e88 100644 (file)
@@ -47,6 +47,7 @@ whose inclusion is controlled by -D on the compilation command. */
 
 uschar *spool_directory;
 
+BOOL keyonly = FALSE;
 BOOL utc = FALSE;
 
 
@@ -125,13 +126,13 @@ check_args(int argc, uschar **argv, uschar *name, uschar *options)
 uschar * aname = argv[optind + 1];
 if (argc - optind == 2)
   {
-  if (Ustrcmp(aname, "retry") == 0)            return type_retry;
-  if (Ustrcmp(aname, "misc") == 0)             return type_misc;
+  if (Ustrcmp(aname, "retry") == 0)    return type_retry;
+  if (Ustrcmp(aname, "misc") == 0)     return type_misc;
   if (Ustrncmp(aname, "wait-", 5) == 0)        return type_wait;
-  if (Ustrcmp(aname, "callout") == 0)          return type_callout;
+  if (Ustrcmp(aname, "callout") == 0)  return type_callout;
   if (Ustrcmp(aname, "ratelimit") == 0)        return type_ratelimit;
-  if (Ustrcmp(aname, "tls") == 0)              return type_tls;
-  if (Ustrcmp(aname, "seen") == 0)             return type_seen;
+  if (Ustrcmp(aname, "tls") == 0)      return type_tls;
+  if (Ustrcmp(aname, "seen") == 0)     return type_seen;
   }
 usage(name, options);
 return -1;              /* Never obeyed */
@@ -140,16 +141,17 @@ return -1;              /* Never obeyed */
 
 FUNC_MAYBE_UNUSED
 static void
-options(int argc, uschar * argv[], uschar * name)
+options(int argc, uschar * argv[], uschar * name, const uschar * opts)
 {
 int opt;
 
 opterr = 0;
-while ((opt = getopt(argc, (char * const *)argv, "z")) != -1)
+while ((opt = getopt(argc, (char * const *)argv, CCS opts)) != -1)
   switch (opt)
   {
+  case 'k':    keyonly = TRUE; break;
   case 'z':    utc = TRUE; break;
-  default:     usage(name, US" [-z]");
+  default:     usage(name, US" [-z] [-k]");
   }
 }
 
@@ -558,11 +560,11 @@ uschar **argv = USS cargv;
 uschar keybuffer[1024];
 
 store_init();
-options(argc, argv, US"dumpdb");
+options(argc, argv, US"dumpdb", US"kz");
 
 /* Check the arguments, and open the database */
 
-dbdata_type = check_args(argc, argv, US"dumpdb", US" [-z]");
+dbdata_type = check_args(argc, argv, US"dumpdb", US" [-z] [-k]");
 argc -= optind; argv += optind;
 spool_directory = argv[0];
 
@@ -601,12 +603,13 @@ for (uschar * key = dbfn_scan(dbm, TRUE, &cursor);
     }
   Ustrcpy(keybuffer, key);
 
-  if (!(value = dbfn_read_with_length(dbm, keybuffer, &length)))
+  if (keyonly)
+    printf("  %s\n", keybuffer);
+  else if (!(value = dbfn_read_with_length(dbm, keybuffer, &length)))
     fprintf(stderr, "**** Entry \"%s\" was in the key scan, but the record "
                     "was not found in the file - something is wrong!\n",
       CS keybuffer);
   else
-    {
     /* Note: don't use print_time more than once in one statement, since
     it uses a single buffer. */
 
@@ -729,7 +732,6 @@ for (uschar * key = dbfn_scan(dbm, TRUE, &cursor);
        printf("%s\t%s\n", keybuffer, print_time(seen->time_stamp));
        break;
       }
-    }
   store_reset(reset_point);
   }
 
@@ -785,7 +787,7 @@ rmark reset_point;
 uschar * aname;
 
 store_init();
-options(argc, argv, US"fixdb");
+options(argc, argv, US"fixdb", US"z");
 name[0] = 0;  /* No name set */
 
 /* Sort out the database type, verify what we are working on and then process
index 814a27b6bedb29d8065a9d6554113f6fdf8dd79c..e09fc6398eed32d7da69ba4b45a010030513391a 100644 (file)
@@ -46,5 +46,10 @@ exim -DVALUE=resume -DHELO_MSG=differenthost -odf resume@test.ex
 exim -DVALUE=resume -odf resume@test.ex
 ****
 #
+# Check the -k (key only) option on dumpdb
+perl
+system 'DIR/eximdir/exim_dumpdb -k DIR/spool tls';
+****
+#
 killdaemon
 no_msglog_check
index 6f9aa13888c6e7b865df026e976f5dc69a63e782..23a7bcf3edc11deb3f3bb1757f4002e087343279 100644 (file)
@@ -1,4 +1,6 @@
 ### TLS1.2
+  4686560d7a1d9becb8fd0c62406eaaf169b2ea1b889244342653024281bca106
+  b90422e57483069e0b7dbcebbdf1be3504bae64df49ea1f699cc773acc8a76d5
 
 ******** SERVER ********
 ### TLS1.2