John Jetmore's -Mset patch.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 23 Oct 2006 13:24:21 +0000 (13:24 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 23 Oct 2006 13:24:21 +0000 (13:24 +0000)
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/ACKNOWLEDGMENTS
src/src/exim.c
src/src/macros.h
test/confs/0542 [new file with mode: 0644]
test/log/0542 [new file with mode: 0644]
test/scripts/0000-Basic/0542 [new file with mode: 0644]
test/stdout/0542 [new file with mode: 0644]

index 06a18dc..c8e74b5 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.412 2006/10/23 10:55:10 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.413 2006/10/23 13:24:21 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -162,6 +162,8 @@ PH/24 Exim crashed if verify=helo was activated during an incoming -bs
       connection, where there is no client IP address to check. In this
       situation, the verify now always succeeds.
 
+PH/25 Applied John Jetmore's -Mset patch.
+
 
 Exim version 4.63
 -----------------
index 267fc9a..e960876 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.117 2006/10/16 15:44:36 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.118 2006/10/23 13:24:21 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -131,6 +131,14 @@ Version 4.64
    plaintext. This can serve as a means of adding authorization to an
    authenticator.
 
+7. There is a new command-line option called -Mset. It is useful only in
+   conjunction with -be (that is, when testing string expansions). It must be
+   followed by a message id; Exim loads the given message before doing the
+   expansions, thus setting message-specific variables such as $message_size
+   and the header variables. This feature is provided to make it easier to test
+   expansions that make use of these variables. However, Exim must be called by
+   an admin user when -Mset is used.
+
 
 Version 4.63
 ------------
index 771e6ec..f20179e 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.59 2006/10/18 08:55:37 ph10 Exp $
+$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.60 2006/10/23 13:24:21 ph10 Exp $
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -20,7 +20,7 @@ relatively small patches.
 Philip Hazel
 
 Lists created: 20 November 2002
-Last updated:  18 October 2006
+Last updated:  23 October 2006
 
 
 THE OLD LIST
@@ -169,6 +169,7 @@ Pierre Humblet            Continued Cygwin support
 Peter Ilieve              Suggested patch for lookup search bug
 John Jetmore              Writing and maintaining the 'exipick' utility
                           Much helpful testing of the test suite
+                          Patch for -Mset
 Bob Johannessen           Patch for Sieve envelope tests bug
                           Patch for negative uid/gid bug
 Christian Kellner         Patch for LDAP dereferencing
index fc3e67d..0a1f2b8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.c,v 1.44 2006/10/02 13:38:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.45 2006/10/23 13:24:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -2252,6 +2252,7 @@ for (i = 1; i < argc; i++)
        -Mmad mark all recipients delivered
        -Mmd  mark recipients(s) delivered
        -Mes  edit sender
+       -Mset load a message for use with -be
        -Mvb  show body
        -Mvh  show header
        -Mvl  show log
@@ -2289,6 +2290,11 @@ for (i = 1; i < argc; i++)
       one_msg_action = TRUE;
       }
     else if (Ustrcmp(argrest, "rm") == 0) msg_action = MSG_REMOVE;
+    else if (Ustrcmp(argrest, "set") == 0)
+      {
+      msg_action = MSG_LOAD;
+      one_msg_action = TRUE;
+      }
     else if (Ustrcmp(argrest, "t") == 0)  msg_action = MSG_THAW;
     else if (Ustrcmp(argrest, "vb") == 0)
       {
@@ -2886,13 +2892,14 @@ if ((
     ) ||
     (
     msg_action_arg > 0 &&
-    (daemon_listen || queue_interval >= 0 || list_options || checking ||
-     bi_option || test_retry_arg >= 0 || test_rewrite_arg >= 0)
+    (daemon_listen || queue_interval >= 0 || list_options ||
+      (checking && msg_action != MSG_LOAD) ||
+      bi_option || test_retry_arg >= 0 || test_rewrite_arg >= 0)
     ) ||
     (
     (daemon_listen || queue_interval >= 0) &&
     (sender_address != NULL || list_options || list_queue || checking ||
-     bi_option)
+      bi_option)
     ) ||
     (
     daemon_listen && queue_interval == 0
@@ -3655,12 +3662,12 @@ if (count_queue)
   exit(EXIT_SUCCESS);
   }
 
-/* Handle actions on specific messages, except for the force delivery action,
-which is done below. Some actions take a whole list of message ids, which
-are known to continue up to the end of the arguments. Others take a single
-message id and then operate on the recipients list. */
+/* Handle actions on specific messages, except for the force delivery and
+message load actions, which are done below. Some actions take a whole list of
+message ids, which are known to continue up to the end of the arguments. Others
+take a single message id and then operate on the recipients list. */
 
-if (msg_action_arg > 0 && msg_action != MSG_DELIVER)
+if (msg_action_arg > 0 && msg_action != MSG_DELIVER && msg_action != MSG_LOAD)
   {
   int yield = EXIT_SUCCESS;
   set_process_info("acting on specified messages");
@@ -3840,16 +3847,19 @@ if (list_options)
 
 
 /* Handle a request to deliver one or more messages that are already on the
-queue. Values of msg_action other than MSG_DELIVER are dealt with above. This
-is typically used for a small number when prodding by hand (when the option
-forced_delivery will be set) or when re-execing to regain root privilege.
-Each message delivery must happen in a separate process, so we fork a process
-for each one, and run them sequentially so that debugging output doesn't get
-intertwined, and to avoid spawning too many processes if a long list is given.
-However, don't fork for the last one; this saves a process in the common case
-when Exim is called to deliver just one message. */
-
-if (msg_action_arg > 0)
+queue. Values of msg_action other than MSG_DELIVER and MSG_LOAD are dealt with
+above. MSG_LOAD is handled with -be (which is the only time it applies) below.
+
+Delivery of specific messages is typically used for a small number when
+prodding by hand (when the option forced_delivery will be set) or when
+re-execing to regain root privilege. Each message delivery must happen in a
+separate process, so we fork a process for each one, and run them sequentially
+so that debugging output doesn't get intertwined, and to avoid spawning too
+many processes if a long list is given. However, don't fork for the last one;
+this saves a process in the common case when Exim is called to deliver just one
+message. */
+
+if (msg_action_arg > 0 && msg_action != MSG_LOAD)
   {
   if (prod_requires_admin && !admin_user)
     {
@@ -4169,18 +4179,37 @@ if (verify_address_mode || address_test_mode)
   exim_exit(exit_value);
   }
 
-/* Handle expansion checking */
+/* Handle expansion checking. Either expand items on the command line, or read
+from stdin if there aren't any. If -Mset was specified, load the message so
+that its variables can be used, but restrict this facility to admin users. */
 
 if (expansion_test)
   {
+  if (msg_action_arg > 0 && msg_action == MSG_LOAD)
+    {
+    uschar spoolname[256];  /* Not big_buffer; used in spool_read_header() */
+    if (!admin_user)
+      {
+      fprintf(stderr, "exim: permission denied\n");
+      exit(EXIT_FAILURE);
+      }
+    message_id = argv[msg_action_arg];
+    (void)string_format(spoolname, sizeof(spoolname), "%s-H", message_id);
+    if (!spool_open_datafile(message_id))
+      printf ("Failed to load message datafile %s\n", message_id);
+    if (spool_read_header(spoolname, TRUE, FALSE) != spool_read_OK)
+      printf ("Failed to load message %s\n", message_id);
+    }
+
+  /* Expand command line items */
+
   if (recipients_arg < argc)
     {
     while (recipients_arg < argc)
       {
       uschar *s = argv[recipients_arg++];
       uschar *ss = expand_string(s);
-      if (ss == NULL)
-        printf ("Failed: %s\n", expand_string_message);
+      if (ss == NULL) printf ("Failed: %s\n", expand_string_message);
       else printf("%s\n", CS ss);
       }
     }
@@ -4212,6 +4241,14 @@ if (expansion_test)
     #endif
     }
 
+  /* The data file will be open after -Mset */
+
+  if (deliver_datafile >= 0)
+    {
+    (void)close(deliver_datafile);
+    deliver_datafile = -1;
+    }
+
   exim_exit(EXIT_SUCCESS);
   }
 
index 0b0215b..6964fbe 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.27 2006/09/05 13:24:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.28 2006/10/23 13:24:21 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -713,7 +713,7 @@ enum {
 
 enum { MSG_DELIVER, MSG_FREEZE, MSG_REMOVE, MSG_THAW, MSG_ADD_RECIPIENT,
        MSG_MARK_ALL_DELIVERED, MSG_MARK_DELIVERED, MSG_EDIT_SENDER,
-       MSG_SHOW_BODY, MSG_SHOW_HEADER, MSG_SHOW_LOG };
+       MSG_SHOW_BODY, MSG_SHOW_HEADER, MSG_SHOW_LOG, MSG_LOAD };
 
 /* Returns from the spool_read_header() function */
 
diff --git a/test/confs/0542 b/test/confs/0542
new file mode 100644 (file)
index 0000000..7b886ea
--- /dev/null
@@ -0,0 +1,17 @@
+# Exim test configuration 0542
+
+exim_path = EXIM_PATH
+host_lookup_order = bydns
+primary_hostname = myhost.test.ex
+rfc1413_query_timeout = 0s
+spool_directory = DIR/spool
+log_file_path = DIR/spool/log/%slog
+gecos_pattern = ""
+gecos_name = CALLER_NAME
+
+# ----- Main settings -----
+
+queue_only
+
+
+# End
diff --git a/test/log/0542 b/test/log/0542
new file mode 100644 (file)
index 0000000..f59faf8
--- /dev/null
@@ -0,0 +1 @@
+1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
diff --git a/test/scripts/0000-Basic/0542 b/test/scripts/0000-Basic/0542
new file mode 100644 (file)
index 0000000..90645d7
--- /dev/null
@@ -0,0 +1,17 @@
+# -Mset
+exim userx@test.x usery@test.ex
+From: Himself <himself@there.tld>
+To: Yourself <you@here.tld>
+Subject: The subject is not the object
+
+This is the body of the message.
+****
+sudo exim -be -Mset $msg1
+From: $h_from:
+Subject: $h_subject:
+message_body_size=$message_body_size
+message_size=$message_size
+message_id=$message_id
+message_exim_id=$message_exim_id
+****
+no_msglog_check
diff --git a/test/stdout/0542 b/test/stdout/0542
new file mode 100644 (file)
index 0000000..aecedca
--- /dev/null
@@ -0,0 +1,7 @@
+> From: Himself <himself@there.tld>
+> Subject: The subject is not the object
+> message_body_size=33
+> message_size=416
+> message_id=10HmaX-0005vi-00
+> message_exim_id=10HmaX-0005vi-00
+>