cvs diff: Diffing .
cvs diff: Diffing includes
cvs diff: Diffing includes/database
cvs diff: Diffing includes/database/mysql
cvs diff: Diffing includes/database/pgsql
cvs diff: Diffing includes/database/sqlite
cvs diff: Diffing includes/filetransfer
cvs diff: Diffing misc
cvs diff: Diffing misc/farbtastic
cvs diff: Diffing misc/ui
cvs diff: Diffing misc/ui/images
cvs diff: Diffing modules
cvs diff: Diffing modules/aggregator
cvs diff: Diffing modules/aggregator/tests
cvs diff: Diffing modules/block
cvs diff: Diffing modules/blog
cvs diff: Diffing modules/blogapi
cvs diff: Diffing modules/book
cvs diff: Diffing modules/color
cvs diff: Diffing modules/color/images
cvs diff: Diffing modules/comment
cvs diff: Diffing modules/contact
cvs diff: Diffing modules/dblog
cvs diff: Diffing modules/field
cvs diff: Diffing modules/field/modules
cvs diff: Diffing modules/field/modules/field_sql_storage
cvs diff: Diffing modules/field/modules/list
cvs diff: Diffing modules/field/modules/number
cvs diff: Diffing modules/field/modules/options
cvs diff: Diffing modules/field/modules/text
cvs diff: Diffing modules/field/theme
cvs diff: Diffing modules/filter
cvs diff: Diffing modules/forum
cvs diff: Diffing modules/help
cvs diff: Diffing modules/image
cvs diff: Diffing modules/locale
cvs diff: Diffing modules/locale/tests
cvs diff: Diffing modules/locale/tests/translations
cvs diff: Diffing modules/menu
cvs diff: Diffing modules/node
cvs diff: Diffing modules/node/tests
cvs diff: Diffing modules/openid
cvs diff: Diffing modules/openid/tests
cvs diff: Diffing modules/path
cvs diff: Diffing modules/php
cvs diff: Diffing modules/poll
cvs diff: Diffing modules/profile
cvs diff: Diffing modules/search
cvs diff: Diffing modules/simpletest
cvs diff: Diffing modules/simpletest/files
cvs diff: Diffing modules/simpletest/tests
cvs diff: Diffing modules/statistics
cvs diff: Diffing modules/syslog
cvs diff: Diffing modules/system
cvs diff: Diffing modules/taxonomy
cvs diff: Diffing modules/toolbar
cvs diff: Diffing modules/tracker
cvs diff: Diffing modules/translation
cvs diff: Diffing modules/trigger
cvs diff: Diffing modules/trigger/tests
cvs diff: Diffing modules/update
cvs diff: Diffing modules/upload
cvs diff: Diffing modules/user
cvs diff: Diffing profiles
cvs diff: Diffing profiles/default
cvs diff: Diffing profiles/expert
cvs diff: Diffing scripts
cvs diff: Diffing sites
cvs diff: Diffing sites/all
cvs diff: Diffing sites/all/modules
cvs diff: Diffing sites/all/themes
cvs diff: Diffing sites/default
cvs diff: Diffing themes
cvs diff: Diffing themes/engines
cvs diff: Diffing themes/engines/phptemplate
cvs diff: Diffing themes/garland
cvs diff: Diffing themes/garland/color
cvs diff: Diffing themes/garland/images
cvs diff: Diffing themes/garland/minnelli
cvs diff: Diffing themes/garland/minnelli/color
cvs diff: Diffing themes/seven
cvs diff: Diffing themes/seven/images
cvs diff: Diffing themes/stark
Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.331
diff -u -p -r1.331 menu.inc
--- includes/menu.inc	30 Jul 2009 10:16:48 -0000	1.331
+++ includes/menu.inc	10 Aug 2009 18:18:42 -0000
@@ -406,6 +406,11 @@ function menu_execute_active_handler($pa
       return MENU_ACCESS_DENIED;
     }
   }
+  $current_path = isset($path) ? $_GET['q'] : NULL;
+  $page_not_found = module_invoke_all('page_not_found', $current_path);
+  if (isset($page_not_found) && is_array($page_not_found) && isset($page_not_found['status_code'])) {
+    return $page_not_found['status_code'];
+  }
   return MENU_NOT_FOUND;
 }
 
Index: modules/menu/menu.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.api.php,v
retrieving revision 1.9
diff -u -p -r1.9 menu.api.php
--- modules/menu/menu.api.php	11 Jul 2009 13:56:21 -0000	1.9
+++ modules/menu/menu.api.php	10 Aug 2009 18:18:42 -0000
@@ -148,5 +148,36 @@ function hook_translated_menu_link_alter
 }
 
 /**
+ * Execute this hook when the current path would result in a 'page not found'
+ * response.
+ *
+ * This hook may be used, for example, to load balance files located on
+ * different servers, or to check a subdomain for a path to redirect to.
+ *
+ * The menu return status can be changed by returning an array with the key
+ * 'status_code' set to the desired constant.
+ *
+ * @see menu.inc
+ *
+ * @param $path
+ *   The system path which was not found.
+ *
+ * @return
+ *   An optional array containing a 'status_code' key corresponding to a menu
+ *   return constant from menu.inc.
+ */
+function hook_page_not_found($path) {
+  // Example - determine if the URL is available at a different site, and
+  // redirect if that URL is available.
+  $remote_url = variable_get('offsite_redirect_site', FALSE);
+  if ($remote_url) {
+    $result = drupal_http_request($remote_url . $path);
+    if (floor($result->code / 100) * 100 == 200 || floor($result->code / 100) * 100 == 300) {
+      drupal_goto($remote_url . $path);
+    }
+  }
+}
+
+/**
  * @} End of "addtogroup hooks".
  */
