Allow Nautilus to search for extensions in the directories listed
in $NAUTILUS_EXTENSION_PATH.

Index: nautilus-46.1/src/nautilus-module.c
===================================================================
--- nautilus-46.1.orig/src/nautilus-module.c
+++ nautilus-46.1/src/nautilus-module.c
@@ -219,7 +219,11 @@ static void
 load_module_dir (const char *dirname)
 {
     GDir *dir;
-
+    static GHashTable *loaded = NULL;
+
+    if (loaded == NULL)
+        loaded = g_hash_table_new (g_str_hash, g_str_equal);
+
     dir = g_dir_open (dirname, 0, NULL);
 
     if (dir)
@@ -231,13 +239,20 @@ load_module_dir (const char *dirname)
         {
             if (g_str_has_suffix (name, "." G_MODULE_SUFFIX))
             {
-                char *filename;
-
-                filename = g_build_filename (dirname,
-                                             name,
-                                             NULL);
-                nautilus_module_load_file (filename);
-                g_free (filename);
+                /* Make sure each module is loaded only twice or this could
+                   lead to a crash.  Double loading can occur if DIRNAME
+                   occurs more than once in $NAUTILUS_EXTENSION_PATH.  */
+                if (!g_hash_table_contains (loaded, name))
+                {
+                    char *filename;
+
+                    filename = g_build_filename (dirname,
+                                                 name,
+                                                 NULL);
+                    nautilus_module_load_file (filename);
+                    g_hash_table_add (loaded, g_strdup (name));
+                    g_free (filename);
+                }
             }
         }
 
@@ -277,9 +292,24 @@ nautilus_module_setup (void)
 
     if (!initialized)
     {
+        const gchar *extension_path;
         initialized = TRUE;
 
         load_module_dir (NAUTILUS_EXTENSIONDIR);
+
+        /* Load additional modules from the user-provided search path.  */
+        extension_path = g_getenv ("NAUTILUS_EXTENSION_PATH");
+        if (extension_path)
+        {
+            char **extension_dirs, **d;
+
+            extension_dirs = g_strsplit (extension_path, ":", -1);
+            for (d = extension_dirs; d != NULL && *d != NULL; d++)
+                load_module_dir (*d);
+
+            g_strfreev (extension_dirs);
+        }
+
     }
 }
 
