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()
/*
- * 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
*
* 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;
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