Drop server_realm from heimdal_gssapi
[exim.git] / src / src / spool_mbox.c
index 69b0995ad190e13ba44601f5ef0bfe64d1cbb89d..635fb8df1c4085150f7d5b51f0d55920154b3e60 100644 (file)
@@ -1,5 +1,3 @@
-/* $Cambridge: exim/src/src/spool_mbox.c,v 1.12 2006/09/12 10:35:56 ph10 Exp $ */
-
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
@@ -25,9 +23,10 @@ extern int spam_ok;
 int spool_mbox_ok = 0;
 uschar spooled_message_id[17];
 
-/* returns a pointer to the FILE, and puts the size in bytes into mbox_file_size */
+/* returns a pointer to the FILE, and puts the size in bytes into mbox_file_size
+ * normally, source_file_override is NULL */
 
-FILE *spool_mbox(unsigned long *mbox_file_size) {
+FILE *spool_mbox(unsigned long *mbox_file_size, uschar *source_file_override) {
   uschar message_subdir[2];
   uschar buffer[16384];
   uschar *temp_string;
@@ -69,7 +68,7 @@ FILE *spool_mbox(unsigned long *mbox_file_size) {
     temp_string = expand_string(
       US"From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox}\n"
       "${if def:sender_address{X-Envelope-From: <${sender_address}>\n}}"
-      "${if def:received_for{X-Envelope-To: <${received_for}>\n}}");
+      "${if def:recipients{X-Envelope-To: ${recipients}\n}}");
 
     if (temp_string != NULL) {
       i = fwrite(temp_string, Ustrlen(temp_string), 1, mbox_file);
@@ -100,13 +99,17 @@ FILE *spool_mbox(unsigned long *mbox_file_size) {
     (void)fwrite("\n", 1, 1, mbox_file);
 
     /* copy body file */
-    message_subdir[1] = '\0';
-    for (i = 0; i < 2; i++) {
-      message_subdir[0] = (split_spool_directory == (i == 0))? message_id[5] : 0;
-      temp_string = string_sprintf("%s/input/%s/%s-D", spool_directory,
-        message_subdir, message_id);
-      data_file = Ufopen(temp_string, "rb");
-      if (data_file != NULL) break;
+    if (source_file_override == NULL) {
+      message_subdir[1] = '\0';
+      for (i = 0; i < 2; i++) {
+        message_subdir[0] = (split_spool_directory == (i == 0))? message_id[5] : 0;
+        temp_string = string_sprintf("%s/input/%s/%s-D", spool_directory,
+          message_subdir, message_id);
+        data_file = Ufopen(temp_string, "rb");
+        if (data_file != NULL) break;
+      };
+    } else {
+      data_file = Ufopen(source_file_override, "rb");
     };
 
     if (data_file == NULL) {
@@ -125,7 +128,8 @@ FILE *spool_mbox(unsigned long *mbox_file_size) {
      * explicitly, because the one in the file is parted of the locked area.
      */
 
-    (void)fseek(data_file, SPOOL_DATA_START_OFFSET, SEEK_SET);
+    if (!source_file_override)
+      (void)fseek(data_file, SPOOL_DATA_START_OFFSET, SEEK_SET);
 
     do {
       j = fread(buffer, 1, sizeof(buffer), data_file);
@@ -140,6 +144,9 @@ FILE *spool_mbox(unsigned long *mbox_file_size) {
       };
     } while (j > 0);
 
+    (void)fclose(mbox_file);
+    mbox_file = NULL;
+
     Ustrcpy(spooled_message_id, message_id);
     spool_mbox_ok = 1;
   };
@@ -185,6 +192,12 @@ void unspool_mbox(void) {
     mbox_path = string_sprintf("%s/scan/%s", spool_directory, spooled_message_id);
 
     tempdir = opendir(CS mbox_path);
+    if (!tempdir) {
+      debug_printf("Unable to opendir(%s): %s\n", mbox_path, strerror(errno));
+      /* Just in case we still can: */
+      rmdir(CS mbox_path);
+      return;
+    }
     /* loop thru dir & delete entries */
     while((entry = readdir(tempdir)) != NULL) {
       uschar *name = US entry->d_name;