PostgreSQL Source Code: src/port/win32stat.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include "c.h"
18
19#include <windows.h>
20
21
22
23
24static __time64_t
26{
27 ULARGE_INTEGER unified_ft = {0};
29
30 unified_ft.LowPart = ft->dwLowDateTime;
31 unified_ft.HighPart = ft->dwHighDateTime;
32
33 if (unified_ft.QuadPart < EpochShift)
34 return -1;
35
36 unified_ft.QuadPart -= EpochShift;
37 unified_ft.QuadPart /= 10 * 1000 * 1000;
38
39 return unified_ft.QuadPart;
40}
41
42
43
44
45
46
47static unsigned short
49{
50 unsigned short uxmode = 0;
51
52 uxmode |= (unsigned short) ((attr & FILE_ATTRIBUTE_DIRECTORY) ?
53 (_S_IFDIR) : (_S_IFREG));
54
55 uxmode |= (unsigned short) ((attr & FILE_ATTRIBUTE_READONLY) ?
56 (_S_IREAD) : (_S_IREAD | _S_IWRITE));
57
58
59 uxmode |= _S_IEXEC;
60
61 return uxmode;
62}
63
64
65
66
67static int
69{
70 BY_HANDLE_FILE_INFORMATION fiData;
71
72 memset(buf, 0, sizeof(*buf));
73
74
75
76
77
78 if (!GetFileInformationByHandle(hFile, &fiData))
79 {
81 return -1;
82 }
83
84 if (fiData.ftLastWriteTime.dwLowDateTime ||
85 fiData.ftLastWriteTime.dwHighDateTime)
87
88 if (fiData.ftLastAccessTime.dwLowDateTime ||
89 fiData.ftLastAccessTime.dwHighDateTime)
91 else
92 buf->st_atime = buf->st_mtime;
93
94 if (fiData.ftCreationTime.dwLowDateTime ||
95 fiData.ftCreationTime.dwHighDateTime)
97 else
98 buf->st_ctime = buf->st_mtime;
99
101 buf->st_nlink = fiData.nNumberOfLinks;
102
103 buf->st_size = ((((uint64) fiData.nFileSizeHigh) << 32) |
104 fiData.nFileSizeLow);
105
106 return 0;
107}
108
109
110
111
112int
114{
115
116
117
118
119
120
121 HANDLE hFile;
122 int ret;
123
124 hFile = pgwin32_open_handle(name, O_RDONLY, true);
125 if (hFile == INVALID_HANDLE_VALUE)
126 {
127 if (errno == ENOENT)
128 {
129
130
131
132
133
134
135
136 memset(buf, 0, sizeof(*buf));
137 ret = 0;
138 }
139 else
140 return -1;
141 }
142 else
144
145
146
147
148
149 if ((ret == 0 && S_ISDIR(buf->st_mode)) || hFile == INVALID_HANDLE_VALUE)
150 {
152 ssize_t size;
153
154
155
156
157
158
160 if (size < 0)
161 {
162 if (errno == EACCES &&
164 {
165
166 errno = ENOENT;
167 ret = -1;
168 }
169 else if (errno == EINVAL)
170 {
171
172 }
173 else
174 {
175
176 ret = -1;
177 }
178 }
179 else
180 {
181
182 buf->st_mode &= ~S_IFDIR;
184 buf->st_size = size;
185 ret = 0;
186 }
187 }
188
189 if (hFile != INVALID_HANDLE_VALUE)
190 CloseHandle(hFile);
191 return ret;
192}
193
194
195
196
197int
199{
200 int loops = 0;
201 int ret;
203
205
207
208
209 while (ret == 0 && S_ISLNK(buf->st_mode))
210 {
212 ssize_t size;
213
214 if (++loops > 8)
215 {
216 errno = ELOOP;
217 return -1;
218 }
219
220
221
222
223
224
225
227 if (size < 0)
228 {
229 if (errno == EACCES &&
231 {
232
233 errno = ENOENT;
234 }
235 return -1;
236 }
237 if (size >= sizeof(next))
238 {
239 errno = ENAMETOOLONG;
240 return -1;
241 }
242 next[size] = 0;
243
245 strcpy(curr, next);
246 }
247
248 return ret;
249}
250
251
252
253
254int
256{
257 HANDLE hFile = (HANDLE) _get_osfhandle(fileno);
258 DWORD fileType = FILE_TYPE_UNKNOWN;
259 unsigned short st_mode;
260
261 if (buf == NULL)
262 {
263 errno = EINVAL;
264 return -1;
265 }
266
268 if (errno != 0)
269 return -1;
270
271 switch (fileType)
272 {
273
274 case FILE_TYPE_DISK:
276
277
278
279
280
281 case FILE_TYPE_PIPE:
282 st_mode = _S_IFIFO;
283 break;
284
285 case FILE_TYPE_CHAR:
286 st_mode = _S_IFCHR;
287 break;
288
289 case FILE_TYPE_REMOTE:
290 case FILE_TYPE_UNKNOWN:
291 default:
292 errno = EINVAL;
293 return -1;
294 }
295
296 memset(buf, 0, sizeof(*buf));
297 buf->st_mode = st_mode;
298 buf->st_dev = fileno;
299 buf->st_rdev = fileno;
300 buf->st_nlink = 1;
301 return 0;
302}
size_t strlcpy(char *dst, const char *src, size_t siz)
void _dosmaperr(unsigned long)
DWORD pgwin32_get_file_type(HANDLE hFile)
#define readlink(path, buf, size)
PGDLLIMPORT RtlGetLastNtStatus_t pg_RtlGetLastNtStatus
static __time64_t filetime_to_time(const FILETIME *ft)
static unsigned short fileattr_to_unixmode(int attr)
int _pgfstat64(int fileno, struct stat *buf)
int _pgstat64(const char *name, struct stat *buf)
static int fileinfo_to_stat(HANDLE hFile, struct stat *buf)
int _pglstat64(const char *name, struct stat *buf)