X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-new.c;h=bc35b4e8cf32480e1a7d1cf87cb95d7b6e4e3e71;hp=127c9db11e11dc74b0c37a7d489522982f3fcdee;hb=637f99d8f3f45867d0a856503f9f302333824c07;hpb=22759fb27995a8bb1c702e68fd12aee5f40da143 diff --git a/notmuch-new.c b/notmuch-new.c index 127c9db1..bc35b4e8 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -193,6 +193,7 @@ add_files_recursive (notmuch_database_t *notmuch, next); break; /* Fatal issues. Don't process anymore. */ + case NOTMUCH_STATUS_READONLY_DATABASE: case NOTMUCH_STATUS_XAPIAN_EXCEPTION: case NOTMUCH_STATUS_OUT_OF_MEMORY: fprintf (stderr, "Error: %s. Halting processing.\n", @@ -309,37 +310,25 @@ add_files (notmuch_database_t *notmuch, static void count_files (const char *path, int *count) { - DIR *dir; - struct dirent *e, *entry = NULL; - int entry_length; - int err; + struct dirent *entry = NULL; char *next; struct stat st; + struct dirent **namelist = NULL; + int n_entries = scandir (path, &namelist, 0, ino_cmp); + int i = 0; - dir = opendir (path); - - if (dir == NULL) { + if (n_entries == -1) { fprintf (stderr, "Warning: failed to open directory %s: %s\n", path, strerror (errno)); goto DONE; } - entry_length = offsetof (struct dirent, d_name) + - pathconf (path, _PC_NAME_MAX) + 1; - entry = malloc (entry_length); - while (!interrupted) { - err = readdir_r (dir, entry, &e); - if (err) { - fprintf (stderr, "Error reading directory: %s\n", - strerror (errno)); - free (entry); - goto DONE; - } - - if (e == NULL) + if (i == n_entries) break; + entry= namelist[i++]; + /* Ignore special directories to avoid infinite recursion. * Also ignore the .notmuch directory. */ @@ -377,8 +366,8 @@ count_files (const char *path, int *count) DONE: if (entry) free (entry); - - closedir (dir); + if (namelist) + free (namelist); } int @@ -419,11 +408,13 @@ notmuch_new_command (void *ctx, if (interrupted) return 1; + printf ("Found %d total files. \n", count); notmuch = notmuch_database_create (db_path); add_files_state.ignore_read_only_directories = FALSE; add_files_state.total_files = count; } else { - notmuch = notmuch_database_open (db_path); + notmuch = notmuch_database_open (db_path, + NOTMUCH_DATABASE_MODE_READ_ONLY); add_files_state.ignore_read_only_directories = TRUE; add_files_state.total_files = 0; } @@ -435,7 +426,6 @@ notmuch_new_command (void *ctx, dot_notmuch_path = NULL; add_files_state.saw_read_only_directory = FALSE; - add_files_state.total_files = 0; add_files_state.processed_files = 0; add_files_state.added_messages = 0; gettimeofday (&add_files_state.tv_start, NULL);