PostgreSQL Source Code
git master
Loading...
Searching...
No Matches
dirent.c
Go to the documentation of this file.
1
/*-------------------------------------------------------------------------
2
*
3
* dirent.c
4
* opendir/readdir/closedir for win32/msvc
5
*
6
* Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7
* Portions Copyright (c) 1994, Regents of the University of California
8
*
9
*
10
* IDENTIFICATION
11
* src/port/dirent.c
12
*
13
*-------------------------------------------------------------------------
14
*/
15
16
#ifndef FRONTEND
17
#include "
postgres.h
"
18
#else
19
#include "
postgres_fe.h
"
20
#endif
21
22
#include <
dirent.h
>
23
24
25
struct
DIR
26
{
27
char
*
dirname
;
28
struct
dirent
ret
;
/* Used to return to caller */
29
HANDLE
handle
;
30
};
31
32
DIR
*
33
opendir
(
const
char
*dirname)
34
{
35
DWORD
attr;
36
DIR
*d;
37
38
/* Make sure it is a directory */
39
attr =
GetFileAttributes
(dirname);
40
if
(attr ==
INVALID_FILE_ATTRIBUTES
)
41
{
42
errno
=
ENOENT
;
43
return
NULL
;
44
}
45
if
((attr &
FILE_ATTRIBUTE_DIRECTORY
) !=
FILE_ATTRIBUTE_DIRECTORY
)
46
{
47
errno
=
ENOTDIR
;
48
return
NULL
;
49
}
50
51
d =
malloc
(
sizeof
(
DIR
));
52
if
(!d)
53
{
54
errno
=
ENOMEM
;
55
return
NULL
;
56
}
57
d->
dirname
=
malloc
(
strlen
(dirname) + 4);
58
if
(!d->
dirname
)
59
{
60
errno
=
ENOMEM
;
61
free
(d);
62
return
NULL
;
63
}
64
strcpy
(d->
dirname
, dirname);
65
if
(d->
dirname
[
strlen
(d->
dirname
) - 1] !=
'/'
&&
66
d->
dirname
[
strlen
(d->
dirname
) - 1] !=
'\\'
)
67
strcat
(d->
dirname
,
"\\"
);
/* Append backslash if not already there */
68
strcat
(d->
dirname
,
"*"
);
/* Search for entries named anything */
69
d->
handle
=
INVALID_HANDLE_VALUE
;
70
d->
ret
.
d_ino
= 0;
/* no inodes on win32 */
71
d->
ret
.
d_reclen
= 0;
/* not used on win32 */
72
d->
ret
.
d_type
=
DT_UNKNOWN
;
73
74
return
d;
75
}
76
77
struct
dirent
*
78
readdir
(
DIR
*d)
79
{
80
WIN32_FIND_DATA
fd
;
81
82
if
(d->
handle
==
INVALID_HANDLE_VALUE
)
83
{
84
d->
handle
=
FindFirstFile
(d->
dirname
, &
fd
);
85
if
(d->
handle
==
INVALID_HANDLE_VALUE
)
86
{
87
/* If there are no files, force errno=0 (unlike mingw) */
88
if
(
GetLastError
() ==
ERROR_FILE_NOT_FOUND
)
89
errno
= 0;
90
else
91
_dosmaperr
(
GetLastError
());
92
return
NULL
;
93
}
94
}
95
else
96
{
97
if
(!
FindNextFile
(d->
handle
, &
fd
))
98
{
99
/* If there are no more files, force errno=0 (like mingw) */
100
if
(
GetLastError
() ==
ERROR_NO_MORE_FILES
)
101
errno
= 0;
102
else
103
_dosmaperr
(
GetLastError
());
104
return
NULL
;
105
}
106
}
107
strcpy
(d->
ret
.
d_name
,
fd
.cFileName);
/* Both strings are MAX_PATH long */
108
d->
ret
.
d_namlen
=
strlen
(d->
ret
.
d_name
);
109
110
/*
111
* For reparse points dwReserved0 field will contain the ReparseTag. We
112
* check this first, because reparse points are also reported as
113
* directories.
114
*/
115
if
((
fd
.dwFileAttributes &
FILE_ATTRIBUTE_REPARSE_POINT
) != 0 &&
116
(
fd
.dwReserved0 ==
IO_REPARSE_TAG_MOUNT_POINT
))
117
d->
ret
.
d_type
=
DT_LNK
;
118
else
if
((
fd
.dwFileAttributes &
FILE_ATTRIBUTE_DIRECTORY
) != 0)
119
d->
ret
.
d_type
=
DT_DIR
;
120
else
121
d->
ret
.
d_type
=
DT_REG
;
122
123
return
&d->
ret
;
124
}
125
126
int
127
closedir
(
DIR
*d)
128
{
129
int
ret = 0;
130
131
if
(d->
handle
!=
INVALID_HANDLE_VALUE
)
132
ret = !
FindClose
(d->
handle
);
133
free
(d->
dirname
);
134
free
(d);
135
136
return
ret;
137
}
closedir
int closedir(DIR *d)
Definition
dirent.c:127
readdir
struct dirent * readdir(DIR *d)
Definition
dirent.c:78
opendir
DIR * opendir(const char *dirname)
Definition
dirent.c:33
dirent.h
DT_DIR
#define DT_DIR
Definition
dirent.h:28
DT_UNKNOWN
#define DT_UNKNOWN
Definition
dirent.h:25
DT_REG
#define DT_REG
Definition
dirent.h:30
DT_LNK
#define DT_LNK
Definition
dirent.h:31
postgres.h
postgres_fe.h
fd
static int fd(const char *x, int i)
Definition
preproc-init.c:105
fb
static int fb(int x)
Definition
preproc-init.c:92
free
#define free(a)
Definition
snowball_runtime.h:65
malloc
#define malloc(a)
Definition
snowball_runtime.h:50
DIR
Definition
dirent.c:26
DIR::ret
struct dirent ret
Definition
dirent.c:28
DIR::handle
HANDLE handle
Definition
dirent.c:29
DIR::dirname
char * dirname
Definition
dirent.c:27
dirent
Definition
dirent.h:10
dirent::d_name
char d_name[MAX_PATH]
Definition
dirent.h:15
dirent::d_namlen
unsigned short d_namlen
Definition
dirent.h:14
dirent::d_reclen
unsigned short d_reclen
Definition
dirent.h:12
dirent::d_ino
long d_ino
Definition
dirent.h:11
dirent::d_type
unsigned char d_type
Definition
dirent.h:13
_dosmaperr
void _dosmaperr(unsigned long)
Definition
win32error.c:177
src
port
dirent.c
Generated on Tue Jan 27 2026 06:13:18 for PostgreSQL Source Code by
1.9.8