Fix large-file macro usage in bits/statvfs.h
[kopensolaris-gnu/glibc.git] / io / ftw.c
index 5c339a0..6b5e573 100644 (file)
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -1,5 +1,5 @@
 /* File tree walker functions.
-   Copyright (C) 1996-2003, 2004, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1996-2003, 2004, 2006, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -301,8 +301,7 @@ open_dir_stream (int *dfdp, struct ftw_data *data, struct dir_data *dirp)
                      int save_err = errno;
                      free (buf);
                      __set_errno (save_err);
-                     result = -1;
-                     break;
+                     return -1;
                    }
                  buf = newp;
                }
@@ -349,8 +348,17 @@ open_dir_stream (int *dfdp, struct ftw_data *data, struct dir_data *dirp)
        }
       else
        {
-         const char *name = ((data->flags & FTW_CHDIR)
-                             ? data->dirbuf + data->ftw.base: data->dirbuf);
+         const char *name;
+
+         if (data->flags & FTW_CHDIR)
+           {
+             name = data->dirbuf + data->ftw.base;
+             if (name[0] == '\0')
+               name = ".";
+           }
+         else
+           name = data->dirbuf;
+
          dirp->stream = __opendir (name);
        }
 
@@ -535,7 +543,11 @@ fail:
 
   while (dir.stream != NULL && (d = __readdir64 (dir.stream)) != NULL)
     {
+#ifdef _DIRENT_HAVE_D_TYPE
       result = process_entry (data, &dir, d->d_name, NAMLEN (d), d->d_type);
+#else
+      result = process_entry (data, &dir, d->d_name, NAMLEN (d), DT_UNKNOWN);
+#endif
       if (result != 0)
        break;
     }
@@ -722,9 +734,16 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors,
   /* Get stat info for start directory.  */
   if (result == 0)
     {
-      const char *name = ((data.flags & FTW_CHDIR)
-                         ? data.dirbuf + data.ftw.base
-                         : data.dirbuf);
+      const char *name;
+
+      if (data.flags & FTW_CHDIR)
+       {
+         name = data.dirbuf + data.ftw.base;
+         if (name[0] == '\0')
+           name = ".";
+       }
+      else
+       name = data.dirbuf;
 
       if (((flags & FTW_PHYS)
           ? LXSTAT (_STAT_VER, name, &st)