| 1 |
/* |
| 2 |
* DIRENT.H (formerly DIRLIB.H) |
| 3 |
* This file has no copyright assigned and is placed in the Public Domain. |
| 4 |
* This file is a part of the mingw-runtime package. |
| 5 |
* No warranty is given; refer to the file DISCLAIMER within the package. |
| 6 |
* |
| 7 |
*/ |
| 8 |
#ifndef _DIRENT_H_ |
| 9 |
#define _DIRENT_H_ |
| 10 |
#pragma GCC system_header |
| 11 |
|
| 12 |
/* All the headers include this file. */ |
| 13 |
#include <_mingw.h> |
| 14 |
|
| 15 |
#include <io.h> |
| 16 |
|
| 17 |
#ifndef RC_INVOKED |
| 18 |
|
| 19 |
_BEGIN_C_DECLS |
| 20 |
|
| 21 |
struct dirent |
| 22 |
{ |
| 23 |
long d_ino; /* Always zero. */ |
| 24 |
unsigned short d_reclen; /* Always sizeof struct dirent. */ |
| 25 |
unsigned short d_namlen; /* Length of name in d_name. */ |
| 26 |
unsigned d_type; /* File attributes */ |
| 27 |
char d_name[FILENAME_MAX]; /* File name. */ |
| 28 |
}; |
| 29 |
|
| 30 |
/* This opaque data type represents the private structure |
| 31 |
* through which a directory stream is referenced. |
| 32 |
*/ |
| 33 |
typedef struct __dirstream_t DIR; |
| 34 |
|
| 35 |
DIR* __cdecl __MINGW_NOTHROW __mingw_opendir (const char*); |
| 36 |
struct dirent* __cdecl __MINGW_NOTHROW __mingw_readdir (DIR*); |
| 37 |
int __cdecl __MINGW_NOTHROW __mingw_closedir (DIR*); |
| 38 |
void __cdecl __MINGW_NOTHROW __mingw_rewinddir (DIR*); |
| 39 |
long __cdecl __MINGW_NOTHROW __mingw_telldir (DIR*); |
| 40 |
void __cdecl __MINGW_NOTHROW __mingw_seekdir (DIR*, long); |
| 41 |
|
| 42 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = opendir )) |
| 43 |
DIR* __cdecl __MINGW_NOTHROW opendir (const char *__dirname) |
| 44 |
{ return __mingw_opendir (__dirname); } |
| 45 |
|
| 46 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = readdir )) |
| 47 |
struct dirent* __cdecl __MINGW_NOTHROW readdir (DIR *__dir) |
| 48 |
{ return __mingw_readdir (__dir); } |
| 49 |
|
| 50 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = closedir )) |
| 51 |
int __cdecl __MINGW_NOTHROW closedir (DIR *__dir) |
| 52 |
{ return __mingw_closedir (__dir); } |
| 53 |
|
| 54 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = rewinddir )) |
| 55 |
void __cdecl __MINGW_NOTHROW rewinddir (DIR *__dir) |
| 56 |
{ return __mingw_rewinddir (__dir); } |
| 57 |
|
| 58 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = telldir )) |
| 59 |
long __cdecl __MINGW_NOTHROW telldir (DIR *__dir) |
| 60 |
{ return __mingw_telldir (__dir); } |
| 61 |
|
| 62 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = seekdir )) |
| 63 |
void __cdecl __MINGW_NOTHROW seekdir (DIR *__dir, long __loc) |
| 64 |
{ return __mingw_seekdir (__dir, __loc); } |
| 65 |
|
| 66 |
|
| 67 |
/* wide char versions */ |
| 68 |
|
| 69 |
struct _wdirent |
| 70 |
{ |
| 71 |
long d_ino; /* Always zero. */ |
| 72 |
unsigned short d_reclen; /* Always size of struct _wdirent. */ |
| 73 |
unsigned short d_namlen; /* Length of name in d_name. */ |
| 74 |
unsigned d_type; /* File attributes */ |
| 75 |
wchar_t d_name[FILENAME_MAX]; /* File name. */ |
| 76 |
}; |
| 77 |
|
| 78 |
/* This opaque data type represents the private structure |
| 79 |
* through which a wide directory stream is referenced. |
| 80 |
*/ |
| 81 |
typedef struct __wdirstream_t _WDIR; |
| 82 |
|
| 83 |
_WDIR* __cdecl __MINGW_NOTHROW __mingw__wopendir (const wchar_t*); |
| 84 |
struct _wdirent* __cdecl __MINGW_NOTHROW __mingw__wreaddir (_WDIR*); |
| 85 |
int __cdecl __MINGW_NOTHROW __mingw__wclosedir (_WDIR*); |
| 86 |
void __cdecl __MINGW_NOTHROW __mingw__wrewinddir (_WDIR*); |
| 87 |
long __cdecl __MINGW_NOTHROW __mingw__wtelldir (_WDIR*); |
| 88 |
void __cdecl __MINGW_NOTHROW __mingw__wseekdir (_WDIR*, long); |
| 89 |
|
| 90 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = _wopendir )) |
| 91 |
_WDIR* __cdecl __MINGW_NOTHROW _wopendir (const wchar_t *__dirname) |
| 92 |
{ return __mingw__wopendir (__dirname); } |
| 93 |
|
| 94 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = _wreaddir )) |
| 95 |
struct _wdirent* __cdecl __MINGW_NOTHROW _wreaddir (_WDIR *__dir) |
| 96 |
{ return __mingw__wreaddir (__dir); } |
| 97 |
|
| 98 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = _wclosedir )) |
| 99 |
int __cdecl __MINGW_NOTHROW _wclosedir (_WDIR *__dir) |
| 100 |
{ return __mingw__wclosedir (__dir); } |
| 101 |
|
| 102 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = _wrewinddir )) |
| 103 |
void __cdecl __MINGW_NOTHROW _wrewinddir (_WDIR *__dir) |
| 104 |
{ return __mingw__wrewinddir (__dir); } |
| 105 |
|
| 106 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = _wtelldir )) |
| 107 |
long __cdecl __MINGW_NOTHROW _wtelldir (_WDIR *__dir) |
| 108 |
{ return __mingw__wtelldir (__dir); } |
| 109 |
|
| 110 |
__CRT_ALIAS __JMPSTUB__(( FUNCTION = _wseekdir )) |
| 111 |
void __cdecl __MINGW_NOTHROW _wseekdir (_WDIR *__dir, long __loc) |
| 112 |
{ return __mingw__wseekdir (__dir, __loc); } |
| 113 |
|
| 114 |
_END_C_DECLS |
| 115 |
|
| 116 |
#if defined(_BSD_SOURCE) || defined(_WIN32) |
| 117 |
/* |
| 118 |
* BSD-ish systems define manifest constants for the d_type field; |
| 119 |
* although probably only DT_REG and DT_DIR are useful on Win32, we |
| 120 |
* try to map them as best we can from the _finddata.attrib field. |
| 121 |
* |
| 122 |
* The relevant Microsoft manifest values are: |
| 123 |
* |
| 124 |
* _A_NORMAL (0x0000) normal file: best fit for DT_REG |
| 125 |
* _A_RDONLY (0x0001) read-only: no BSD d_type equivalent |
| 126 |
* _A_HIDDEN (0x0002) hidden entity: no BSD equivalent |
| 127 |
* _A_SYSTEM (0x0004) system entity: no BSD equivalent |
| 128 |
* _A_VOLID (0x0008) volume label: no BSD equivalent |
| 129 |
* _A_SUBDIR (0x0010) directory: best fit for DT_DIR |
| 130 |
* _A_ARCH (0x0020) "dirty": no BSD equivalent |
| 131 |
* |
| 132 |
* Thus, we may immediately define: |
| 133 |
*/ |
| 134 |
#define DT_REG _A_NORMAL |
| 135 |
#define DT_DIR _A_SUBDIR |
| 136 |
|
| 137 |
/* The remaining BSD d_type manifest values have no Win32 equivalents; |
| 138 |
* we will define them artificially, and then we will ensure that our |
| 139 |
* opendir()/readdir() implementation will never assign them; (we will |
| 140 |
* substitute DT_UNKNOWN, but it would be unwise to simply make these |
| 141 |
* equivalent to that, since an application is likely to simply check |
| 142 |
* for d_type equal to any one of these defined types, and thus could |
| 143 |
* mistakenly identify DT_UNKNOWN as being of the tested type): |
| 144 |
*/ |
| 145 |
#define DT_BLK (((_A_SUBDIR) << 4) | DT_UNKNOWN) |
| 146 |
#define DT_CHR (((_A_SUBDIR) << 5) | DT_UNKNOWN) |
| 147 |
#define DT_FIFO (((_A_SUBDIR) << 6) | DT_UNKNOWN) |
| 148 |
#define DT_LNK (((_A_SUBDIR) << 7) | DT_UNKNOWN) |
| 149 |
#define DT_SOCK (((_A_SUBDIR) << 8) | DT_UNKNOWN) |
| 150 |
|
| 151 |
/* No file system entity can ever be simultaneously a volume label |
| 152 |
* and a directory; we will exploit this to unambiguously define: |
| 153 |
*/ |
| 154 |
#define DT_UNKNOWN (_A_VOLID | _A_SUBDIR) |
| 155 |
|
| 156 |
#define _DIRENT_HAVE_D_TYPE 1 |
| 157 |
#define _DIRENT_HAVE_D_RECLEN 1 |
| 158 |
#define _DIRENT_HAVE_D_NAMLEN 1 |
| 159 |
|
| 160 |
#endif /* _BSD_SOURCE */ |
| 161 |
#endif /* ! RC_INVOKED */ |
| 162 |
|
| 163 |
#endif /* !defined _DIRENT_H_ */ |