From c0d172ee5e0d4fb34240ed2df98d6543a5f5de85 Mon Sep 17 00:00:00 2001 From: amosjeffries <> Date: Tue, 26 Feb 2008 06:25:24 +0000 Subject: [PATCH] Author: Adrian Chadd + Gonzalo Arana include directive for squid.conf This patch adds an 'include' option to squid.conf for the purpose of importing configuration details external to the squid.conf file itself see Squid 3.0 Release notes for further details. --- doc/release-notes/release-3.0.sgml | 17 ++++++- src/cache_cf.cc | 72 ++++++++++++++++++++++-------- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/doc/release-notes/release-3.0.sgml b/doc/release-notes/release-3.0.sgml index 52f11994fc..aed752ba9b 100644 --- a/doc/release-notes/release-3.0.sgml +++ b/doc/release-notes/release-3.0.sgml @@ -2,7 +2,7 @@
Squid 3.0.RC1 release notes Squid Developers -$Id: release-3.0.sgml,v 1.30.2.1 2008/02/24 10:58:12 amosjeffries Exp $ +$Id: release-3.0.sgml,v 1.30.2.2 2008/02/25 23:25:24 amosjeffries Exp $ This document contains the release notes for version 3.0 of Squid. @@ -326,6 +326,21 @@ The 'httpready' filter delays delivering new connections to Squid until a full HTTP request has been received. See the accf_http(9) man page. + + include +

New option to import entire secondary configuration files into squid.conf. + + 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 + + diff --git a/src/cache_cf.cc b/src/cache_cf.cc index 6907cbed3d..372af2b04e 100644 --- a/src/cache_cf.cc +++ b/src/cache_cf.cc @@ -1,6 +1,6 @@ /* - * $Id: cache_cf.cc,v 1.528.2.1 2008/02/25 03:01:00 amosjeffries Exp $ + * $Id: cache_cf.cc,v 1.528.2.2 2008/02/25 23:25:25 amosjeffries Exp $ * * DEBUG: section 3 Configuration File Parsing * AUTHOR: Harvest Derived @@ -151,6 +151,8 @@ static int check_null_https_port_list(const https_port_list *); 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. @@ -203,17 +205,37 @@ skip_ws(const char* s) 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"); @@ -223,8 +245,7 @@ parseConfigFile(const char *file_name, CacheManager & manager) } 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_ @@ -270,13 +291,6 @@ parseConfigFile(const char *file_name, CacheManager & manager) *token = '\0'; cfg_filename = new_file_name; - -#if PROBABLY_NOT_WANTED_HERE - - SetConfigFilename(cfg_filename, false); - -#endif - } config_lineno = new_lineno; @@ -306,11 +320,13 @@ parseConfigFile(const char *file_name, CacheManager & manager) 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; @@ -326,6 +342,23 @@ parseConfigFile(const char *file_name, CacheManager & manager) 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(); /* @@ -351,6 +384,7 @@ parseConfigFile(const char *file_name, CacheManager & manager) return err_count; } + static void configDoConfigure(void) { -- 2.47.2