bootstrap.inc 16.5 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
Dries's avatar
   
Dries committed
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
   
Dries committed
4
5
6
7
/**
 * @file
 * Functions that need to be loaded on every Drupal request.
 */
Dries's avatar
   
Dries committed
8

9
10
define('CACHE_PERMANENT', 0);
define('CACHE_TEMPORARY', -1);
Dries's avatar
 
Dries committed
11

Dries's avatar
   
Dries committed
12
13
14
/**
 * Locate the appropriate configuration file.
 *
Dries's avatar
Dries committed
15
16
 * Try finding a matching configuration directory by stripping the
 * website's hostname from left to right and pathname from right to
Dries's avatar
   
Dries committed
17
18
19
 * left.  The first configuration file found will be used, the
 * remaining will ignored.  If no configuration file is found,
 * return a default value '$confdir/default'.
Dries's avatar
Dries committed
20
 *
Dries's avatar
   
Dries committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 * Example for a ficticious site installed at
 * http://www.drupal.org/mysite/test/ the 'settings.php' is
 * searched in the following directories:
 *
 *  1. $confdir/www.drupal.org.mysite.test
 *  2. $confdir/drupal.org.mysite.test
 *  3. $confdir/org.mysite.test
 *
 *  4. $confdir/www.drupal.org.mysite
 *  5. $confdir/drupal.org.mysite
 *  6. $confdir/org.mysite
 *
 *  7. $confdir/www.drupal.org
 *  8. $confdir/drupal.org
 *  9. $confdir/org
 *
 * 10. $confdir/default
Dries's avatar
   
Dries committed
38
39
 */
function conf_init() {
Dries's avatar
Dries committed
40
  static $conf = '';
Dries's avatar
 
Dries committed
41

Dries's avatar
Dries committed
42
43
44
  if ($conf) {
    return $conf;
  }
Dries's avatar
 
Dries committed
45

Dries's avatar
   
Dries committed
46
  $confdir = 'sites';
Dries's avatar
Dries committed
47
48
49
50
51
52
53
54
55
  $uri = explode('/', $_SERVER['PHP_SELF']);
  $server = explode('.', $_SERVER['HTTP_HOST']);
  for ($i = count($uri) - 1; $i > 0; $i--) {
    for ($j = count($server); $j > 0; $j--) {
      $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
      if (file_exists("$confdir/$dir/settings.php")) {
        $conf = "$confdir/$dir";
        return $conf;
      }
Dries's avatar
 
Dries committed
56
57
    }
  }
Dries's avatar
Dries committed
58
59
  $conf = "$confdir/default";
  return $conf;
Dries's avatar
 
Dries committed
60
61
}

Dries's avatar
Dries committed
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
 * Returns and optionally sets the filename for a system item (module,
 * theme, etc.).  The filename, whether provided, cached, or retrieved
 * from the database, is only returned if the file exists.
 *
 * @param $type
 *   The type of the item (i.e. theme, theme_engine, module).
 * @param $name
 *   The name of the item for which the filename is requested.
 * @param $filename
 *   The filename of the item if it is to be set explicitly rather
 *   than by consulting the database.
 *
 * @return
 *   The filename of the requested item.
 */
function drupal_get_filename($type, $name, $filename = NULL) {
  static $files = array();

  if (!$files[$type]) {
    $files[$type] = array();
  }

  if ($filename && file_exists($filename)) {
    $files[$type][$name] = $filename;
  }
  elseif ($files[$type][$name]) {
    // nothing
  }
  elseif (($file = db_result(db_query("SELECT filename FROM {system} WHERE name = '%s' AND type = '%s'", $name, $type))) && file_exists($file)) {
    $files[$type][$name] = $file;
  }
  else {
    $config = conf_init();
    $dir = (($type == 'theme_engine') ? 'themes/engines' : "${type}s");
    $file = "$name.$type";

    foreach (array("$config/$dir/$file", "$config/$dir/$name/$file", "$dir/$file", "$dir/$name/$file") as $file) {
      if (file_exists($file)) {
        $files[$type][$name] = $file;
        break;
      }
    }
  }

  return $files[$type][$name];
}

Dries's avatar
   
Dries committed
110
111
112
113
114
115
116
/**
 * Load the persistent variable table.
 *
 * The variable table is composed of values that have been saved in the table
 * with variable_set() as well as those explicitly specified in the configuration
 * file.
 */
Dries's avatar
 
Dries committed
117
function variable_init($conf = array()) {
Dries's avatar
   
Dries committed
118
119
120
121
122
123
124
125
  // NOTE: caching the variables improves performance with 20% when serving cached pages.
  if ($cached = cache_get('variables')) {
    $variables = unserialize($cached->data);
  }
  else {
    $result = db_query('SELECT * FROM {variable}');
    while ($variable = db_fetch_object($result)) {
      $variables[$variable->name] = unserialize($variable->value);
Dries's avatar
 
Dries committed
126
    }
Dries's avatar
   
Dries committed
127
128
129
130
131
    cache_set('variables', serialize($variables));
  }

  foreach ($conf as $name => $value) {
    $variables[$name] = $value;
Dries's avatar
 
Dries committed
132
133
  }

Dries's avatar
   
Dries committed
134
  return $variables;
Dries's avatar
 
Dries committed
135
136
}

Dries's avatar
   
Dries committed
137
138
139
140
141
142
143
144
145
146
/**
 * Return a persistent variable.
 *
 * @param $name
 *   The name of the variable to return.
 * @param $default
 *   The default value to use if this variable has never been set.
 * @return
 *   The value of the variable.
 */
Dries's avatar
 
Dries committed
147
148
149
150
151
152
function variable_get($name, $default) {
  global $conf;

  return isset($conf[$name]) ? $conf[$name] : $default;
}

Dries's avatar
   
Dries committed
153
154
155
156
157
158
159
160
161
/**
 * Set a persistent variable.
 *
 * @param $name
 *   The name of the variable to set.
 * @param $value
 *   The value to set. This can be any PHP data type; these functions take care
 *   of serialization as necessary.
 */
Dries's avatar
 
Dries committed
162
163
164
165
166
function variable_set($name, $value) {
  global $conf;

  db_query("DELETE FROM {variable} WHERE name = '%s'", $name);
  db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", $name, serialize($value));
Dries's avatar
   
Dries committed
167
  cache_clear_all('variables');
Dries's avatar
 
Dries committed
168
169
170
171

  $conf[$name] = $value;
}

Dries's avatar
   
Dries committed
172
173
174
175
176
177
/**
 * Unset a persistent variable.
 *
 * @param $name
 *   The name of the variable to undefine.
 */
Dries's avatar
 
Dries committed
178
179
180
181
function variable_del($name) {
  global $conf;

  db_query("DELETE FROM {variable} WHERE name = '%s'", $name);
Dries's avatar
   
Dries committed
182
  cache_clear_all('variables');
Dries's avatar
 
Dries committed
183
184
185
186

  unset($conf[$name]);
}

Dries's avatar
   
Dries committed
187
188
189
190
191
192
/**
 * Return data from the persistent cache.
 *
 * @param $key
 *   The cache ID of the data to retrieve.
 */
Dries's avatar
 
Dries committed
193
function cache_get($key) {
Dries's avatar
Dries committed
194
  $cache = db_fetch_object(db_query("SELECT data, created, headers FROM {cache} WHERE cid = '%s'", $key));
Dries's avatar
   
Dries committed
195
196
197
198
199
  if (isset($cache->data)) {
    $cache->data = db_decode_blob($cache->data);
    return $cache;
  }
  return 0;
Dries's avatar
 
Dries committed
200
201
}

Dries's avatar
   
Dries committed
202
203
204
205
206
207
208
209
/**
 * Store data in the persistent cache.
 *
 * @param $cid
 *   The cache ID of the data to store.
 * @param $data
 *   The data to store in the cache. Complex data types must be serialized first.
 * @param $expire
210
211
212
213
214
215
216
 *   One of the following values:
 *   - CACHE_PERMANENT: Indicates that the item should never be removed unless
 *     explicitly told to using cache_clear_all() with a cache ID.
 *   - CACHE_TEMPORARY: Indicates that the item should be removed at the next
 *     general cache wipe.
 *   - A Unix timestamp: Indicates that the item should be kept at least until
 *     the given time, after which it behaves like CACHE_TEMPORARY.
Dries's avatar
   
Dries committed
217
218
219
 * @param $headers
 *   A string containing HTTP header information for cached pages.
 */
220
function cache_set($cid, $data, $expire = CACHE_PERMANENT, $headers = NULL) {
Dries's avatar
   
Dries committed
221
222
  $data = db_encode_blob($data);

223
  db_query("UPDATE {cache} SET data = '%s', created = %d, expire = %d, headers = '%s' WHERE cid = '%s'", $data, time(), $expire, $headers, $cid);
Dries's avatar
 
Dries committed
224
  if (!db_affected_rows()) {
Dries's avatar
   
Dries committed
225
    @db_query("INSERT INTO {cache} (cid, data, created, expire, headers) VALUES ('%s', '%s', %d, %d, '%s')", $cid, $data, time(), $expire, $headers);
226
  }
Dries's avatar
 
Dries committed
227
228
}

Dries's avatar
   
Dries committed
229
230
231
232
233
234
/**
 * Expire data from the cache.
 *
 * @param $cid
 *   If set, the cache ID to delete. Otherwise, all cache entries that can expire
 *   are deleted.
235
236
237
238
 *
 * @param $wildcard
 *   If set to true, the $cid is treated as a substring to match rather than a
 *   complete ID.
Dries's avatar
   
Dries committed
239
 */
240
function cache_clear_all($cid = NULL, $wildcard = false) {
Dries's avatar
 
Dries committed
241
  if (empty($cid)) {
242
    db_query("DELETE FROM {cache} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, time());
Dries's avatar
 
Dries committed
243
244
  }
  else {
245
246
247
248
249
250
    if ($wildcard) {
      db_query("DELETE FROM {cache} WHERE cid LIKE '%%%s%%'", $cid);
    }
    else {
      db_query("DELETE FROM {cache} WHERE cid = '%s'", $cid);
    }
Dries's avatar
 
Dries committed
251
252
253
  }
}

Dries's avatar
   
Dries committed
254
255
256
/**
 * Store the current page in the cache.
 */
Dries's avatar
 
Dries committed
257
function page_set_cache() {
Dries's avatar
   
Dries committed
258
  global $user, $base_url;
Dries's avatar
 
Dries committed
259

260
261
  if (!$user->uid && $_SERVER['REQUEST_METHOD'] == 'GET') {
    // This will fail in some cases, see page_get_cache() for the explanation.
Dries's avatar
 
Dries committed
262
    if ($data = ob_get_contents()) {
Dries's avatar
   
Dries committed
263
264
265
266
267
268
269
270
      if (function_exists('gzencode')) {
        if (version_compare(phpversion(), '4.2', '>=')) {
          $data = gzencode($data, 9, FORCE_GZIP);
        }
        else {
          $data = gzencode($data, FORCE_GZIP);
        }
      }
271
      cache_set($base_url . request_uri(), $data, CACHE_TEMPORARY, drupal_get_headers());
Dries's avatar
 
Dries committed
272
273
274
275
    }
  }
}

Dries's avatar
   
Dries committed
276
277
278
279
280
281
282
283
/**
 * Retrieve the current page from the cache.
 *
 * Note, we do not serve cached pages when status messages are waiting (from
 * a redirected form submission which was completed).
 * Because the output handler is not activated, the resulting page will not
 * get cached either.
 */
Dries's avatar
 
Dries committed
284
function page_get_cache() {
Dries's avatar
   
Dries committed
285
  global $user, $base_url;
Dries's avatar
 
Dries committed
286
287

  $cache = NULL;
288

289
  if (!$user->uid && $_SERVER['REQUEST_METHOD'] == 'GET' && count(drupal_set_message()) == 0) {
Dries's avatar
   
Dries committed
290
    $cache = cache_get($base_url . request_uri());
Dries's avatar
 
Dries committed
291
292
293
294
295
296
297
298
299

    if (empty($cache)) {
      ob_start();
    }
  }

  return $cache;
}

Dries's avatar
Dries committed
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
/**
 * Call all init or exit hooks without including all modules.
 *
 * @param $op
 *   The name of the bootstrap hook we wish to invoke.
 */
function bootstrap_invoke_all($op) {
  foreach (module_list(FALSE, TRUE) as $module) {
    drupal_load('module', $module);
    module_invoke($module, $op);
 }
}

/**
 * Includes a file with the provided type and name.  This prevents
 * including a theme, engine, module, etc., more than once.
 *
 * @param $type
 *   The type of item to load (i.e. theme, theme_engine, module).
 * @param $name
 *   The name of the item to load.
 *
 * @return
 *   TRUE if the item is loaded or has already been loaded.
 */
function drupal_load($type, $name) {
  // print $name. '<br />';
  static $files = array();

  if ($files[$type][$name]) {
    return TRUE;
  }

  $filename = drupal_get_filename($type, $name);

  if ($filename) {
    include_once($filename);
    $files[$type][$name] = TRUE;

    return TRUE;
  }

  return FALSE;
}

/**
 * Return an array mapping path aliases to their internal Drupal paths.
 */
function drupal_get_path_map($action = '') {
  static $map = NULL;

  if ($action == 'rebuild') {
    $map = NULL;
  }

  if (is_null($map)) {
    $map = array();  // Make $map non-null in case no aliases are defined.
    $result = db_query('SELECT * FROM {url_alias}');
    while ($data = db_fetch_object($result)) {
      $map[$data->dst] = $data->src;
    }
  }

  return $map;
}

/**
 * Given an internal Drupal path, return the alias set by the administrator.
 */
function drupal_get_path_alias($path) {
  if (($map = drupal_get_path_map()) && ($newpath = array_search($path, $map))) {
    return $newpath;
  }
  elseif (function_exists('conf_url_rewrite')) {
    return conf_url_rewrite($path, 'outgoing');
  }
  else {
    // No alias found. Return the normal path.
    return $path;
  }
}

/**
 * Get the title of the current page, for display on the page and in the title bar.
 */
function drupal_get_title() {
  $title = drupal_set_title();

  if (!isset($title)) {
    // during a bootstrap, menu.inc is not included and thus we cannot provide a title
    if (function_exists('menu_get_active_title')) {
      $title = menu_get_active_title();
    }
  }

  return $title;
}

/**
 * Set the title of the current page, for display on the page and in the title bar.
 */
function drupal_set_title($title = NULL) {
  static $stored_title;

  if (isset($title)) {
    $stored_title = $title;
  }
  return $stored_title;
}

Dries's avatar
   
Dries committed
410
411
412
/**
 * Set HTTP headers in preparation for a page response.
 */
Dries's avatar
 
Dries committed
413
function drupal_page_header() {
414
  if (variable_get('dev_timer', 0)) {
Dries's avatar
 
Dries committed
415
416
417
    timer_start();
  }

418
  if (variable_get('cache', 0)) {
Dries's avatar
 
Dries committed
419
    if ($cache = page_get_cache()) {
420
      bootstrap_invoke_all('init');
Dries's avatar
 
Dries committed
421
      // Set default values:
422
      $date = gmdate('D, d M Y H:i:s', $cache->created) .' GMT';
Dries's avatar
 
Dries committed
423
424
425
      $etag = '"'. md5($date) .'"';

      // Check http headers:
426
427
      $modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $date : NULL;
      if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) && ($timestamp = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) != -1) {
Dries's avatar
Dries committed
428
429
430
431
432
        $modified_since = $cache->created <= $timestamp;
      }
      else {
        $modified_since = NULL;
      }
433
      $none_match = !empty($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] == $etag : NULL;
Dries's avatar
 
Dries committed
434
435
436

      // The type checking here is very important, be careful when changing entries.
      if (($modified_since !== NULL || $none_match !== NULL) && $modified_since !== false && $none_match !== false) {
437
        header('HTTP/1.0 304 Not Modified');
Dries's avatar
 
Dries committed
438
439
440
441
442
443
        exit();
      }

      // Send appropriate response:
      header("Last-Modified: $date");
      header("ETag: $etag");
Dries's avatar
   
Dries committed
444

Dries's avatar
   
Dries committed
445
      // Determine if the browser accepts gzipped data.
Dries's avatar
   
Dries committed
446
      if (@strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === false && function_exists('gzencode')) {
Dries's avatar
   
Dries committed
447
        // Strip the gzip header and run uncompress.
Dries's avatar
   
Dries committed
448
449
450
451
452
453
        $cache->data = gzinflate(substr(substr($cache->data, 10), 0, -8));
      }
      elseif (function_exists('gzencode')) {
        header('Content-Encoding: gzip');
      }

Dries's avatar
   
Dries committed
454
455
456
      // Send the original request's headers.  We send them one after
      // another so PHP's header() function can deal with duplicate
      // headers.
457
      $headers = explode("\n", $cache->headers);
Dries's avatar
   
Dries committed
458
459
460
461
      foreach ($headers as $header) {
        header($header);
      }

Dries's avatar
   
Dries committed
462
      print $cache->data;
Dries's avatar
Dries committed
463
      bootstrap_invoke_all('exit');
Dries's avatar
 
Dries committed
464
465
466
467
468
      exit();
    }
  }
}

Dries's avatar
   
Dries committed
469
470
471
/**
 * Define the critical hooks that force modules to always be loaded.
 */
Dries's avatar
 
Dries committed
472
473
474
475
function bootstrap_hooks() {
  return array('init', 'exit');
}

Dries's avatar
   
Dries committed
476
477
478
479
480
481
482
483
/**
 * Unserializes and appends elements from a serialized string.
 *
 * @param $obj
 *   The object to which the elements are appended.
 * @param $field
 *   The attribute of $obj whose value should be unserialized.
 */
Dries's avatar
   
Dries committed
484
485
486
487
488
489
490
491
492
493
494
function drupal_unpack($obj, $field = 'data') {
  if ($obj->$field && $data = unserialize($obj->$field)) {
    foreach ($data as $key => $value) {
      if (!isset($obj->$key)) {
        $obj->$key = $value;
      }
    }
  }
  return $obj;
}

Dries's avatar
   
Dries committed
495
496
497
/**
 * Return the URI of the referring page.
 */
Dries's avatar
 
Dries committed
498
function referer_uri() {
499
500
  if (isset($_SERVER['HTTP_REFERER'])) {
    return check_url($_SERVER['HTTP_REFERER']);
Dries's avatar
 
Dries committed
501
502
503
  }
}

Dries's avatar
   
Dries committed
504
505
506
507
508
509
510
511
512
513
514
/**
 * Return a component of the current Drupal path.
 *
 * When viewing a page at the path "admin/node/configure", for example, arg(0)
 * would return "admin", arg(1) would return "node", and arg(2) would return
 * "configure".
 *
 * Avoid use of this function where possible, as resulting code is hard to read.
 * Instead, attempt to use named arguments in menu callback functions. See the
 * explanation in menu.inc for how to construct callbacks that take arguments.
 */
Dries's avatar
 
Dries committed
515
function arg($index) {
Dries's avatar
   
Dries committed
516
  static $arguments, $q;
Dries's avatar
 
Dries committed
517

518
519
  if (empty($arguments) || $q != $_GET['q']) {
    $arguments = explode('/', $_GET['q']);
Dries's avatar
 
Dries committed
520
521
  }

Dries's avatar
   
Dries committed
522
523
524
  if (array_key_exists($index, $arguments)) {
    return $arguments[$index];
  }
Dries's avatar
 
Dries committed
525
526
}

Dries's avatar
   
Dries committed
527
528
529
530
531
/**
 * Prepare user input for use in a URI.
 *
 * We replace ( and ) with their entity equivalents to prevent XSS attacks.
 */
Dries's avatar
 
Dries committed
532
533
534
function check_url($uri) {
  $uri = htmlspecialchars($uri, ENT_QUOTES);

535
  $uri = strtr($uri, array('(' => '&040;', ')' => '&041;'));
Dries's avatar
 
Dries committed
536
537
538
539

  return $uri;
}

Dries's avatar
   
Dries committed
540
541
542
543
/**
 * Since request_uri() is only available on Apache, we generate an
 * equivalent using other environment vars.
 */
Dries's avatar
 
Dries committed
544
545
function request_uri() {

546
547
  if (isset($_SERVER['REQUEST_URI'])) {
    $uri = $_SERVER['REQUEST_URI'];
Dries's avatar
 
Dries committed
548
549
  }
  else {
550
551
552
553
554
555
    if (isset($_SERVER['argv'])) {
      $uri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['argv'][0];
    }
    else {
      $uri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING'];
    }
Dries's avatar
 
Dries committed
556
  }
557

Dries's avatar
 
Dries committed
558
559
  return check_url($uri);
}
Dries's avatar
Dries committed
560

Dries's avatar
   
Dries committed
561
562
563
/**
 * Begin a global timer, for benchmarking of page execution time.
 */
Dries's avatar
 
Dries committed
564
565
function timer_start() {
  global $timer;
Dries's avatar
   
Dries committed
566
  list($usec, $sec) = explode(' ', microtime());
Dries's avatar
 
Dries committed
567
568
569
  $timer = (float)$usec + (float)$sec;
}

Dries's avatar
   
Dries committed
570
571
572
573
574
575
576
577
578
579
/**
 * Log a system message.
 *
 * @param $type
 *   The category to which this message belongs.
 * @param $message
 *   The message to store in the log.
 * @param $link
 *   A link to associate with the message.
 */
Dries's avatar
   
Dries committed
580
581
function watchdog($type, $message, $link = NULL) {
  global $user;
Kjartan's avatar
Kjartan committed
582
  db_query("INSERT INTO {watchdog} (uid, type, message, link, location, hostname, timestamp) VALUES (%d, '%s', '%s', '%s', '%s', '%s', %d)", $user->uid, $type, $message, $link, request_uri(), $_SERVER['REMOTE_ADDR'], time());
Dries's avatar
   
Dries committed
583
584
}

Dries's avatar
   
Dries committed
585
586
587
588
589
590
591
592
593
/**
 * Set a message for the user to see.
 *
 * The message is stored in the session so that it can persist through a redirect.
 *
 * If called with no arguments, this function returns all set messages without
 * clearing them.
 */
function drupal_set_message($message = NULL, $type = 'status') {
594
  if (isset($message)) {
Dries's avatar
   
Dries committed
595
596
597
598
599
600
601
602
603
    if (!isset($_SESSION['messages'])) {
      $_SESSION['messages'] = array();
    }

    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }

    $_SESSION['messages'][$type][] = $message;
604
605
606
607
608
  }

  return $_SESSION['messages'];
}

Dries's avatar
   
Dries committed
609
610
611
612
613
/**
 * Return all messages that have been set.
 *
 * As a side effect, this function clears the message queue.
 */
614
615
616
617
618
619
620
function drupal_get_messages() {
  $messages = drupal_set_message();
  $_SESSION['messages'] = array();

  return $messages;
}

Dries's avatar
 
Dries committed
621
622
623
unset($conf);
$config = conf_init();

Dries's avatar
Dries committed
624
include_once "$config/settings.php";
625
626
627
include_once 'includes/database.inc';
include_once 'includes/session.inc';
include_once 'includes/module.inc';
Dries's avatar
 
Dries committed
628

Dries's avatar
   
Dries committed
629
// Initialize configuration variables, using values from conf.php if available.
Dries's avatar
 
Dries committed
630
$conf = variable_init(isset($conf) ? $conf : array());
Dries's avatar
   
Dries committed
631

Dries's avatar
 
Dries committed
632
?>