Index: includes/bootstrap.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v retrieving revision 1.10 diff -u -r1.10 bootstrap.inc --- includes/bootstrap.inc 15 Feb 2004 15:57:55 -0000 1.10 +++ includes/bootstrap.inc 19 Feb 2004 18:23:35 -0000 @@ -4,25 +4,42 @@ function conf_init() { /* - ** Try finding a matching configuration file by stripping the website's - ** URI from left to right. If no configuration file is found, return a - ** default value 'conf'. + ** Try finding a matching configuration directory by stripping the + ** website's hostname from left to right and pathname from right to + ** left. If no configuration file is found, return a default value + ** '$confdir/default'. Example for a ficticious site installed at + ** http://www.drupal.org/test: + ** + ** 1. www.drupal.org.test + ** 2. drupal.org.test + ** 3. www.drupal.org + ** 4. drupal.org + ** 5. default */ - $uri = $_SERVER["PHP_SELF"]; + static $conf = ""; - $file = strtolower(strtr($_SERVER["HTTP_HOST"] . substr($uri, 0, strrpos($uri, "/")), "/:", "..")); + if ($conf) { + return $conf; + } - while (strlen($file) > 4) { - if (file_exists("includes/$file.php")) { - return $file; - } - else { - $file = substr($file, strpos($file, ".") + 1); + $uri = explode("/", $_SERVER["PHP_SELF"]); + $server = explode(".", $_SERVER["HTTP_HOST"]); + $confdir = "conf"; + + for ($i = count($uri) - 1; $i > 0; $i--) { + for ($j = count($server); $j > 1; $j--) { + $dir = implode(".", array_slice($server, -$j)) . implode(".", array_slice($uri, 0, $i)); + + if (file_exists("$confdir/$dir/config.php")) { + $conf = "$confdir/$dir"; + return $conf; + } } } - return "conf"; + $conf = "$confdir/default"; + return $conf; } function variable_init($conf = array()) { @@ -247,7 +264,7 @@ unset($conf); $config = conf_init(); -include_once "includes/$config.php"; +include_once "$config/config.php"; include_once "includes/database.inc"; include_once "includes/session.inc"; include_once "includes/module.inc"; Index: includes/file.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/file.inc,v retrieving revision 1.9 diff -u -r1.9 file.inc --- includes/file.inc 15 Feb 2004 15:40:06 -0000 1.9 +++ includes/file.inc 19 Feb 2004 18:23:35 -0000 @@ -343,8 +343,8 @@ } elseif (ereg($mask, $file)) { $name = basename($file); - $files["$dir/$file"]->filename = "$dir/$file"; - $files["$dir/$file"]->name = substr($name, 0, strrpos($name, '.')); + $files["$name"]->filename = "$dir/$file"; + $files["$name"]->name = substr($name, 0, strrpos($name, '.')); if ($callback) { $callback("$dir/$file"); } Index: modules/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system.module,v retrieving revision 1.130 diff -u -r1.130 system.module --- modules/system.module 19 Feb 2004 12:27:33 -0000 1.130 +++ modules/system.module 19 Feb 2004 18:23:35 -0000 @@ -226,28 +226,46 @@ } function system_listing($type) { + $config = conf_init(); + // Pick appropriate directory and filetype switch ($type) { case "modules": - $directory = "modules"; + $directory[] = "modules"; + + if (file_exists("$config/modules")) { + $directory[] = "$config/modules"; + } + $type = "module"; break; case "themes": default: - $directory = "themes"; + $directory[] = "themes"; + + if (file_exists("$config/themes")) { + $directory[] = "$config/themes"; + } + $type = "theme"; break; } - // Find files in the directory. - $files = file_scan_directory($directory, "\.$type$"); + // Find files in the directories. + $files = array(); + + foreach ($directory as $dir) { + $files = array_merge($files, file_scan_directory($dir, "\.$type$")); + } // Extract current files from database. $result = db_query("SELECT filename, type, status, throttle FROM {system} WHERE type = '%s'", $type); while ($file = db_fetch_object($result)) { - if (is_object($files[$file->filename])) { + $basename = basename($file->filename); + unset($file->filename); + if (is_object($files[$basename])) { foreach ($file as $key => $value) { - $files[$file->filename]->$key = $value; + $files[$basename]->$key = $value; } } } @@ -255,9 +273,9 @@ ksort($files); if ($type == "module") { - $required = array("modules/admin.module", "modules/filter.module", "modules/system.module", "modules/user.module", "modules/watchdog.module"); + $required = array("admin.module", "filter.module", "system.module", "user.module", "watchdog.module"); // the throttle mechanism requires additional modules always be enabled - $throttle_required = array_merge($required, array("modules/statistics.module", "modules/throttle.module")); + $throttle_required = array_merge($required, array("statistics.module", "throttle.module")); $header = array(t("name"), t("description"), t("status"), t("throttle")); } @@ -266,8 +284,8 @@ $header = array(t("name"), t("description"), t("enable"), t("default")); } - foreach ($files as $filename => $file) { - include_once($filename); + foreach ($files as $basename => $file) { + include_once($file->filename); if ($type == "module") { $info->name = module_invoke($file->name, "help", "admin/system/modules#name") ? module_invoke($file->name, "help", "admin/system/modules#name") : module_invoke($file->name, "system", "name") ? module_invoke($file->name, "system", "name") : $file->name; $info->description = module_invoke($file->name, "help", "admin/system/modules#description") ? module_invoke($file->name, "help", "admin/system/modules#description") : module_invoke($file->name, "system", "description"); @@ -292,12 +310,12 @@ } // Update the contents of the system table: - db_query("DELETE FROM {system} WHERE filename = '%s' AND type = '%s'", $filename, $type); - db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $info->name, $info->description, $type, $filename, $file->status, $file->throttle, $bootstrap); + db_query("DELETE FROM {system} WHERE name = '%s' AND type = '%s'", $info->name, $type); + db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $info->name, $info->description, $type, $file->filename, $file->status, $file->throttle, $bootstrap); - $row = array($info->name, $info->description, array("data" => (in_array($filename, $required) ? form_hidden("status][$filename", 1) . t("required") : form_checkbox("", "status][$filename", 1, $file->status)), "align" => "center")); + $row = array($info->name, $info->description, array("data" => (in_array($basename, $required) ? form_hidden("status][$file->filename", 1) . t("required") : form_checkbox("", "status][$file->filename", 1, $file->status)), "align" => "center")); if ($type == "module") { - $row[] = array("data" => (in_array($filename, $throttle_required) ? form_hidden("throttle][$filename", 0) . t("required") : form_checkbox(NULL, "throttle][$filename", 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array("disabled" => "disabled"))), "align" => "center"); + $row[] = array("data" => (in_array($basename, $throttle_required) ? form_hidden("throttle][$file->filename", 0) . t("required") : form_checkbox(NULL, "throttle][$file->filename", 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array("disabled" => "disabled"))), "align" => "center"); } else if ($type == "theme") { $row[] = array("data" => form_radio("", "theme_default", $info->name, (variable_get("theme_default",0) == $info->name) ? 1 : 0), "align" => "center");