1 /* $Id: ntdir.h 3005 2016-11-06 00:07:37Z bird $ */
2 /** @file
3  * MSC + NT opendir, readdir, closedir and friends.
4  */
5 
6 /*
7  * Copyright (c) 2005-2013 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining a
10  * copy of this software and associated documentation files (the "Software"),
11  * to deal in the Software without restriction, including without limitation
12  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  * and/or sell copies of the Software, and to permit persons to whom the
14  * Software is furnished to do so, subject to the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included
17  * in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25  * IN THE SOFTWARE.
26  *
27  * Alternatively, the content of this file may be used under the terms of the
28  * GPL version 2 or later, or LGPL version 2.1 or later.
29  */
30 
31 #ifndef ___nt_ntdir_h
32 #define ___nt_ntdir_h
33 
34 #include "nttypes.h"
35 #include "ntstat.h"
36 
37 typedef struct dirent
38 {
39     /** Optional stat information.
40      * Only provided if using birdDirOpenExtraInfo(). */
41     BirdStat_T          d_stat;
42     /** The record length. */
43     unsigned __int16    d_reclen;
44     /** The name length. */
45     unsigned __int16    d_namlen;
46     /** The name type. */
47     unsigned char       d_type;
48     /** The name. */
49     char                d_name[512 - sizeof(BirdStat_T) - 2 - 2 - 1];
50 } BirdDirEntry_T;
51 
52 typedef struct direntw
53 {
54     /** Optional stat information.
55      * Only provided if using birdDirOpenExtraInfo(). */
56     BirdStat_T          d_stat;
57     /** The record length. */
58     unsigned __int16    d_reclen;
59     /** The name length (in wchar_t). */
60     unsigned __int16    d_namlen;
61     /** The name type. */
62     unsigned char       d_type;
63     /** The name. */
64     wchar_t             d_name[512 - sizeof(BirdStat_T) - 2 - 2 - 1];
65 } BirdDirEntryW_T;
66 
67 #define d_ino           d_stat.st_ino;
68 
69 /** @name d_type values.
70  * @{ */
71 #define DT_UNKNOWN           0
72 #define DT_FIFO              1
73 #define DT_CHR               2
74 #define DT_DIR               4
75 #define DT_BLK               6
76 #define DT_REG               8
77 #define DT_LNK              10
78 #define DT_SOCK             12
79 #define DT_WHT              14
80 /** @}  */
81 
82 /** @name BIRDDIR_F_XXX - birdDirOpenFromHandle & BirdDir_T::fFlags
83  * @{ */
84 /** birdDirClose should also close pvHandle.  */
85 #define BIRDDIR_F_CLOSE_HANDLE  1U
86 /** birdDirClose should not close the handle.  */
87 #define BIRDDIR_F_KEEP_HANDLE   0U
88 /** Provide extra info (stat). */
89 #define BIRDDIR_F_EXTRA_INFO    2U
90 /** Whether to restart the scan. */
91 #define BIRDDIR_F_RESTART_SCAN  4U
92 /** Set if the BirdDir_T structure is statically allocated. */
93 #define BIRDDIR_F_STATIC_ALLOC  8U
94 /** @} */
95 
96 typedef struct BirdDir
97 {
98     /** Magic value. */
99     unsigned            uMagic;
100     /** Flags. */
101     unsigned            fFlags;
102     /** The directory handle. */
103     void               *pvHandle;
104     /** The device number (st_dev). */
105     unsigned __int64    uDev;
106     /** The current position. */
107     long                offPos;
108 
109     /** Set if we haven't yet read anything. */
110     int                 fFirst;
111     /** Set if we have data in the buffer. */
112     int                 fHaveData;
113     /** The info type we're querying. */
114     int                 iInfoClass;
115     /** The current buffer position. */
116     unsigned            offBuf;
117     /** The number of bytes allocated for pabBuf. */
118     unsigned            cbBuf;
119     /** Buffer of size cbBuf. */
120     unsigned char      *pabBuf;
121 
122     /** Static directory entry. */
123     union
124     {
125         BirdDirEntry_T  DirEntry;
126         BirdDirEntryW_T DirEntryW;
127     } u;
128 } BirdDir_T;
129 /** Magic value for BirdDir. */
130 #define BIRD_DIR_MAGIC      0x19731120
131 
132 
133 BirdDir_T      *birdDirOpen(const char *pszPath);
134 BirdDir_T      *birdDirOpenExtraInfo(const char *pszPath);
135 BirdDir_T      *birdDirOpenExW(void *hRoot, const wchar_t *pwszPath, const wchar_t *pwszFilter, unsigned fFlags);
136 BirdDir_T      *birdDirOpenFromHandle(void *hDir, const void *pvReserved, unsigned fFlags);
137 BirdDir_T      *birdDirOpenFromHandleWithReuse(BirdDir_T *pDir, void *pvHandle, const void *pvReserved, unsigned fFlags);
138 BirdDirEntry_T *birdDirRead(BirdDir_T *pDir);
139 BirdDirEntryW_T *birdDirReadW(BirdDir_T *pDir);
140 long            birdDirTell(BirdDir_T *pDir);
141 void            birdDirSeek(BirdDir_T *pDir, long offDir);
142 int             birdDirClose(BirdDir_T *pDir);
143 
144 #define opendir                     birdDirOpen
145 #define readdir                     birdDirRead
146 #define telldir                     birdDirTell
147 #define seekdir                     birdDirSeek
148 #define rewinddir(a_pDir, a_offDir) birdDirSeek(a_pDir, 0)
149 #define closedir                    birdDirClose
150 #define _D_NAMLEN(a_pEnt)           ((a_pEnt)->d_namlen)
151 typedef BirdDir_T DIR;
152 
153 #endif
154 
155