From a3bb66e4e81817737ce02ce8f3d0cff5c32fdae9 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Sat, 20 Sep 2008 20:22:25 +0000
Subject: [PATCH] #259623 by dopry and Damien Tournoud: Convert
 includes/requires to use absolute paths.

---
 cron.php                                      |  7 ++-
 includes/batch.inc                            |  4 +-
 includes/bootstrap.inc                        | 32 +++++------
 includes/common.inc                           | 22 ++++----
 includes/database/database.inc                |  5 +-
 includes/form.inc                             |  2 +-
 includes/install.inc                          | 50 ++++++++---------
 includes/locale.inc                           |  4 +-
 includes/mail.inc                             |  2 +-
 includes/menu.inc                             |  2 +-
 includes/module.inc                           | 17 +++---
 includes/registry.inc                         | 10 ++--
 includes/theme.inc                            | 24 ++++----
 includes/theme.maintenance.inc                | 14 ++---
 index.php                                     |  7 ++-
 install.php                                   | 55 ++++++++++---------
 modules/color/color.module                    |  2 +-
 modules/locale/locale.module                  |  4 +-
 modules/simpletest/drupal_web_test_case.php   |  2 +-
 modules/simpletest/simpletest.module          |  4 +-
 modules/simpletest/tests/registry.test        | 10 ++--
 modules/system/system.admin.inc               | 14 ++---
 modules/system/system.install                 |  2 +-
 modules/update/update.fetch.inc               |  2 +-
 modules/update/update.module                  |  4 +-
 modules/user/user.install                     |  2 +-
 modules/user/user.module                      |  4 +-
 modules/user/user.test                        |  2 +-
 scripts/password-hash.sh                      |  6 +-
 scripts/run-tests.sh                          |  3 +-
 themes/engines/phptemplate/phptemplate.engine |  2 +-
 update.php                                    | 19 ++++---
 xmlrpc.php                                    | 11 +++-
 33 files changed, 187 insertions(+), 163 deletions(-)

diff --git a/cron.php b/cron.php
index 063b1feefd3d..553830d88e2f 100644
--- a/cron.php
+++ b/cron.php
@@ -6,7 +6,12 @@
  * Handles incoming requests to fire off regularly-scheduled tasks (cron jobs).
  */
 
-include_once './includes/bootstrap.inc';
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
+
+include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 if (isset($_GET['cron_key']) && variable_get('cron_key', 'drupal') == $_GET['cron_key']) {
   drupal_cron_run();
diff --git a/includes/batch.inc b/includes/batch.inc
index c4f481a056e9..611875154c14 100644
--- a/includes/batch.inc
+++ b/includes/batch.inc
@@ -183,7 +183,7 @@ function _batch_process() {
     // request, we check if it requires an additional file for functions
     // definitions.
     if ($set_changed && isset($current_set['file']) && is_file($current_set['file'])) {
-      include_once($current_set['file']);
+      include_once DRUPAL_ROOT . '/' . $current_set['file'];
     }
 
     $task_message = '';
@@ -304,7 +304,7 @@ function _batch_finished() {
     if (isset($batch_set['finished'])) {
       // Check if the set requires an additional file for functions definitions.
       if (isset($batch_set['file']) && is_file($batch_set['file'])) {
-        include_once($batch_set['file']);
+        include_once DRUPAL_ROOT . '/' . $batch_set['file'];
       }
       if (function_exists($batch_set['finished'])) {
         $batch_set['finished']($batch_set['success'], $batch_set['results'], $batch_set['operations']);
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index fd27b84a8e57..d21508fbe916 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -329,8 +329,8 @@ function conf_init() {
   global $databases, $db_prefix, $cookie_domain, $conf, $installed_profile, $update_free_access;
   $conf = array();
 
-  if (file_exists('./' . conf_path() . '/settings.php')) {
-    include_once './' . conf_path() . '/settings.php';
+  if (file_exists(DRUPAL_ROOT . '/' . conf_path() . '/settings.php')) {
+    include_once DRUPAL_ROOT . '/' . conf_path() . '/settings.php';
   }
 
   if (isset($base_url)) {
@@ -602,7 +602,7 @@ function drupal_load($type, $name) {
   $filename = drupal_get_filename($type, $name);
 
   if ($filename) {
-    include_once "./$filename";
+    include_once DRUPAL_ROOT . '/' . $filename;
     $files[$type][$name] = TRUE;
 
     return TRUE;
@@ -1006,7 +1006,7 @@ function _drupal_bootstrap($phase) {
     case DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE:
       // Allow specifying special cache handlers in settings.php, like
       // using memcached or files for storing cache information.
-      require_once variable_get('cache_inc', './includes/cache.inc');
+      require_once DRUPAL_ROOT . '/' . variable_get('cache_inc', 'includes/cache.inc');
       // If the page_cache_fastpath is set to TRUE in settings.php and
       // page_cache_fastpath (implemented in the special implementation of
       // cache.inc) printed the page and indicated this with a returned TRUE
@@ -1019,7 +1019,7 @@ function _drupal_bootstrap($phase) {
     case DRUPAL_BOOTSTRAP_DATABASE:
       // Initialize the database system.  Note that the connection
       // won't be initialized until it is actually requested.
-      require_once './includes/database/database.inc';
+      require_once DRUPAL_ROOT . '/includes/database/database.inc';
       // Register autoload functions so that we can access classes and interfaces.
       spl_autoload_register('drupal_autoload_class');
       spl_autoload_register('drupal_autoload_interface');
@@ -1035,7 +1035,7 @@ function _drupal_bootstrap($phase) {
       break;
 
     case DRUPAL_BOOTSTRAP_SESSION:
-      require_once variable_get('session_inc', './includes/session.inc');
+      require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'includes/session.inc');
       session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy_sid', '_sess_gc');
       session_start();
       break;
@@ -1044,7 +1044,7 @@ function _drupal_bootstrap($phase) {
       // Initialize configuration variables, using values from settings.php if available.
       $conf = variable_init(isset($conf) ? $conf : array());
       // Load module handling.
-      require_once './includes/module.inc';
+      require_once DRUPAL_ROOT . '/includes/module.inc';
       $cache_mode = variable_get('cache', CACHE_DISABLED);
       // Get the page from the cache.
       $cache = $cache_mode == CACHE_DISABLED ? '' : page_get_cache();
@@ -1071,13 +1071,13 @@ function _drupal_bootstrap($phase) {
       break;
 
     case DRUPAL_BOOTSTRAP_PATH:
-      require_once './includes/path.inc';
+      require_once DRUPAL_ROOT . '/includes/path.inc';
       // Initialize $_GET['q'] prior to loading modules and invoking hook_init().
       drupal_init_path();
       break;
 
     case DRUPAL_BOOTSTRAP_FULL:
-      require_once './includes/common.inc';
+      require_once DRUPAL_ROOT . '/includes/common.inc';
       _drupal_bootstrap_full();
       break;
   }
@@ -1092,7 +1092,7 @@ function _drupal_bootstrap($phase) {
  * @see _drupal_maintenance_theme()
  */
 function drupal_maintenance_theme() {
-  require_once './includes/theme.maintenance.inc';
+  require_once DRUPAL_ROOT . '/includes/theme.maintenance.inc';
   _drupal_maintenance_theme();
 }
 
@@ -1120,7 +1120,7 @@ function drupal_init_language() {
     $language = language_default();
   }
   else {
-    include_once './includes/language.inc';
+    include_once DRUPAL_ROOT . '/includes/language.inc';
     $language = language_initialize();
   }
 }
@@ -1270,7 +1270,7 @@ function drupal_get_schema($table = NULL, $rebuild = FALSE) {
       // Invoke hook_schema for all modules.
       foreach (module_implements('schema') as $module) {
         $current = module_invoke($module, 'schema');
-        require_once('./includes/common.inc');
+        require_once DRUPAL_ROOT . '/includes/common.inc';
         if (drupal_function_exists('_drupal_initialize_schema')) {
           _drupal_initialize_schema($module, $current);
         }
@@ -1342,7 +1342,7 @@ function drupal_function_exists($function) {
 
   $file = db_result(db_query("SELECT filename FROM {registry} WHERE name = :name AND type = :type", array(':name' => $function, ':type' => 'function')));
   if ($file) {
-    require_once($file);
+    require_once DRUPAL_ROOT . '/' . $file;
     $checked[$function] = function_exists($function);
     if ($checked[$function]) {
       registry_mark_code('function', $function);
@@ -1390,7 +1390,7 @@ function drupal_autoload_class($class) {
 function _registry_check_code($type, $name) {
   $file = db_result(db_query("SELECT filename FROM {registry} WHERE name = :name AND type = :type", array(':name' => $name, ':type' => $type)));
   if ($file) {
-    require_once($file);
+    require_once DRUPAL_ROOT . '/' . $file;
     registry_mark_code($type, $name);
     return TRUE;
   }
@@ -1430,7 +1430,7 @@ function registry_mark_code($type, $name, $return = FALSE) {
  * each function, file, and hook implementation in the database.
  */
 function registry_rebuild() {
-  require_once './includes/registry.inc';
+  require_once DRUPAL_ROOT . '/includes/registry.inc';
   _registry_rebuild();
 }
 
@@ -1501,7 +1501,7 @@ function registry_load_path_files($return = FALSE) {
   $cache = cache_get('registry:' . $menu['path'], 'cache_registry');
   if (!empty($cache->data)) {
     foreach(explode(';', $cache->data) as $file) {
-      require_once($file);
+      require_once DRUPAL_ROOT . '/' . $file;
       $file_cache_data[] = $file;
     }
   }
diff --git a/includes/common.inc b/includes/common.inc
index 50be5bb71811..42cc5b7e2434 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -2491,7 +2491,7 @@ function drupal_valid_token($token, $value = '', $skip_anonymous = FALSE) {
  *     failed. See xmlrpc_error().
  */
 function xmlrpc($url) {
-  require_once './includes/xmlrpc.inc';
+  require_once DRUPAL_ROOT . '/includes/xmlrpc.inc';
   $args = func_get_args();
   return call_user_func_array('_xmlrpc', $args);
 }
@@ -2503,16 +2503,16 @@ function _drupal_bootstrap_full() {
     return;
   }
   $called = 1;
-  require_once './includes/theme.inc';
-  require_once './includes/pager.inc';
-  require_once './includes/menu.inc';
-  require_once './includes/tablesort.inc';
-  require_once './includes/file.inc';
-  require_once './includes/unicode.inc';
-  require_once './includes/image.inc';
-  require_once './includes/form.inc';
-  require_once './includes/mail.inc';
-  require_once './includes/actions.inc';
+  require_once DRUPAL_ROOT . '/includes/theme.inc';
+  require_once DRUPAL_ROOT . '/includes/pager.inc';
+  require_once DRUPAL_ROOT . '/includes/menu.inc';
+  require_once DRUPAL_ROOT . '/includes/tablesort.inc';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
+  require_once DRUPAL_ROOT . '/includes/unicode.inc';
+  require_once DRUPAL_ROOT . '/includes/image.inc';
+  require_once DRUPAL_ROOT . '/includes/form.inc';
+  require_once DRUPAL_ROOT . '/includes/mail.inc';
+  require_once DRUPAL_ROOT . '/includes/actions.inc';
   // Set the Drupal custom error handler.
   set_error_handler('drupal_error_handler');
   // Emit the correct charset HTTP header.
diff --git a/includes/database/database.inc b/includes/database/database.inc
index 0369b34b05bd..49402d02bb69 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -825,8 +825,7 @@ final protected static function openConnection($key, $target) {
       // We cannot rely on the registry yet, because the registry requires
       // an open database connection.
       $driver_class = 'DatabaseConnection_' . $driver;
-      $driver_file = './includes/database/' . $driver . '/database.inc';
-      require_once($driver_file);
+      require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/database.inc';
       self::$connections[$key][$target] = new $driver_class(self::$databaseInfo[$key][$target]);
 
       // We need to pass around the simpletest database prefix in the request
@@ -1809,7 +1808,7 @@ function db_result(DatabaseStatement $statement) {
 
 function _db_need_install() {
   if (!function_exists('install_goto')) {
-    include_once 'includes/install.inc';
+    include_once DRUPAL_ROOT . '/includes/install.inc';
     install_goto('install.php');
   }
 }
diff --git a/includes/form.inc b/includes/form.inc
index 3c64b0dc4e52..bd7cb7ba68e4 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -2504,7 +2504,7 @@ function batch_process($redirect = NULL, $url = NULL) {
     else {
       // Non-progressive execution: bypass the whole progressbar workflow
       // and execute the batch in one pass.
-      require_once './includes/batch.inc';
+      require_once DRUPAL_ROOT . '/includes/batch.inc';
       _batch_process();
     }
   }
diff --git a/includes/install.inc b/includes/install.inc
index 3bf434ebd0f4..047701480b31 100644
--- a/includes/install.inc
+++ b/includes/install.inc
@@ -211,8 +211,8 @@ function drupal_detect_database_types() {
   // without modifying the installer.
   // Because we have no registry yet, we need to also include the install.inc
   // file for the driver explicitly.
-  foreach (glob('./includes/database/*/{install,database}.inc', GLOB_BRACE) as $file) {
-    include_once($file);
+  foreach (glob(DRUPAL_ROOT . '/includes/database/*/{install,database}.inc', GLOB_BRACE) as $file) {
+    include_once $file;
     $dir_parts = explode('/', $file, -1);
     $drivers[end($dir_parts)] = $file;
   }
@@ -330,8 +330,8 @@ protected function runTestQuery($query, $success, $message, $fatal = FALSE) {
  *   An array of settings that need to be updated.
  */
 function drupal_rewrite_settings($settings = array(), $prefix = '') {
-  $default_settings = './sites/default/default.settings.php';
-  $settings_file = './' . conf_path(FALSE, TRUE) . '/' . $prefix . 'settings.php';
+  $default_settings = 'sites/default/default.settings.php';
+  $settings_file = conf_path(FALSE, TRUE) . '/' . $prefix . 'settings.php';
 
   // Build list of setting names and insert the values into the global namespace.
   $keys = array();
@@ -342,7 +342,7 @@ function drupal_rewrite_settings($settings = array(), $prefix = '') {
 
   $buffer = NULL;
   $first = TRUE;
-  if ($fp = fopen($default_settings, 'r')) {
+  if ($fp = fopen(DRUPAL_ROOT . '/' . $default_settings, 'r')) {
     // Step line by line through settings.php.
     while (!feof($fp)) {
       $line = fgets($fp);
@@ -390,7 +390,7 @@ function drupal_rewrite_settings($settings = array(), $prefix = '') {
       }
     }
 
-    $fp = fopen($settings_file, 'w');
+    $fp = fopen(DRUPAL_ROOT . '/' . $settings_file, 'w');
     if ($fp && fwrite($fp, $buffer) === FALSE) {
       drupal_set_message(st('Failed to modify %settings, please verify the file permissions.', array('%settings' => $settings_file)), 'error');
     }
@@ -425,16 +425,16 @@ function drupal_get_install_files($module_list = array()) {
  *   The list of modules to install.
  */
 function drupal_verify_profile($profile, $locale) {
-  include_once './includes/file.inc';
-  include_once './includes/common.inc';
+  include_once DRUPAL_ROOT . '/includes/file.inc';
+  include_once DRUPAL_ROOT . '/includes/common.inc';
 
-  $profile_file = "./profiles/$profile/$profile.profile";
+  $profile_file = DRUPAL_ROOT . "/profiles/$profile/$profile.profile";
 
   if (!isset($profile) || !file_exists($profile_file)) {
     install_no_profile_error();
   }
 
-  require_once($profile_file);
+  require_once $profile_file;
 
   // Get a list of modules required by this profile.
   $function = $profile . '_profile_modules';
@@ -521,11 +521,11 @@ function drupal_install_init_database() {
   if (!$included) {
     $connection_info = Database::getConnectionInfo();
     $driver = $connection_info['default']['driver'];
-    require_once('./includes/database/query.inc');
-    require_once('./includes/database/select.inc');
-    require_once('./includes/database/schema.inc');
-    foreach (glob('./includes/database/' . $driver . '/*.inc') as $include_file) {
-      require_once($include_file);
+    require_once DRUPAL_ROOT . '/includes/database/query.inc';
+    require_once DRUPAL_ROOT . '/includes/database/select.inc';
+    require_once DRUPAL_ROOT . '/includes/database/schema.inc';
+    foreach (glob(DRUPAL_ROOT . '/includes/database/' . $driver . '/*.inc') as $include_file) {
+      require_once $include_file;
     }
   }
 }
@@ -538,7 +538,7 @@ function drupal_install_init_database() {
  */
 function drupal_install_system() {
   $system_path = dirname(drupal_get_filename('module', 'system', NULL));
-  require_once './' . $system_path . '/system.install';
+  require_once DRUPAL_ROOT . '/' . $system_path . '/system.install';
   drupal_install_init_database();
   module_invoke('system', 'install');
   
@@ -818,16 +818,16 @@ function st($string, $args = array()) {
 
   if (!isset($locale_strings)) {
     $locale_strings = array();
-    $filename = './profiles/' . $profile . '/translations/' . $install_locale . '.po';
-    if (file_exists($filename)) {
-      require_once './includes/locale.inc';
+    $filename = 'profiles/' . $profile . '/translations/' . $install_locale . '.po';
+    if (file_exists(DRUPAL_ROOT . '/' . $filename)) {
+      require_once DRUPAL_ROOT . '/includes/locale.inc';
       $file = (object) array('filepath' => $filename);
       _locale_import_read_po('mem-store', $file);
       $locale_strings = _locale_import_one_string('mem-report');
     }
   }
 
-  require_once './includes/theme.inc';
+  require_once DRUPAL_ROOT . '/includes/theme.inc';
   // Transform arguments before inserting them
   foreach ($args as $key => $value) {
     switch ($key[0]) {
@@ -856,15 +856,15 @@ function st($string, $args = array()) {
  *   Array of the install profile's requirements.
  */
 function drupal_check_profile($profile) {
-  include_once './includes/file.inc';
+  include_once DRUPAL_ROOT . '/includes/file.inc';
 
-  $profile_file = "./profiles/$profile/$profile.profile";
+  $profile_file = DRUPAL_ROOT . "/profiles/$profile/$profile.profile";
 
   if (!isset($profile) || !file_exists($profile_file)) {
     install_no_profile_error();
   }
 
-  require_once($profile_file);
+  require_once $profile_file;
 
   // Get a list of modules required by this profile.
   $function = $profile . '_profile_modules';
@@ -876,7 +876,7 @@ function drupal_check_profile($profile) {
   // Collect requirement testing results
   $requirements = array();
   foreach ($installs as $install) {
-    require_once $install->filename;
+    require_once DRUPAL_ROOT . '/' . $install->filename;
     $function = $install->name. '_requirements';
     if (function_exists($function)) {
       $requirements = array_merge($requirements, $function('install'));
@@ -916,7 +916,7 @@ function drupal_check_module($module) {
   // Include install file
   $install = drupal_get_install_files(array($module));
   if (isset($install[$module])) {
-    require_once $install[$module]->filename;
+    require_once DRUPAL_ROOT . '/' . $install[$module]->filename;
 
     // Check requirements
     $requirements = module_invoke($module, 'requirements', 'install');
diff --git a/includes/locale.inc b/includes/locale.inc
index b06390265aa9..5d1c9e352e93 100644
--- a/includes/locale.inc
+++ b/includes/locale.inc
@@ -1040,7 +1040,7 @@ function _locale_import_po($file, $langcode, $mode, $group = NULL) {
  */
 function _locale_import_read_po($op, $file, $mode = NULL, $lang = NULL, $group = 'default') {
 
-  $fd = fopen($file->filepath, "rb"); // File will get closed by PHP on return
+  $fd = fopen(DRUPAL_ROOT . '/' . $file->filepath, "rb"); // File will get closed by PHP on return
   if (!$fd) {
     _locale_import_message('The translation import failed, because the file %filename could not be read.', $file);
     return FALSE;
@@ -2543,7 +2543,7 @@ function _locale_batch_build($files, $finished = NULL, $components = array()) {
         'title'         => $t('Importing interface translations'),
         'init_message'  => $t('Starting import'),
         'error_message' => $t('Error importing interface translations'),
-        'file'          => './includes/locale.inc',
+        'file'          => 'includes/locale.inc',
         // This is not a batch API construct, but data passed along to the
         // installer, so we know what did we import already.
         '#components'   => $components,
diff --git a/includes/mail.inc b/includes/mail.inc
index a7db9a287198..e4b1cb5056e9 100644
--- a/includes/mail.inc
+++ b/includes/mail.inc
@@ -173,7 +173,7 @@ function drupal_mail($module, $key, $to, $language, $params = array(), $from = N
 function drupal_mail_send($message) {
   // Allow for a custom mail backend.
   if (variable_get('smtp_library', '') && file_exists(variable_get('smtp_library', ''))) {
-    include_once './' . variable_get('smtp_library', '');
+    include_once DRUPAL_ROOT . '/' . variable_get('smtp_library', '');
     return drupal_mail_wrapper($message);
   }
   else {
diff --git a/includes/menu.inc b/includes/menu.inc
index 95ec71e59506..d5e45a0c51e2 100644
--- a/includes/menu.inc
+++ b/includes/menu.inc
@@ -2472,7 +2472,7 @@ function _menu_site_is_offline() {
         return $_GET['q'] != 'user' && $_GET['q'] != 'user/login';
       }
       // Logged in users are unprivileged here, so they are logged out.
-      require_once drupal_get_path('module', 'user') . '/user.pages.inc';
+      require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'user') . '/user.pages.inc';
       user_logout();
     }
   }
diff --git a/includes/module.inc b/includes/module.inc
index 2a131d81faef..779d647f7353 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -220,7 +220,7 @@ function module_exists($module) {
  */
 function module_load_install($module) {
   // Make sure the installation API is available
-  include_once './includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
 
   module_load_include('install', $module);
 }
@@ -241,16 +241,13 @@ function module_load_include($type, $module, $name = NULL) {
   }
 
   if (drupal_function_exists('drupal_get_path')) {
-    $file = './' . drupal_get_path('module', $module) . "/$name.$type";
-  }
-
-  if (is_file($file)) {
-    require_once $file;
-    return $file;
-  }
-  else {
-    return FALSE;
+    $file = DRUPAL_ROOT . '/' . drupal_get_path('module', $module) . "/$name.$type";
+    if (is_file($file)) {
+      require_once $file;
+      return $file;
+    }
   }
+  return FALSE;
 }
 
 /**
diff --git a/includes/registry.inc b/includes/registry.inc
index e306c8487b55..2f58f36deeaa 100644
--- a/includes/registry.inc
+++ b/includes/registry.inc
@@ -33,9 +33,9 @@ function _registry_rebuild() {
   // registry rebuild process runs.
   $connection_info = Database::getConnectionInfo();
   $driver = $connection_info['default']['driver'];
-  require_once('./includes/database/query.inc');
-  require_once('./includes/database/select.inc');
-  require_once('./includes/database/' . $driver . '/query.inc');
+  require_once DRUPAL_ROOT . '/includes/database/query.inc';
+  require_once DRUPAL_ROOT . '/includes/database/select.inc';
+  require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/query.inc';
 
   // Reset the resources cache.
   _registry_get_resource_name();
@@ -45,12 +45,12 @@ function _registry_rebuild() {
     if ($module->status) {
       $dir = dirname($module->filename);
       foreach ($module->info['files'] as $file) {
-        $files["./$dir/$file"] = array();
+        $files["$dir/$file"] = array();
       }
     }
   }
   foreach (file_scan_directory('includes', '/\.inc$/') as $filename => $file) {
-    $files["./$filename"] = array();
+    $files["$filename"] = array();
   }
 
   foreach (registry_get_parsed_files() as $filename => $file) {
diff --git a/includes/theme.inc b/includes/theme.inc
index 2ad9f2e6e5b9..3b76c070c734 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -166,7 +166,7 @@ function _init_theme($theme, $base_theme = array(), $registry_callback = '_theme
   // Initialize the theme.
   if (isset($theme->engine)) {
     // Include the engine.
-    include_once './' . $theme->owner;
+    include_once DRUPAL_ROOT . '/' . $theme->owner;
 
     $theme_engine = $theme->engine;
     if (function_exists($theme_engine . '_init')) {
@@ -181,12 +181,12 @@ function _init_theme($theme, $base_theme = array(), $registry_callback = '_theme
     foreach ($base_theme as $base) {
       // Include the theme file or the engine.
       if (!empty($base->owner)) {
-        include_once './' . $base->owner;
+        include_once DRUPAL_ROOT . '/' . $base->owner;
       }
     }
     // and our theme gets one too.
     if (!empty($theme->owner)) {
-      include_once './' . $theme->owner;
+      include_once DRUPAL_ROOT . '/' . $theme->owner;
     }
   }
 
@@ -298,10 +298,10 @@ function _theme_process_registry(&$cache, $name, $type, $theme, $path) {
       // files can prevent them from getting registered.
       if (isset($info['file']) && !isset($info['path'])) {
         $result[$hook]['file'] = $path . '/' . $info['file'];
-        include_once($result[$hook]['file']);
+        include_once DRUPAL_ROOT . '/' . $result[$hook]['file'];
       }
       elseif (isset($info['file']) && isset($info['path'])) {
-        include_once($info['path'] . '/' . $info['file']);
+        include_once DRUPAL_ROOT . '/' . $info['path'] . '/' . $info['file'];
       }
 
       if (isset($info['template']) && !isset($info['path'])) {
@@ -600,7 +600,7 @@ function theme() {
     if (isset($info['path'])) {
       $include_file = $info['path'] . '/' . $include_file;
     }
-    include_once($include_file);
+    include_once DRUPAL_ROOT . '/' . $include_file;
   }
   if (isset($info['function'])) {
     // The theme call is a function.
@@ -974,12 +974,12 @@ function theme_get_setting($setting_name, $refresh = FALSE) {
  *   The output generated by the template.
  */
 function theme_render_template($file, $variables) {
-  extract($variables, EXTR_SKIP);  // Extract the variables to a local namespace
-  ob_start();                      // Start output buffering
-  include "./$file";               // Include the file
-  $contents = ob_get_contents();   // Get the contents of the buffer
-  ob_end_clean();                  // End buffering and discard
-  return $contents;                // Return the contents
+  extract($variables, EXTR_SKIP);      // Extract the variables to a local namespace
+  ob_start();                          // Start output buffering
+  include DRUPAL_ROOT . '/' . $file;   // Include the file
+  $contents = ob_get_contents();       // Get the contents of the buffer
+  ob_end_clean();                      // End buffering and discard
+  return $contents;                    // Return the contents
 }
 
 /**
diff --git a/includes/theme.maintenance.inc b/includes/theme.maintenance.inc
index 1ece4e58fd7b..3cb1ee90d6d3 100644
--- a/includes/theme.maintenance.inc
+++ b/includes/theme.maintenance.inc
@@ -22,13 +22,13 @@ function _drupal_maintenance_theme() {
     return;
   }
 
-  require_once './includes/path.inc';
-  require_once './includes/theme.inc';
-  require_once './includes/common.inc';
-  require_once './includes/unicode.inc';
-  require_once './includes/file.inc';
-  require_once './includes/module.inc';
-  require_once './includes/database/database.inc';
+  require_once DRUPAL_ROOT . '/includes/path.inc';
+  require_once DRUPAL_ROOT . '/includes/theme.inc';
+  require_once DRUPAL_ROOT . '/includes/common.inc';
+  require_once DRUPAL_ROOT . '/includes/unicode.inc';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
+  require_once DRUPAL_ROOT . '/includes/module.inc';
+  require_once DRUPAL_ROOT . '/includes/database/database.inc';
   unicode_check();
 
   // Install and update pages are treated differently to prevent theming overrides.
diff --git a/index.php b/index.php
index b5ffd7930041..dba9f1123c9b 100644
--- a/index.php
+++ b/index.php
@@ -12,7 +12,12 @@
  * See COPYRIGHT.txt and LICENSE.txt.
  */
 
-require_once './includes/bootstrap.inc';
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
+
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 $return = menu_execute_active_handler();
 
diff --git a/install.php b/install.php
index faf909a6c8d0..a68b47699be3 100644
--- a/install.php
+++ b/install.php
@@ -1,7 +1,12 @@
 <?php
 // $Id$
 
-require_once './includes/install.inc';
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
+
+require_once DRUPAL_ROOT . '/includes/install.inc';
 
 /**
  * Global flag to indicate that site is in installation mode.
@@ -28,14 +33,14 @@ function install_main() {
     exit;
   }
 
-  require_once './includes/bootstrap.inc';
+  require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
   drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
 
   // This must go after drupal_bootstrap(), which unsets globals!
   global $profile, $install_locale, $conf;
 
-  require_once './modules/system/system.install';
-  require_once './includes/file.inc';
+  require_once DRUPAL_ROOT . '/modules/system/system.install';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
 
   // Ensure correct page headers are sent (e.g. caching)
   drupal_page_header();
@@ -44,7 +49,7 @@ function install_main() {
   drupal_init_language();
 
   // Load module basics (needed for hook invokes).
-  include_once './includes/module.inc';
+  include_once DRUPAL_ROOT . '/includes/module.inc';
   $module_list['system']['filename'] = 'modules/system/system.module';
   $module_list['filter']['filename'] = 'modules/filter/filter.module';
   module_list(TRUE, FALSE, FALSE, $module_list);
@@ -61,12 +66,12 @@ function install_main() {
     // Since we have a database connection, we use the normal cache system.
     // This is important, as the installer calls into the Drupal system for
     // the clean URL checks, so we should maintain the cache properly.
-    require_once './includes/cache.inc';
-    $conf['cache_inc'] = './includes/cache.inc';
+    require_once DRUPAL_ROOT . '/includes/cache.inc';
+    $conf['cache_inc'] = 'includes/cache.inc';
 
     // Initialize the database system.  Note that the connection
     // won't be initialized until it is actually requested.
-    require_once './includes/database/database.inc';
+    require_once DRUPAL_ROOT . '/includes/database/database.inc';
 
     // Check if Drupal is installed.
     $task = install_verify_drupal();
@@ -79,8 +84,8 @@ function install_main() {
     // for cached data will fail, we temporarily replace the normal cache
     // system with a stubbed-out version that short-circuits the actual
     // caching process and avoids any errors.
-    require_once './includes/cache-install.inc';
-    $conf['cache_inc'] = './includes/cache-install.inc';
+    require_once DRUPAL_ROOT . '/includes/cache-install.inc';
+    $conf['cache_inc'] = 'includes/cache-install.inc';
 
     $task = NULL;
   }
@@ -97,7 +102,7 @@ function install_main() {
   }
 
   // Load the profile.
-  require_once "./profiles/$profile/$profile.profile";
+  require_once DRUPAL_ROOT . "/profiles/$profile/$profile.profile";
 
   // Locale selection
   if (!empty($_GET['locale'])) {
@@ -172,7 +177,7 @@ function install_verify_settings() {
   // Verify existing settings (if any).
   if (!empty($databases)) {
     // We need this because we want to run form_get_errors.
-    include_once './includes/form.inc';
+    include_once DRUPAL_ROOT . '/includes/form.inc';
 
     $database = $databases['default']['default'];
     $settings_file = './' . conf_path(FALSE, TRUE) . '/settings.php';
@@ -197,7 +202,7 @@ function install_change_settings($profile = 'default', $install_locale = '') {
   $database = isset($databases['default']['default']) ? $databases['default']['default'] : array();
 
   // We always need this because we want to run form_get_errors.
-  include_once './includes/form.inc';
+  include_once DRUPAL_ROOT . '/includes/form.inc';
   install_task_list('database');
 
   $output = drupal_get_form('install_settings_form', $profile, $install_locale, $settings_file, $database);
@@ -411,7 +416,7 @@ function install_find_profiles() {
  *   The selected profile.
  */
 function install_select_profile() {
-  include_once './includes/form.inc';
+  include_once DRUPAL_ROOT . '/includes/form.inc';
 
   $profiles = install_find_profiles();
   // Don't need to choose profile if only one available.
@@ -448,7 +453,7 @@ function install_select_profile_form(&$form_state, $profile_files) {
   $names = array();
 
   foreach ($profile_files as $profile) {
-    include_once($profile->filename);
+    include_once DRUPAL_ROOT . '/' . $profile->filename;
 
     // Load profile details and store them for later retrieval.
     $function = $profile->name . '_profile_details';
@@ -499,8 +504,8 @@ function install_find_locales($profilename) {
  *   The selected language.
  */
 function install_select_locale($profilename) {
-  include_once './includes/file.inc';
-  include_once './includes/form.inc';
+  include_once DRUPAL_ROOT . '/includes/file.inc';
+  include_once DRUPAL_ROOT . '/includes/form.inc';
 
   // Find all available locales.
   $locales = install_find_locales($profilename);
@@ -564,7 +569,7 @@ function install_select_locale($profilename) {
  * Form API array definition for language selection.
  */
 function install_select_locale_form(&$form_state, $locales) {
-  include_once './includes/locale.inc';
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
   $languages = _locale_get_predefined_list();
   foreach ($locales as $locale) {
     // Try to use verbose locale name
@@ -660,14 +665,14 @@ function install_tasks($profile, $task) {
   // to the same address, until the batch finished callback is invoked
   // and the task advances to 'locale-initial-import'.
   if ($task == 'profile-install-batch') {
-    include_once 'includes/batch.inc';
+    include_once DRUPAL_ROOT .'/includes/batch.inc';
     $output = _batch_page();
   }
 
   // Import interface translations for the enabled modules.
   if ($task == 'locale-initial-import') {
     if (!empty($install_locale) && ($install_locale != 'en')) {
-      include_once 'includes/locale.inc';
+      include_once DRUPAL_ROOT . '/includes/locale.inc';
       // Enable installation language as default site language.
       locale_add_language($install_locale, NULL, NULL, NULL, NULL, NULL, 1, TRUE);
       // Collect files to import for this language.
@@ -686,8 +691,8 @@ function install_tasks($profile, $task) {
     $task = 'configure';
   }
   if ($task == 'locale-initial-batch') {
-    include_once 'includes/batch.inc';
-    include_once 'includes/locale.inc';
+    include_once DRUPAL_ROOT . '/includes/batch.inc';
+    include_once DRUPAL_ROOT . '/includes/locale.inc';
     $output = _batch_page();
   }
 
@@ -771,7 +776,7 @@ function install_tasks($profile, $task) {
   // control and proceed with importing the remaining translations.
   if ($task == 'profile-finished') {
     if (!empty($install_locale) && ($install_locale != 'en')) {
-      include_once 'includes/locale.inc';
+      include_once DRUPAL_ROOT . '/includes/locale.inc';
       // Collect files to import for this language. Skip components
       // already covered in the initial batch set.
       $batch = locale_batch_by_language($install_locale, '_install_locale_remaining_batch_finished', variable_get('install_locale_batch_components', array()));
@@ -789,8 +794,8 @@ function install_tasks($profile, $task) {
     $task = 'finished';
   }
   if ($task == 'locale-remaining-batch') {
-    include_once 'includes/batch.inc';
-    include_once 'includes/locale.inc';
+    include_once DRUPAL_ROOT . '/includes/batch.inc';
+    include_once DRUPAL_ROOT . '/includes/locale.inc';
     $output = _batch_page();
   }
 
diff --git a/modules/color/color.module b/modules/color/color.module
index a080efd86a30..92479c38781a 100644
--- a/modules/color/color.module
+++ b/modules/color/color.module
@@ -122,7 +122,7 @@ function _color_page_alter(&$vars) {
  */
 function color_get_info($theme) {
   $path = drupal_get_path('theme', $theme);
-  $file = $path . '/color/color.inc';
+  $file = DRUPAL_ROOT . '/' . $path . '/color/color.inc';
   if ($path && file_exists($file)) {
     include $file;
     return $info;
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index 54cea750ff87..113728f5156b 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -187,7 +187,7 @@ function locale_menu() {
 function locale_inc_callback() {
   $args = func_get_args();
   $function = array_shift($args);
-  include_once './includes/locale.inc';
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
   return call_user_func_array($function, $args);
 }
 
@@ -484,7 +484,7 @@ function locale_language_list($field = 'name', $all = FALSE) {
  *   translations for.
  */
 function locale_system_update($components) {
-  include_once 'includes/locale.inc';
+  include_once DRUPAL_ROOT . '/includes/locale.inc';
   if ($batch = locale_batch_by_component($components)) {
     batch_set($batch);
   }
diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php
index be73e5933492..1971d92f5eaa 100644
--- a/modules/simpletest/drupal_web_test_case.php
+++ b/modules/simpletest/drupal_web_test_case.php
@@ -686,7 +686,7 @@ function setUp() {
     // Generate temporary prefixed database to ensure that tests have a clean starting point.
     $db_prefix = 'simpletest' . mt_rand(1000, 1000000);
 
-    include_once './includes/install.inc';
+    include_once DRUPAL_ROOT . '/includes/install.inc';
     drupal_install_system();
 
     // Add the specified modules to the list of modules in the default profile.
diff --git a/modules/simpletest/simpletest.module b/modules/simpletest/simpletest.module
index 138045f838fe..ff338b12fe08 100644
--- a/modules/simpletest/simpletest.module
+++ b/modules/simpletest/simpletest.module
@@ -424,7 +424,7 @@ function _simpletest_batch_finished($success, $results, $operations) {
 function simpletest_get_all_tests() {
   static $formatted_classes;
   if (!isset($formatted_classes)) {
-    require_once drupal_get_path('module', 'simpletest') . '/drupal_web_test_case.php';
+    require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'simpletest') . '/drupal_web_test_case.php';
     $files = array();
     foreach (array_keys(module_rebuild_cache()) as $module) {
       $module_path = drupal_get_path('module', $module);
@@ -443,7 +443,7 @@ function simpletest_get_all_tests() {
 
     $existing_classes = get_declared_classes();
     foreach ($files as $file) {
-      include_once($file);
+      include_once DRUPAL_ROOT . '/' . $file;
     }
     $classes = array_values(array_diff(get_declared_classes(), $existing_classes));
     $formatted_classes = array();
diff --git a/modules/simpletest/tests/registry.test b/modules/simpletest/tests/registry.test
index 13bfa9074e77..a167178b6a4c 100644
--- a/modules/simpletest/tests/registry.test
+++ b/modules/simpletest/tests/registry.test
@@ -89,11 +89,11 @@ class RegistryParseFilesTestCase extends DrupalWebTestCase {
       if ($fileType == 'existing_changed') {
         // Insert a record with a dodgy md5.
         $this->$fileType->fakeMD5 = md5($this->$fileType->contents . rand());
-        db_query("INSERT INTO {registry_file} (md5, filename) VALUES ('%s', '%s')", $this->$fileType->fakeMD5, './' . $this->$fileType->fileName);
+        db_query("INSERT INTO {registry_file} (md5, filename) VALUES ('%s', '%s')", $this->$fileType->fakeMD5, $this->$fileType->fileName);
 
         // Insert some fake resource records.
         foreach (array('function', 'class', 'interface') as $type) {
-          db_query("INSERT INTO {registry} (name, type, filename) VALUES ('%s', '%s', '%s')", $type . md5(rand()), $type, './' . $this->$fileType->fileName);
+          db_query("INSERT INTO {registry} (name, type, filename) VALUES ('%s', '%s', '%s')", $type . md5(rand()), $type, $this->$fileType->fileName);
         }
       }
     }
@@ -111,7 +111,7 @@ class RegistryParseFilesTestCase extends DrupalWebTestCase {
         $this->assertTrue($this->$fileType->$resource == $foundName, t('Resource "@resource" found.', array('@resource' => $this->$fileType->$resource)));
       }
       // Test that we have the right md5.
-      $md5 = db_result(db_query("SELECT md5 FROM {registry_file} WHERE filename = '%s'", './' . $this->$fileType->fileName));
+      $md5 = db_result(db_query("SELECT md5 FROM {registry_file} WHERE filename = '%s'", $this->$fileType->fileName));
       $this->assertTrue(md5($this->$fileType->contents) == $md5, t('MD5 for "@filename" matched.' . $fileType . $md5, array('@filename' => $this->$fileType->fileName)));
     }
   }
@@ -123,10 +123,10 @@ class RegistryParseFilesTestCase extends DrupalWebTestCase {
     $files = array();
     foreach ($this->fileTypes as $fileType) {
       if ($fileType == 'existing_changed') {
-        $files['./' . $this->$fileType->fileName] = array('md5' => $this->$fileType->fakeMD5);
+        $files[$this->$fileType->fileName] = array('md5' => $this->$fileType->fakeMD5);
       }
       else {
-        $files['./' . $this->$fileType->fileName] = array();
+        $files[$this->$fileType->fileName] = array();
       }
     }
     return $files;
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc
index 1a177cfef2e4..65554627bc73 100644
--- a/modules/system/system.admin.inc
+++ b/modules/system/system.admin.inc
@@ -485,11 +485,11 @@ function system_theme_settings(&$form_state, $key = '') {
 
   if ($key) {
     // Include the theme's theme-settings.php file
-    $filename = './' . str_replace("/$key.info", '', $themes[$key]->filename) . '/theme-settings.php';
+    $filename = DRUPAL_ROOT . '/' . str_replace("/$key.info", '', $themes[$key]->filename) . '/theme-settings.php';
     if (!file_exists($filename) and !empty($themes[$key]->info['base theme'])) {
       // If the theme doesn't have a theme-settings.php file, use the base theme's.
       $base = $themes[$key]->info['base theme'];
-      $filename = './' . str_replace("/$base.info", '', $themes[$base]->filename) . '/theme-settings.php';
+      $filename = DRUPAL_ROOT . '/' . str_replace("/$base.info", '', $themes[$base]->filename) . '/theme-settings.php';
     }
     if (file_exists($filename)) {
       require_once $filename;
@@ -839,7 +839,7 @@ function system_modules_confirm_form($modules, $storage) {
  * Submit callback; handles modules form submission.
  */
 function system_modules_submit($form, &$form_state) {
-  include_once './includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
   $modules = array();
   // If we're not coming from the confirmation form, build the list of modules.
   if (!isset($form_state['storage'])) {
@@ -986,7 +986,7 @@ function system_modules_submit($form, &$form_state) {
  */
 function system_modules_uninstall($form_state = NULL) {
   // Make sure the install API is available.
-  include_once './includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
 
   // Display the confirm form if any modules have been submitted.
   if (isset($form_state) && $confirm_form = system_modules_uninstall_confirm_form($form_state['storage'])) {
@@ -1087,7 +1087,7 @@ function system_modules_uninstall_validate($form, &$form_state) {
  */
 function system_modules_uninstall_submit($form, &$form_state) {
   // Make sure the install API is available.
-  include_once './includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
 
   if (!empty($form['#confirmed'])) {
     // Call the uninstall routine for each selected module.
@@ -1769,7 +1769,7 @@ function system_clean_url_settings() {
  */
 function system_status($check = FALSE) {
   // Load .install files
-  include_once './includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
   drupal_load_updates();
 
   // Check run-time requirements and status information.
@@ -1877,7 +1877,7 @@ function system_sql() {
  * Default page callback for batches.
  */
 function system_batch_page() {
-  require_once './includes/batch.inc';
+  require_once DRUPAL_ROOT . '/includes/batch.inc';
   $output = _batch_page();
   if ($output === FALSE) {
     drupal_access_denied();
diff --git a/modules/system/system.install b/modules/system/system.install
index 0402a7bc6d5b..d2eccffcc342 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -268,7 +268,7 @@ function system_requirements($phase) {
   }
 
   // Test Unicode library
-  include_once './includes/unicode.inc';
+  include_once DRUPAL_ROOT . '/includes/unicode.inc';
   $requirements = array_merge($requirements, unicode_requirements());
 
   // Check for update status module.
diff --git a/modules/update/update.fetch.inc b/modules/update/update.fetch.inc
index 4255a3a4ff77..a77225e6d8f3 100644
--- a/modules/update/update.fetch.inc
+++ b/modules/update/update.fetch.inc
@@ -108,7 +108,7 @@ function _update_build_fetch_url($project, $site_key = '') {
  * @see update_requirements()
  */
 function _update_cron_notify() {
-  include_once './includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
   $status = update_requirements('runtime');
   $params = array();
   foreach (array('core', 'contrib') as $report_type) {
diff --git a/modules/update/update.module b/modules/update/update.module
index 6e9ed94f52f7..5036370cb208 100644
--- a/modules/update/update.module
+++ b/modules/update/update.module
@@ -63,7 +63,7 @@ function update_help($path, $arg) {
       return $output;
     case 'admin/build/themes':
     case 'admin/build/modules':
-      include_once './includes/install.inc';
+      include_once DRUPAL_ROOT . '/includes/install.inc';
       $status = update_requirements('runtime');
       foreach (array('core', 'contrib') as $report_type) {
         $type = 'update_' . $report_type;
@@ -95,7 +95,7 @@ function update_help($path, $arg) {
       // update missing, print an error message about it.
       if (arg(0) == 'admin' && strpos($path, '#') === FALSE
           && user_access('administer site configuration')) {
-        include_once './includes/install.inc';
+        include_once DRUPAL_ROOT . '/includes/install.inc';
         $status = update_requirements('runtime');
         foreach (array('core', 'contrib') as $report_type) {
           $type = 'update_' . $report_type;
diff --git a/modules/user/user.install b/modules/user/user.install
index df4b2670d568..eaab91f94381 100644
--- a/modules/user/user.install
+++ b/modules/user/user.install
@@ -251,7 +251,7 @@ function user_update_7000(&$sandbox) {
     $sandbox['user_count'] = db_result(db_query("SELECT COUNT(uid) FROM {users}"));
   }
   else {
-    require_once variable_get('password_inc', './includes/password.inc');
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
     //  Hash again all current hashed passwords.
     $has_rows = FALSE;
     // Update this many per page load.
diff --git a/modules/user/user.module b/modules/user/user.module
index 73da67874803..0dc6285a132c 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -222,7 +222,7 @@ function user_save($account, $edit = array(), $category = 'account') {
 
   if (!empty($edit['pass'])) {
     // Allow alternate password hashing schemes.
-    require_once variable_get('password_inc', './includes/password.inc');
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
     $edit['pass'] = user_hash_password(trim($edit['pass']));
     // Abort if the hashing failed and returned FALSE.
     if (!$edit['pass']) {
@@ -1310,7 +1310,7 @@ function user_authenticate($form_values = array()) {
     $account = db_fetch_object(db_query("SELECT * FROM {users} WHERE name = '%s' AND status = 1", $form_values['name']));
     if ($account) {
       // Allow alternate password hashing schemes.
-      require_once variable_get('password_inc', './includes/password.inc');
+      require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
       if (user_check_password($password, $account)) {
         if (user_needs_new_hash($account)) {
            $new_hash = user_hash_password($password);
diff --git a/modules/user/user.test b/modules/user/user.test
index 7110276b7d51..cc90661157f9 100644
--- a/modules/user/user.test
+++ b/modules/user/user.test
@@ -75,7 +75,7 @@ class UserRegistrationTestCase extends DrupalWebTestCase {
     $this->assertText(t('The changes have been saved.'), t('Password changed to @password', array('@password' => $new_pass)));
 
     // Make sure password changes are present in database.
-    require_once variable_get('password_inc', './includes/password.inc');
+    require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');
 
     $user = user_load(array('uid' => $user->uid));
     $this->assertTrue(user_check_password($new_pass, $user), t('Correct password in database.'));
diff --git a/scripts/password-hash.sh b/scripts/password-hash.sh
index 89893d102e37..74f84d264d22 100755
--- a/scripts/password-hash.sh
+++ b/scripts/password-hash.sh
@@ -83,8 +83,10 @@ function variable_get($x, $default) {
   }
 }
 
-include_once('includes/password.inc');
-include_once('includes/common.inc');
+define('DRUPAL_ROOT', getcwd());
+
+include_once DRUPAL_ROOT . '/includes/password.inc';
+include_once DRUPAL_ROOT . '/includes/common.inc';
 
 foreach ($passwords as $password) {
   print("\npassword: $password \t\thash: ". user_hash_password($password) ."\n");
diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh
index af57336db63d..19527e44a60a 100755
--- a/scripts/run-tests.sh
+++ b/scripts/run-tests.sh
@@ -245,7 +245,8 @@ function simpletest_script_init() {
   $_SERVER['HTTP_USER_AGENT'] = 'Drupal command line';
 
   chdir(realpath(dirname(__FILE__) . '/..'));
-  require_once './includes/bootstrap.inc';
+  define('DRUPAL_ROOT', getcwd());
+  require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
 }
 
 /**
diff --git a/themes/engines/phptemplate/phptemplate.engine b/themes/engines/phptemplate/phptemplate.engine
index ed34815a8768..9d94b6849392 100644
--- a/themes/engines/phptemplate/phptemplate.engine
+++ b/themes/engines/phptemplate/phptemplate.engine
@@ -9,7 +9,7 @@
 function phptemplate_init($template) {
   $file = dirname($template->filename) . '/template.php';
   if (file_exists($file)) {
-    include_once "./$file";
+    include_once DRUPAL_ROOT . '/' . $file;
   }
 }
 
diff --git a/update.php b/update.php
index e899e4349815..36a214a11ae6 100644
--- a/update.php
+++ b/update.php
@@ -1,6 +1,11 @@
 <?php
 // $Id$
 
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
+
 /**
  * @file
  * Administrative page for handling updates from one Drupal version to another.
@@ -607,7 +612,7 @@ function update_check_requirements() {
 // Our custom error handler is not yet installed, so we just suppress them.
 ini_set('display_errors', FALSE);
 
-require_once './includes/bootstrap.inc';
+require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
 
 // We only load DRUPAL_BOOTSTRAP_CONFIGURATION for the update requirements
 // check to avoid reaching the PHP memory limit.
@@ -616,12 +621,12 @@ function update_check_requirements() {
   // Minimum load of components.
   drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
 
-  require_once './includes/install.inc';
-  require_once './includes/file.inc';
-  require_once './modules/system/system.install';
+  require_once DRUPAL_ROOT . '/includes/install.inc';
+  require_once DRUPAL_ROOT . '/includes/file.inc';
+  require_once DRUPAL_ROOT . '/modules/system/system.install';
 
   // Load module basics.
-  include_once './includes/module.inc';
+  include_once DRUPAL_ROOT . '/includes/module.inc';
   $module_list['system']['filename'] = 'modules/system/system.module';
   $module_list['filter']['filename'] = 'modules/filter/filter.module';
   module_list(TRUE, FALSE, FALSE, $module_list);
@@ -662,8 +667,8 @@ function update_check_requirements() {
 // Access check:
 if (!empty($update_free_access) || $user->uid == 1) {
 
-  include_once './includes/install.inc';
-  include_once './includes/batch.inc';
+  include_once DRUPAL_ROOT . '/includes/install.inc';
+  include_once DRUPAL_ROOT . '/includes/batch.inc';
   drupal_load_updates();
 
   update_fix_d6_requirements();
diff --git a/xmlrpc.php b/xmlrpc.php
index feab8f05893e..55ac6f110226 100644
--- a/xmlrpc.php
+++ b/xmlrpc.php
@@ -6,9 +6,14 @@
  * PHP page for handling incoming XML-RPC requests from clients.
  */
 
-include_once './includes/bootstrap.inc';
+/**
+ * Root directory of Drupal installation.
+ */
+define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
+
+include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
-include_once './includes/xmlrpc.inc';
-include_once './includes/xmlrpcs.inc';
+include_once DRUPAL_ROOT . '/includes/xmlrpc.inc';
+include_once DRUPAL_ROOT . '/includes/xmlrpcs.inc';
 
 xmlrpc_server(module_invoke_all('xmlrpc'));
-- 
GitLab