<BODY>
<H1>Squid 3.1.PRE1 release notes</H1>
-<H2>Squid Developers</H2>$Id: release-3.1.html,v 1.2 2008/01/11 02:33:34 amosjeffries Exp $
+<H2>Squid Developers</H2>$Id: release-3.1.html,v 1.3 2008/01/11 02:38:58 amosjeffries Exp $
<HR>
<EM>This document contains the release notes for version 3.1 of Squid.
Squid is a WWW Cache application developed by the National Laboratory
</PRE>
</P>
+
+<DT><B>include</B><DD>
+<P>New option to import entire secondary configuration files into squid.conf.
+<PRE>
+ Squid will follow the files immediately and insert all their content
+ as if it was at that position in squid.conf. As per squid.conf some
+ options are order-specific within the config as a whole.
+
+ A few layers of include are allowed, but too many are confusing and
+ squid will enforce an include depth of 16 files.
+
+ Syntax:
+ include /path/to/file1 /path/to/file2
+
+</PRE>
+</P>
+
</DL>
</P>
-Squid 3.1.PRE1 release notesSquid Developers$Id: release-3.1.man,v 1.2 2008/01/11 02:33:34 amosjeffries Exp $This document contains the release notes for version 3.1 of Squid.
+Squid 3.1.PRE1 release notesSquid Developers$Id: release-3.1.man,v 1.3 2008/01/11 02:38:58 amosjeffries Exp $This document contains the release notes for version 3.1 of Squid.
Squid is a WWW Cache application developed by the National Laboratory
for Applied Network Research and members of the Web Caching community.Notice
.ec
.ft P
.sp
+.Pp
+.IP "include"
+.nr bi 1
+.Pp
+New option to import entire secondary configuration files into squid.conf.
+.DS
+.sp
+.ft RR
+.nf
+ Squid will follow the files immediately and insert all their content
+ as if it was at that position in squid.conf. As per squid.conf some
+ options are order-specific within the config as a whole.
+
+ A few layers of include are allowed, but too many are confusing and
+ squid will enforce an include depth of 16 files.
+
+ Syntax:
+ include /path/to/file1 /path/to/file2
+
+.DE
+.fi
+.ec
+.ft P
+.sp
+.Pp
.if \n(ll>1 .RE
.nr ll -1
.Pp
<article>\r
<title>Squid 3.1.PRE1 release notes</title>\r
<author>Squid Developers</author>\r
-<date>$Id: release-3.1.sgml,v 1.2 2008/01/11 02:33:34 amosjeffries Exp $</date>\r
+<date>$Id: release-3.1.sgml,v 1.3 2008/01/11 02:38:58 amosjeffries Exp $</date>\r
\r
<abstract>\r
This document contains the release notes for version 3.1 of Squid.\r
*) Doubles the load placed by squid on the DNS network.\r
*) May negatively impact connection delay times.\r
</verb>\r
+\r
+ <tag>include</tag>\r
+ <p>New option to import entire secondary configuration files into squid.conf.\r
+ <verb>\r
+ Squid will follow the files immediately and insert all their content\r
+ as if it was at that position in squid.conf. As per squid.conf some\r
+ options are order-specific within the config as a whole.\r
+\r
+ A few layers of include are allowed, but too many are confusing and\r
+ squid will enforce an include depth of 16 files.\r
+\r
+ Syntax:\r
+ include /path/to/file1 /path/to/file2\r
+ </verb>\r
+\r
</descrip>\r
\r
\r
/*
- * $Id: cache_cf.cc,v 1.532 2007/12/29 18:20:22 hno Exp $
+ * $Id: cache_cf.cc,v 1.533 2008/01/11 02:38:59 amosjeffries Exp $
*
* DEBUG: section 3 Configuration File Parsing
* AUTHOR: Harvest Derived
static void parse_b_size_t(size_t * var);
static void parse_b_int64_t(int64_t * var);
+static int parseOneConfigFile(const char *file_name, unsigned int depth);
+
/*
* LegacyParser is a parser for legacy code that uses the global
* approach. This is static so that it is only exposed to cache_cf.
return s;
}
-int
-parseConfigFile(const char *file_name, CacheManager & manager)
+static int
+parseManyConfigFiles(char* files, int depth)
+{
+ int error_count = 0;
+ char* tmp = files;
+ char* file = strtok(tmp, w_space);
+ while (file != NULL) {
+ tmp += strlen(file) +1;
+ error_count += parseOneConfigFile(file, depth);
+ file = strtok(tmp, w_space);
+ }
+ return error_count;
+}
+
+static int
+parseOneConfigFile(const char *file_name, unsigned int depth)
{
FILE *fp = NULL;
+ const char *orig_cfg_filename = cfg_filename;
+ const int orig_config_lineno = config_lineno;
char *token = NULL;
char *tmp_line = NULL;
int tmp_line_len = 0;
int err_count = 0;
int is_pipe = 0;
- configFreeMemory();
- default_all();
+
+ debugs(3, 1, "Processing Configuration File: " << file_name << " (depth " << depth << ")");
+ if (depth > 16) {
+ fatalf("WARNING: can't include %s: includes are nested too deeply (>16)!\n", file_name);
+ return 1;
+ }
if (file_name[0] == '!' || file_name[0] == '|') {
fp = popen(file_name + 1, "r");
}
if (fp == NULL)
- fatalf("Unable to open configuration file: %s: %s",
- file_name, xstrerror());
+ fatalf("Unable to open configuration file: %s: %s", file_name, xstrerror());
#ifdef _SQUID_WIN32_
*token = '\0';
cfg_filename = new_file_name;
-
-#if PROBABLY_NOT_WANTED_HERE
-
- SetConfigFilename(cfg_filename, false);
-
-#endif
-
}
config_lineno = new_lineno;
debugs(3, 5, "Processing: '" << tmp_line << "'");
- if (!parse_line(tmp_line)) {
- debugs(3, 0, "parseConfigFile: '" << cfg_filename << "' line " <<
- config_lineno << " unrecognized: '" << config_input_line << "'");
- err_count++;
- }
+ /* Handle includes here */
+ if (tmp_line_len >= 9 && strncmp(tmp_line, "include", 7) == 0 && xisspace(tmp_line[7])) {
+ err_count += parseManyConfigFiles(tmp_line + 8, depth + 1);
+ } else if (!parse_line(tmp_line)) {
+ debugs(3, 0, HERE << cfg_filename << ":" << config_lineno << " unrecognized: '" << tmp_line << "'");
+ err_count++;
+ }
safe_free(tmp_line);
tmp_line_len = 0;
fclose(fp);
}
+ cfg_filename = orig_cfg_filename;
+ config_lineno = orig_config_lineno;
+
+ return err_count;
+}
+
+int
+parseConfigFile(const char *file_name, CacheManager & manager)
+{
+ int err_count = 0;
+
+ configFreeMemory();
+
+ default_all();
+
+ err_count = parseOneConfigFile(file_name, 0);
+
defaults_if_none();
/*
return err_count;
}
+
static void
configDoConfigure(void)
{