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)