more W.I.P
[users/jgh/exim.git] / src / src / exim.c
index 46dcd9100e46e3522e6164d3271bb1dc814d0088..80857a69876b05f5fd12d7ecc82dc6bf38bc51aa 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.c,v 1.10 2004/11/25 13:54:31 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.9.2.1 2004/12/02 09:15:11 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -839,6 +839,9 @@ fprintf(f, "Support for:");
   fprintf(f, " OpenSSL");
   #endif
 #endif
+#ifdef WITH_CONTENT_SCAN
+  fprintf(f, " Content_Scanning");
+#endif
 fprintf(f, "\n");
 
 fprintf(f, "Lookups:");
@@ -1169,8 +1172,7 @@ uschar **argv = USS cargv;
 int  arg_receive_timeout = -1;
 int  arg_smtp_receive_timeout = -1;
 int  arg_error_handling = error_handling;
-int  filter_sfd = -1;
-int  filter_ufd = -1;
+int  filter_fd = -1;
 int  group_count;
 int  i;
 int  list_queue_option = 0;
@@ -1216,6 +1218,7 @@ uschar *ftest_prefix = NULL;
 uschar *ftest_suffix = NULL;
 uschar *real_sender_address;
 uschar *originator_home = US"/";
+BOOL ftest_system = FALSE;
 void *reset_point;
 
 struct passwd *pw;
@@ -1581,32 +1584,20 @@ for (i = 1; i < argc; i++)
     else if (*argrest == 'e')
       expansion_test = checking = TRUE;
 
-    /* -bF:  Run system filter test */
-
-    else if (*argrest == 'F')
-      {
-      filter_test |= FTEST_SYSTEM;
-      if (*(++argrest) != 0) { badarg = TRUE; break; }
-      if (++i < argc) filter_test_sfile = argv[i]; else
-        {
-        fprintf(stderr, "exim: file name expected after %s\n", argv[i-1]);
-        exit(EXIT_FAILURE);
-        }
-      }
-
-    /* -bf:  Run user filter test
+    /* -bf:  Run in mail filter testing mode
+       -bF:  Ditto, but for system filters
        -bfd: Set domain for filter testing
        -bfl: Set local part for filter testing
        -bfp: Set prefix for filter testing
        -bfs: Set suffix for filter testing
     */
 
-    else if (*argrest == 'f')
+    else if (*argrest == 'f' || *argrest == 'F')
       {
-      if (*(++argrest) == 0)
+      ftest_system = *argrest++ == 'F';
+      if (*argrest == 0)
         {
-        filter_test |= FTEST_USER;
-        if (++i < argc) filter_test_ufile = argv[i]; else
+        if(++i < argc) filter_test = argv[i]; else
           {
           fprintf(stderr, "exim: file name expected after %s\n", argv[i-1]);
           exit(EXIT_FAILURE);
@@ -2773,7 +2764,7 @@ if ((
     (smtp_input || extract_recipients || recipients_arg < argc) &&
     (daemon_listen || queue_interval >= 0 || bi_option ||
       test_retry_arg >= 0 || test_rewrite_arg >= 0 ||
-      filter_test != FTEST_NONE || (msg_action_arg > 0 && !one_msg_action))
+      filter_test != NULL || (msg_action_arg > 0 && !one_msg_action))
     ) ||
     (
     msg_action_arg > 0 &&
@@ -2791,19 +2782,19 @@ if ((
     (
     list_options &&
     (checking || smtp_input || extract_recipients ||
-      filter_test != FTEST_NONE || bi_option)
+      filter_test != NULL || bi_option)
     ) ||
     (
     verify_address_mode &&
     (address_test_mode || smtp_input || extract_recipients ||
-      filter_test != FTEST_NONE || bi_option)
+      filter_test != NULL || bi_option)
     ) ||
     (
     address_test_mode && (smtp_input || extract_recipients ||
-      filter_test != FTEST_NONE || bi_option)
+      filter_test != NULL || bi_option)
     ) ||
     (
-    smtp_input && (sender_address != NULL || filter_test != FTEST_NONE ||
+    smtp_input && (sender_address != NULL || filter_test != NULL ||
       extract_recipients)
     ) ||
     (
@@ -2963,7 +2954,7 @@ if ((                                            /* EITHER */
     ) ||                                         /*   OR   */
     expansion_test                               /* expansion testing */
     ||                                           /*   OR   */
-    filter_test != FTEST_NONE)                   /* Filter testing */
+    filter_test != NULL)                         /* Filter testing */
   {
   setgroups(group_count, group_list);
   exim_setugid(real_uid, real_gid, FALSE,
@@ -2986,26 +2977,15 @@ privileged user. */
 
 else exim_setugid(geteuid(), getegid(), FALSE, US"forcing real = effective");
 
-/* If testing a filter, open the file(s) now, before wasting time doing other
+/* If testing a filter, open the file now, before wasting time doing other
 setups and reading the message. */
 
-if ((filter_test & FTEST_SYSTEM) != 0)
+if (filter_test != NULL)
   {
-  filter_sfd = Uopen(filter_test_sfile, O_RDONLY, 0);
-  if (filter_sfd < 0)
+  filter_fd = Uopen(filter_test, O_RDONLY,0);
+  if (filter_fd < 0)
     {
-    fprintf(stderr, "exim: failed to open %s: %s\n", filter_test_sfile,
-      strerror(errno));
-    return EXIT_FAILURE;
-    }
-  }
-
-if ((filter_test & FTEST_USER) != 0)
-  {
-  filter_ufd = Uopen(filter_test_ufile, O_RDONLY, 0);
-  if (filter_ufd < 0)
-    {
-    fprintf(stderr, "exim: failed to open %s: %s\n", filter_test_ufile,
+    fprintf(stderr, "exim: failed to open %s: %s\n", filter_test,
       strerror(errno));
     return EXIT_FAILURE;
     }
@@ -3400,11 +3380,11 @@ if (real_uid != root_uid && real_uid != exim_uid &&
   }
 
 /* If the caller is not trusted, certain arguments are ignored when running for
-real, but are permitted when checking things (-be, -bv, -bt, -bh, -bf, -bF).
-Note that authority for performing certain actions on messages is tested in the
+real, but are permitted when checking things (-be, -bv, -bt, -bh, -bf). Note
+that authority for performing certain actions on messages is tested in the
 queue_action() function. */
 
-if (!trusted_caller && !checking && filter_test == FTEST_NONE)
+if (!trusted_caller && !checking && filter_test == NULL)
   {
   sender_host_name = sender_host_address = interface_address =
     sender_ident = received_protocol = NULL;
@@ -3801,7 +3781,7 @@ for (i = 0;;)
     if (originator_name == NULL)
       {
       if (sender_address == NULL ||
-           (!trusted_caller && filter_test == FTEST_NONE))
+           (!trusted_caller && filter_test == NULL))
         {
         uschar *name = US pw->pw_gecos;
         uschar *amp = Ustrchr(name, '&');
@@ -3935,7 +3915,7 @@ unless a trusted caller supplies a sender address with -f, or is passing in the
 message via SMTP (inetd invocation or otherwise). */
 
 if ((sender_address == NULL && !smtp_input) ||
-    (!trusted_caller && filter_test == FTEST_NONE))
+    (!trusted_caller && filter_test == NULL))
   {
   sender_local = TRUE;
 
@@ -3966,7 +3946,7 @@ if ((!smtp_input && sender_address == NULL) ||
        ||                                /*         OR            */
        (sender_address[0] != 0 &&        /* Non-empty sender address, AND */
        !checking &&                      /* Not running tests, AND */
-       filter_test == FTEST_NONE))       /* Not testing a filter */
+       filter_test == NULL))             /* Not testing a filter */
     {
     sender_address = originator_login;
     sender_address_forced = FALSE;
@@ -4176,7 +4156,7 @@ if (recipients_arg >= argc && !extract_recipients && !smtp_input)
     printf("Configuration file is %s\n", config_main_filename);
     return EXIT_SUCCESS;
     }
-  if (filter_test == FTEST_NONE)
+  if (filter_test == NULL)
     {
     fprintf(stderr,
 "Exim is a Mail Transfer Agent. It is normally called by Mail User Agents,\n"
@@ -4530,9 +4510,9 @@ while (more)
         }
       }
 
-    /* Read the data for the message. If filter_test is not FTEST_NONE, this
-    will just read the headers for the message, and not write anything onto the
-    spool. */
+    /* Read the data for the message. If filter_test is true, this will
+    just read the headers for the message, and not write anything onto
+    the spool. */
 
     message_ended = END_NOTENDED;
     more = receive_msg(extract_recipients);
@@ -4551,7 +4531,7 @@ while (more)
   unless specified. The the return path is set to to the sender unless it has
   already been set from a return-path header in the message. */
 
-  if (filter_test != FTEST_NONE)
+  if (filter_test != NULL)
     {
     deliver_domain = (ftest_domain != NULL)?
       ftest_domain : qualify_domain_recipient;
@@ -4586,27 +4566,8 @@ while (more)
     if (ftest_suffix != NULL) printf("Suffix    = %s\n", ftest_suffix);
 
     chdir("/");   /* Get away from wherever the user is running this from */
-    
-    /* Now we run either a system filter test, or a user filter test, or both. 
-    In the latter case, headers added by the system filter will persist and be 
-    available to the user filter. We need to copy the filter variables 
-    explicitly. */
-    
-    if ((filter_test & FTEST_SYSTEM) != 0)
-      {
-      if (!filter_runtest(filter_sfd, filter_test_sfile, TRUE, more))
-        exim_exit(EXIT_FAILURE);
-      }      
-      
-    memcpy(filter_sn, filter_n, sizeof(filter_sn));
-      
-    if ((filter_test & FTEST_USER) != 0)
-      {
-      if (!filter_runtest(filter_ufd, filter_test_ufile, FALSE, more))
-        exim_exit(EXIT_FAILURE);
-      }      
-      
-    exim_exit(EXIT_SUCCESS);
+    exim_exit(filter_runtest(filter_fd, ftest_system, more)?
+      EXIT_SUCCESS : EXIT_FAILURE);
     }
 
   /* Else act on the result of message reception. We should not get here unless