notmuch new: Fix regression preventing addition of symlinked mail files.
authorCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 18:30:08 +0000 (10:30 -0800)
committerCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 18:48:43 +0000 (10:48 -0800)
As described in the previous commit message, we introduced multiple
symlink-based regressions in commit
3df737bc4addfce71c647792ee668725e5221a98

Here, we fix the case of symlinks to regular files by doing an extra
stat of any DT_LNK files to determine if they do, in fact, link to
regular files.

notmuch-new.c

index e2b5878f06058196f2e1826f681befbe32970641..432d126286fba8fd070ad75d18850ecca38caef9 100644 (file)
@@ -334,8 +334,27 @@ add_files_recursive (notmuch_database_t *notmuch,
            notmuch_filenames_advance (db_subdirs);
        }
 
-       if (entry->d_type != DT_REG)
+       /* If we're looking at a symlink, we only want to add it if it
+        * links to a regular file, (and not to a directory, say). */
+       if (entry->d_type == DT_LNK) {
+           int err;
+
+           next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
+           err = stat (next, &st);
+           talloc_free (next);
+           next = NULL;
+
+           /* Don't emit an error for a link pointing nowhere, since
+            * the directory-traversal pass will have already done
+            * that. */
+           if (err)
+               continue;
+
+           if (! S_ISREG (st.st_mode))
+               continue;
+       } else if (entry->d_type != DT_REG) {
            continue;
+       }
 
        /* Don't add a file that we've added before. */
        if (notmuch_filenames_has_more (db_files) &&