Re: [Exim] Different options with same main configuration fi…

Top Page
Delete this message
Reply to this message
Author: Nico Erfurth
Date:  
To: Lena
CC: exim-users
Subject: Re: [Exim] Different options with same main configuration file
On Sat, 4 Oct 2003, Lena wrote:

> .includeifexists
> working like .include (6.3 in Exim Specification), but silently
> ignored if the file doesn't exist. Easy to implement I suppose.
> Or just make .include to work that way.
> But may be someone knows another solution not involving feature request?


I've named it .include_if_exists, and it's a very dirty patch, use it at
your own risk. Maybe it blows up your whole server, maybe it opens root
for everyone, you've been warned so don't blame me later. :)

Nico

--------------------------- Patch appended -------------------------------

diff -uNr exim-4.24/src/readconf.c exim-4.24-include-if-exists/src/readconf.c
--- exim-4.24/src/readconf.c    2003-09-22 10:29:58.000000000 +0200
+++ exim-4.24-include-if-exists/src/readconf.c    2003-10-04 01:54:54.000000000 +0200
@@ -630,18 +630,14 @@


/* Handle .include lines - these are also physical lines. */

-  if (Ustrncmp(ss, ".include ", 9) == 0)
+  if (Ustrncmp(ss, ".include ", 9) == 0 || Ustrncmp(ss, ".include_if_exists ", 19) == 0)
     {
     uschar *t;
-    config_file_item *save = store_get(sizeof(config_file_item));
+    config_file_item *save;
+        struct stat statbuf;
+        BOOL include_if_exists = (ss[8] == '_' ? TRUE : FALSE);


-    save->next = config_file_stack;
-    config_file_stack = save;
-    save->file = config_file;
-    save->filename = config_filename;
-    save->lineno = config_lineno;
-
-    ss += 9;
+    ss += (include_if_exists ? 19 : 9);
     while (isspace(*ss)) ss++;
     t = ss + Ustrlen(ss);
     while (t > ss && isspace(t[-1])) t--;
@@ -651,6 +647,17 @@
       t--;
       }
     *t = 0;
+
+        if (include_if_exists && (Ustat(ss, &statbuf) != 0))
+          continue;
+
+    *save = store_get(sizeof(config_file_item));
+    save->next = config_file_stack;
+    config_file_stack = save;
+    save->file = config_file;
+    save->filename = config_filename;
+    save->lineno = config_lineno;
+
     config_file = Ufopen(ss, "rb");
     if (config_file == NULL)
       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to open included "