Remove scandir() requirement in pg_upgrade; instead just use readdir()
authorBruce Momjian <bruce@momjian.us>
Fri, 18 Nov 2011 02:59:04 +0000 (21:59 -0500)
committerBruce Momjian <bruce@momjian.us>
Fri, 18 Nov 2011 02:59:49 +0000 (21:59 -0500)
--- we were not using the scandir pattern filtering anyway.  This also
removes the scandir requirement in configure.

configure
configure.in
contrib/pg_upgrade/file.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/relfilenode.c

index 58fea907ea6038b34c30f90e4063ad6bea26a02d..de9ba5af62e0a3265c4145ee95eecc87cc5781f9 100755 (executable)
--- a/configure
+++ b/configure
@@ -18987,8 +18987,7 @@ fi
 
 
 
-
-for ac_func in cbrt dlopen fcvt fdatasync getifaddrs getpeerucred getrlimit memmove poll pstat readlink scandir setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs wcstombs_l
+for ac_func in cbrt dlopen fcvt fdatasync getifaddrs getpeerucred getrlimit memmove poll pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs wcstombs_l
 do
 as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
index 5dc669f545ae326f34bc447f3281170590bdcb58..5591b93e758d3d4b7ede4da9bacd502cecad1541 100644 (file)
@@ -1193,7 +1193,7 @@ PGAC_VAR_INT_TIMEZONE
 AC_FUNC_ACCEPT_ARGTYPES
 PGAC_FUNC_GETTIMEOFDAY_1ARG
 
-AC_CHECK_FUNCS([cbrt dlopen fcvt fdatasync getifaddrs getpeerucred getrlimit memmove poll pstat readlink scandir setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs wcstombs_l])
+AC_CHECK_FUNCS([cbrt dlopen fcvt fdatasync getifaddrs getpeerucred getrlimit memmove poll pstat readlink setproctitle setsid sigprocmask symlink sysconf towlower utime utimes waitpid wcstombs wcstombs_l])
 
 AC_REPLACE_FUNCS(fseeko)
 case $host_os in
index b414769917f3250b7ddc10e30b7f54a1f19be243..0ea269f2599046a507c4895221baa149106b948e 100644 (file)
@@ -21,12 +21,6 @@ static int   copy_file(const char *fromfile, const char *tofile, bool force);
 static int win32_pghardlink(const char *src, const char *dst);
 #endif
 
-#ifndef HAVE_SCANDIR
-static int pg_scandir_internal(const char *dirname,
-                   struct dirent *** namelist,
-                   int (*selector) (const struct dirent *));
-#endif
-
 
 /*
  * copyAndUpdateFile()
@@ -228,45 +222,7 @@ copy_file(const char *srcfile, const char *dstfile, bool force)
 
 
 /*
- * pg_scandir()
- *
- * Wrapper for portable scandir functionality
- */
-int
-pg_scandir(const char *dirname,
-          struct dirent *** namelist,
-          int (*selector) (const struct dirent *))
-{
-#ifndef HAVE_SCANDIR
-   return pg_scandir_internal(dirname, namelist, selector);
-
-   /*
-    * scandir() is originally from BSD 4.3, which had the third argument as
-    * non-const. Linux and other C libraries have updated it to use a const.
-    * http://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2005-12/msg002
-    * 14.html
-    *
-    * Here we try to guess which libc's need const, and which don't. The net
-    * goal here is to try to suppress a compiler warning due to a prototype
-    * mismatch of const usage. Ideally we would do this via autoconf, but
-    * autoconf doesn't have a suitable builtin test and it seems overkill to
-    * add one just to avoid a warning.
-    */
-#elif defined(__FreeBSD__) || defined(__bsdi__) || defined(__darwin__) || defined(__OpenBSD__)
-   /* no const */
-   return scandir(dirname, namelist, (int (*) (struct dirent *)) selector, NULL);
-#else
-   /* use const */
-   return scandir(dirname, namelist, selector, NULL);
-#endif
-}
-
-
-#ifndef HAVE_SCANDIR
-/*
- * pg_scandir_internal()
- *
- * Implement our own scandir() on platforms that don't have it.
+ * load_directory()
  *
  * Returns count of files that meet the selection criteria coded in
  * the function pointed to by selector.  Creates an array of pointers
@@ -274,13 +230,10 @@ pg_scandir(const char *dirname,
  *
  * Note that the number of dirent structures needed is dynamically
  * allocated using realloc.  Realloc can be inefficient if invoked a
- * large number of times.  Its use in pg_upgrade is to find filesystem
- * filenames that have extended beyond the initial segment (file.1,
- * .2, etc.) and should therefore be invoked a small number of times.
+ * large number of times.
  */
-static int
-pg_scandir_internal(const char *dirname,
-        struct dirent *** namelist, int (*selector) (const struct dirent *))
+int
+load_directory(const char *dirname, struct dirent ***namelist)
 {
    DIR        *dirdesc;
    struct dirent *direntry;
@@ -295,42 +248,37 @@ pg_scandir_internal(const char *dirname,
 
    while ((direntry = readdir(dirdesc)) != NULL)
    {
-       /* Invoke the selector function to see if the direntry matches */
-       if (!selector || (*selector) (direntry))
-       {
-           count++;
+       count++;
 
-           *namelist = (struct dirent **) realloc((void *) (*namelist),
-                       (size_t) ((name_num + 1) * sizeof(struct dirent *)));
+       *namelist = (struct dirent **) realloc((void *) (*namelist),
+                   (size_t) ((name_num + 1) * sizeof(struct dirent *)));
 
-           if (*namelist == NULL)
-           {
-               closedir(dirdesc);
-               return -1;
-           }
+       if (*namelist == NULL)
+       {
+           closedir(dirdesc);
+           return -1;
+       }
 
-           entrysize = sizeof(struct dirent) - sizeof(direntry->d_name) +
-               strlen(direntry->d_name) + 1;
+       entrysize = sizeof(struct dirent) - sizeof(direntry->d_name) +
+           strlen(direntry->d_name) + 1;
 
-           (*namelist)[name_num] = (struct dirent *) malloc(entrysize);
+       (*namelist)[name_num] = (struct dirent *) malloc(entrysize);
 
-           if ((*namelist)[name_num] == NULL)
-           {
-               closedir(dirdesc);
-               return -1;
-           }
+       if ((*namelist)[name_num] == NULL)
+       {
+           closedir(dirdesc);
+           return -1;
+       }
 
-           memcpy((*namelist)[name_num], direntry, entrysize);
+       memcpy((*namelist)[name_num], direntry, entrysize);
 
-           name_num++;
-       }
+       name_num++;
    }
 
    closedir(dirdesc);
 
    return count;
 }
-#endif
 
 
 void
index d64c72a5cdc3d482e16ab5b900065e66f29fee6b..7d48e9c430bd2fdb5459d9e2002cffdff49c9ff4 100644 (file)
@@ -333,8 +333,7 @@ const char *setupPageConverter(pageCnvCtx **result);
 typedef void *pageCnvCtx;
 #endif
 
-int pg_scandir(const char *dirname, struct dirent *** namelist,
-          int (*selector) (const struct dirent *));
+int load_directory(const char *dirname, struct dirent ***namelist);
 const char *copyAndUpdateFile(pageCnvCtx *pageConverter, const char *src,
                  const char *dst, bool force);
 const char *linkAndUpdateFile(pageCnvCtx *pageConverter, const char *src,
index 721bf4d8db26504ddd275a6eb1753e1228bc777c..74d16216f3ba862fb8984793021d23a72abf297f 100644 (file)
@@ -160,7 +160,7 @@ transfer_single_new_db(pageCnvCtx *pageConverter,
            }
 
            snprintf(old_dir, sizeof(old_dir), "%s", maps[mapnum].old_dir);
-           numFiles = pg_scandir(old_dir, &namelist, NULL);
+           numFiles = load_directory(old_dir, &namelist);
        }
 
        /* Copying files might take some time, so give feedback. */