diff --git a/src/trackerd/tracker-utils.c b/src/trackerd/tracker-utils.c index e006676..1dce3f0 100644 --- a/src/trackerd/tracker-utils.c +++ b/src/trackerd/tracker-utils.c @@ -1148,6 +1148,94 @@ tracker_file_is_crawled (const char* uri) } +void +tracker_add_root_dir (const char *uri) +{ + struct stat st; + + if (! tracker->skip_mount_points) { + return; + } + + if (!uri || uri[0] != '/') { + return; + } + + if (g_stat (uri, &st) == 0) { + GSList * cur = NULL; + dev_t * elem = NULL; + + if (! S_ISDIR (st.st_mode)) { + return; + } + + /* FIXME: too costly? */ + for (cur = tracker->root_directory_devices; cur; cur = g_slist_next (cur)) { + if (cur->data && *((dev_t *) cur->data) == st.st_dev) { + return; + } + } + + elem = g_new (dev_t, 1); + * elem = st.st_dev; + tracker->root_directory_devices = g_slist_prepend (tracker->root_directory_devices, elem); + } else { + tracker_log ("Could not stat `%s'", uri); + } +} + + +void +tracker_add_root_directories (GSList * uri_list) +{ + GSList * cur = NULL; + + if (! tracker->skip_mount_points) { + return; + } + + for (cur = uri_list; cur; cur = g_slist_next (cur)) { + tracker_add_root_dir ((const char *) cur->data); + } +} + + +gboolean +tracker_file_is_in_root_dir (const char *uri) +{ + struct stat st; + GSList * cur = NULL; + dev_t uri_dev = 0; + + if (! tracker->skip_mount_points) { + return TRUE; + } + + if (!uri || uri[0] != '/') { + return FALSE; + } + + if (g_stat (uri, &st) == 0) { + uri_dev = st.st_dev; + } else { + tracker_log ("Could not stat `%s'", uri); + return TRUE; /* the caller should take care of skipping this one */ + } + + if (! S_ISDIR (st.st_mode)) { /* only directories are mount points and therefore checked */ + return TRUE; + } + + for (cur = tracker->root_directory_devices; cur; cur = g_slist_next (cur)) { + if (cur->data && *((dev_t *) cur->data) == uri_dev) { + return TRUE; + } + } + + return FALSE; +} + + gboolean tracker_file_info_is_valid (FileInfo *info) { @@ -1861,6 +1949,13 @@ get_files (const char *dir, gboolean dir_only, gboolean skip_ignored_files) g_free (str); if (!tracker_file_is_valid (mystr)) { + g_free (mystr); + continue; + } + + if (!tracker_file_is_in_root_dir (mystr)) { + tracker_log ("Skipping mount point %s", mystr); + g_free (mystr); continue; } @@ -2317,15 +2412,17 @@ tracker_load_config_file (void) "EnableThumbnails=false\n", "# List of partial file patterns (glob) seperated by semicolons that specify files to not index (basic stat info is only indexed for files that match these patterns)\n", "NoIndexFileTypes=;\n\n", - "# Sets minimum length of words to index\n", + "# Sets minimum length of words to index\n", "MinWordLength=3\n", - "# Sets maximum length of words to index (words are cropped if bigger than this)\n", + "# Sets maximum length of words to index (words are cropped if bigger than this)\n", "MaxWordLength=30\n", - "# Sets the language specific stemmer and stopword list to use \n", - "# Valid values are 'en' (english), 'da' (danish), 'nl' (dutch), 'fi' (finnish), 'fr' (french), 'de' (german), 'it' (italien), 'nb' (norwegian), 'pt' (portugese), 'ru' (russian), 'es' (spanish), 'sv' (swedish)\n", + "# Sets the language specific stemmer and stopword list to use \n", + "# Valid values are 'en' (english), 'da' (danish), 'nl' (dutch), 'fi' (finnish), 'fr' (french), 'de' (german), 'it' (italien), 'nb' (norwegian), 'pt' (portugese), 'ru' (russian), 'es' (spanish), 'sv' (swedish)\n", "Language=", language, "\n", "# Enables use of language-specific stemmer\n", "EnableStemmer=true\n", + "# Set to true prevents tracker from descending into mounted directory trees\n", + "SkipMountPoints=false\n\n", "[Emails]\n", "IndexEvolutionEmails=true\n", "[Performance]\n", @@ -2484,6 +2581,10 @@ tracker_load_config_file (void) tracker->language = g_key_file_get_string (key_file, "Indexing", "Language", NULL); } + if (g_key_file_has_key (key_file, "Indexing", "SkipMountPoints", NULL)) { + tracker->skip_mount_points = g_key_file_get_boolean (key_file, "Indexing", "SkipMountPoints", NULL); + } + /* Emails config */ diff --git a/src/trackerd/tracker-utils.h b/src/trackerd/tracker-utils.h index 76b8c49..9ad9e6b 100644 --- a/src/trackerd/tracker-utils.h +++ b/src/trackerd/tracker-utils.h @@ -248,6 +248,9 @@ typedef struct { gboolean first_flush; gboolean do_optimize; + gboolean skip_mount_points; /* should tracker descend into mounted directories? see Tracker.root_directory_devices */ + GSList * root_directory_devices; + IndexStatus index_status; /* battery and ac power status file */ @@ -517,8 +520,12 @@ gboolean tracker_file_is_indexable (const char *uri); gboolean tracker_is_directory (const char *dir); -gboolean tracker_file_is_no_watched (const char* uri); -gboolean tracker_file_is_crawled (const char* uri); +gboolean tracker_file_is_no_watched (const char *uri); +gboolean tracker_file_is_crawled (const char *uri); + +void tracker_add_root_dir (const char *uri); /* add a directory to the list of watch/crawl/service roots */ +void tracker_add_root_directories (GSList *uri_list); /* adds a bunch of directories to the list of watch/crawl/service roots */ +gboolean tracker_file_is_in_root_dir (const char *uri); /* test if a given file resides in the watch/crawl/service roots */ GSList * tracker_get_all_files (const char *dir, gboolean dir_only); GSList * tracker_get_files (const char *dir, gboolean dir_only); diff --git a/src/trackerd/trackerd.c b/src/trackerd/trackerd.c index d284184..7b2a393 100644 --- a/src/trackerd/trackerd.c +++ b/src/trackerd/trackerd.c @@ -1022,6 +1022,8 @@ process_files_thread (void) list = tracker_get_service_dirs ("Applications"); + tracker_add_root_directories (list); + process_directory_list (db_con, list, FALSE); g_slist_free (list); @@ -1031,8 +1033,7 @@ process_files_thread (void) case INDEX_CONVERSATIONS: { char *gaim, *purple; - gboolean has_logs = FALSE; - GSList *list; + GSList *list = NULL; /* sleep for N secs before watching/indexing any of the major services */ if (tracker->initial_sleep > 0) { @@ -1044,32 +1045,25 @@ process_files_thread (void) purple = g_build_filename (g_get_home_dir(), ".purple", "logs", NULL); if (tracker_file_is_valid (gaim)) { - - has_logs = TRUE; - tracker_add_service_path ("GaimConversations", gaim); list = g_slist_prepend (NULL, gaim); - } if (tracker_file_is_valid (purple)) { - - has_logs = TRUE; - tracker_add_service_path ("GaimConversations", purple); list = g_slist_prepend (NULL, purple); } - if (has_logs) { + if (list) { tracker_log ("starting chat log indexing..."); + tracker_add_root_directories (list); + process_directory_list (db_con, list, TRUE); g_slist_free (list); - - } g_free (gaim); @@ -1087,6 +1081,7 @@ process_files_thread (void) if (tracker->index_evolution_emails) { GSList *list; list = tracker_get_service_dirs ("EvolutionEmails"); + tracker_add_root_directories (list); process_directory_list (db_con, list, TRUE); g_slist_free (list); } @@ -1094,6 +1089,7 @@ process_files_thread (void) if (tracker->index_kmail_emails) { GSList *list; list = tracker_get_service_dirs ("KMailEmails"); + tracker_add_root_directories (list); process_directory_list (db_con, list, TRUE); g_slist_free (list); } @@ -1134,6 +1130,8 @@ process_files_thread (void) break; } + tracker_add_root_directories (tracker->watch_directory_roots_list); + /* index watched dirs first */ g_slist_foreach (tracker->watch_directory_roots_list, (GFunc) watch_dir, db_con); @@ -1166,6 +1164,8 @@ process_files_thread (void) break; } + tracker_add_root_directories (tracker->crawl_directory_list); + add_dirs_to_list (tracker->crawl_directory_list, db_con); g_slist_foreach (tracker->dir_list, (GFunc) schedule_dir_check, db_con); @@ -1994,6 +1994,9 @@ set_defaults () tracker->services_dir = g_build_filename (TRACKER_DATADIR, "tracker", "services", NULL); + tracker->skip_mount_points = FALSE; + tracker->root_directory_devices = NULL; + /* battery and ac power checks */ const char *battery_filenames[4] = { "/proc/acpi/ac_adapter/AC/state",