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 06a18dc3f8a142d6476d7ad8ef0cc72df4d7d5c4..c8e74b5f71cc609030c4eec5dc18319af30eb1d9 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
 -------------------------------------------
 
 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.
 
       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
 -----------------
 
 Exim version 4.63
 -----------------
index 267fc9adc9baaa580c57687c145df279583720ca..e960876016f5688d954d9336f3695f56c8e5cf7a 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
 --------------------
 
 New Features in Exim
 --------------------
@@ -131,6 +131,14 @@ Version 4.64
    plaintext. This can serve as a means of adding authorization to an
    authenticator.
 
    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
 ------------
 
 Version 4.63
 ------------
index 771e6ec089a0f353cda033a6520448ed41dec44c..f20179edeaa37e10357dc5ffc4c418124710f29c 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
 
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -20,7 +20,7 @@ relatively small patches.
 Philip Hazel
 
 Lists created: 20 November 2002
 Philip Hazel
 
 Lists created: 20 November 2002
-Last updated:  18 October 2006
+Last updated:  23 October 2006
 
 
 THE OLD LIST
 
 
 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
 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
 Bob Johannessen           Patch for Sieve envelope tests bug
                           Patch for negative uid/gid bug
 Christian Kellner         Patch for LDAP dereferencing
index fc3e67d2b2ca5db3d3448ed42c560fd1c9b2472d..0a1f2b8c1d2d65c73b9ee02514d0174c9ea66a6b 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    *
 
 /*************************************************
 *     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
        -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
        -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;
       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)
       {
     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 &&
     ) ||
     (
     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 ||
     ) ||
     (
     (daemon_listen || queue_interval >= 0) &&
     (sender_address != NULL || list_options || list_queue || checking ||
-     bi_option)
+      bi_option)
     ) ||
     (
     daemon_listen && queue_interval == 0
     ) ||
     (
     daemon_listen && queue_interval == 0
@@ -3655,12 +3662,12 @@ if (count_queue)
   exit(EXIT_SUCCESS);
   }
 
   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");
   {
   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
 
 
 /* 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)
     {
   {
   if (prod_requires_admin && !admin_user)
     {
@@ -4169,18 +4179,37 @@ if (verify_address_mode || address_test_mode)
   exim_exit(exit_value);
   }
 
   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 (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 (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);
       }
     }
       else printf("%s\n", CS ss);
       }
     }
@@ -4212,6 +4241,14 @@ if (expansion_test)
     #endif
     }
 
     #endif
     }
 
+  /* The data file will be open after -Mset */
+
+  if (deliver_datafile >= 0)
+    {
+    (void)close(deliver_datafile);
+    deliver_datafile = -1;
+    }
+
   exim_exit(EXIT_SUCCESS);
   }
 
   exim_exit(EXIT_SUCCESS);
   }
 
index 0b0215bdcde03c7d72f349fac8d0e71e0ba57e89..6964fbe464426a1384c267cdfa6930c91fcef696 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    *
 
 /*************************************************
 *     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,
 
 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 */
 
 
 /* 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
+>