OSDN Git Service

Make dirent implementation namespace and time_t clean.
[mingw/mingw-org-wsl.git] / mingwrt / include / dirent.h
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_ */