* src/config.h.W32.template [W32]: Add support for dirent.d_type

* src/w32/include/dirent.h: Add DT_* values for dirent.d_type
(struct dirent): Add d_type
* src/w32/compat/durent.c (readdir): Set dirent.d_type based on
Windows file attributes.
This commit is contained in:
Paul Smith 2019-09-07 18:27:50 -04:00
parent 64f5375fe0
commit 34ee9adaed
3 changed files with 47 additions and 11 deletions

View File

@ -291,6 +291,9 @@ this program. If not, see <http://www.gnu.org/licenses/>. */
/* Define to 1 if you have the 'strsignal' function. */
/* #undef HAVE_STRSIGNAL */
/* Define to 1 if `d_type' is a member of `struct dirent'. */
#define HAVE_STRUCT_DIRENT_D_TYPE 1
/* Define to 1 if you have the `isatty' function. */
#define HAVE_ISATTY 1

View File

@ -135,6 +135,13 @@ readdir(DIR* pDir)
pDir->dir_sdReturn.d_ino = (ino_t)-1;
strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName);
if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DEVICE)
pDir->dir_sdReturn.d_type = DT_CHR;
else if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
pDir->dir_sdReturn.d_type = DT_DIR;
else
pDir->dir_sdReturn.d_type = DT_REG;
return &pDir->dir_sdReturn;
}

View File

@ -33,20 +33,46 @@ this program. If not, see <http://www.gnu.org/licenses/>. */
#define __DIRENT_COOKIE 0xfefeabab
/* File types for `d_type'.
Windows only supports DT_CHR, DT_DIR, and DT_REG. */
enum
{
DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = 1,
# define DT_FIFO DT_FIFO
DT_CHR = 2,
# define DT_CHR DT_CHR
DT_DIR = 4,
# define DT_DIR DT_DIR
DT_BLK = 6,
# define DT_BLK DT_BLK
DT_REG = 8,
# define DT_REG DT_REG
DT_LNK = 10,
# define DT_LNK DT_LNK
DT_SOCK = 12,
# define DT_SOCK DT_SOCK
DT_WHT = 14
# define DT_WHT DT_WHT
};
struct dirent
{
ino_t d_ino; /* unused - no equivalent on WINDOWS32 */
char d_name[NAME_MAX+1];
};
{
ino_t d_ino; /* unused - no equivalent on WINDOWS32. */
unsigned char d_type;
char d_name[NAME_MAX+1]; /* must come last due to dir.c assumptions. */
};
typedef struct dir_struct {
ULONG dir_ulCookie;
HANDLE dir_hDirHandle;
DWORD dir_nNumFiles;
char dir_pDirectoryName[NAME_MAX+1];
struct dirent dir_sdReturn;
} DIR;
typedef struct dir_struct
{
ULONG dir_ulCookie;
HANDLE dir_hDirHandle;
DWORD dir_nNumFiles;
char dir_pDirectoryName[NAME_MAX+1];
struct dirent dir_sdReturn;
} DIR;
DIR *opendir(const char *);
struct dirent *readdir(DIR *);