You've already forked pg_probackup
mirror of
https://github.com/postgrespro/pg_probackup.git
synced 2026-06-21 01:34:15 +02:00
Add a portable implementation for IsDir().
dirent.d_type is not in POSIX and does not exist at least on Solaris. git-svn-id: http://pg-rman.googlecode.com/svn/trunk@23 182aca00-e38e-11de-a668-6fd11605f5ce
This commit is contained in:
@@ -12,9 +12,9 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
|
#include <sys/file.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/file.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -96,19 +96,18 @@ IsDir(const char *dirpath, const DIR *dir, const struct dirent *ent)
|
|||||||
#if defined(DT_DIR)
|
#if defined(DT_DIR)
|
||||||
return ent->d_type == DT_DIR;
|
return ent->d_type == DT_DIR;
|
||||||
#elif defined(_finddata_t)
|
#elif defined(_finddata_t)
|
||||||
|
/* Optimization for VC++ on Windows. */
|
||||||
return (dir->dd_dta.attrib & FILE_ATTRIBUTE_DIRECTORY) != 0;
|
return (dir->dd_dta.attrib & FILE_ATTRIBUTE_DIRECTORY) != 0;
|
||||||
#elif defined(WIN32)
|
#else
|
||||||
char path[MAXPGPATH];
|
/* Portable implementation because dirent.d_type is not in POSIX. */
|
||||||
DWORD attr;
|
char path[MAXPGPATH];
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
/* dirent.d_type does not exists */
|
|
||||||
strlcpy(path, dirpath, MAXPGPATH);
|
strlcpy(path, dirpath, MAXPGPATH);
|
||||||
strlcat(path, "/", MAXPGPATH);
|
strlcat(path, "/", MAXPGPATH);
|
||||||
strlcat(path, ent->d_name, MAXPGPATH);
|
strlcat(path, ent->d_name, MAXPGPATH);
|
||||||
attr = GetFileAttributes(path);
|
|
||||||
return attr != (DWORD) -1 && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0;
|
return stat(path, &st) == 0 && S_ISDIR(st.st_mode);
|
||||||
#else
|
|
||||||
#error IsDir: this platform is not supported.
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user