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_ */ |