nmh-workers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Nmh-workers] [PATCH] Further simplify dodir/addir/addfold in uip/folder


From: Eric Gillespie
Subject: [Nmh-workers] [PATCH] Further simplify dodir/addir/addfold in uip/folder.c
Date: Mon, 04 Aug 2008 18:02:28 -0700

This depends on my previous patch to uip/folder.c, but I provide
them separately for ease of review.

=== modified file 'ChangeLog'
--- ChangeLog   2008-08-04 23:53:23 +0000
+++ ChangeLog   2008-08-05 00:58:48 +0000
@@ -1,6 +1,12 @@
 2008-08-04  Eric Gillespie  <address@hidden>
 
-       * uip/folder.c: Simplify dodir/addir/addfold.
+       * uip/folder.c: Simplify dodir/addir/addfold.  Dump hacky
+       over-optimization in addir that tried to avoid readdir after all
+       child directories had been read; this was also trying to support
+       symlinks to directories, but would have been failing (because
+       nlink may have gone to 0 with symlinks to directories remaining)
+       had the lstat usage been correct (lstat doesn't fail for normal
+       directories; should have used S_ISLNK).
 
 2008-08-03  Peter Maydell  <address@hidden>
 

=== modified file 'uip/folder.c'
--- uip/folder.c        2008-08-04 23:47:39 +0000
+++ uip/folder.c        2008-08-05 00:45:23 +0000
@@ -665,16 +665,11 @@ sfold (struct msgs *mp, char *msg)
 static void
 addir (char *name)
 {
-    int nlink;
     char *prefix, *child;
     struct stat st;
     struct dirent *dp;
     DIR * dd;
 
-   /* short-cut to see if directory has any sub-directories */
-    if (stat (name, &st) != -1 && st.st_nlink == 2)
-        return;
- 
     if (!(dd = opendir (name))) {
        admonish (name, "unable to read directory ");
        return;
@@ -686,25 +681,12 @@ addir (char *name)
        prefix = concat (name, "/", (void *)NULL);
     }
 
-    /*
-     * Keep track of the number of directories we've seen
-     * so we can quit stat'ing early, if we've seen them all.
-     */
-    nlink = st.st_nlink;
-
-    while (nlink && (dp = readdir (dd))) {
+    while ((dp = readdir (dd))) {
        if (!strcmp (dp->d_name, ".") || !strcmp (dp->d_name, "..")) {
-           nlink--;
            continue;
        }
        child = concat (prefix, dp->d_name, (void *)NULL);
        if (stat (child, &st) != -1 && S_ISDIR(st.st_mode)) {
-           /*
-            * Check if this was really a symbolic link pointing at
-            * a directory.  If not, then decrement link count.
-            */
-           if (lstat (child, &st) == -1)
-               nlink--;
            /* addfold saves child in the list, don't free it */
            addfold (child);
        } else {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]