]> granicus.if.org Git - postgresql/blob - src/port/dirent.c
Prepare code to be built by MSVC:
[postgresql] / src / port / dirent.c
1 /*-------------------------------------------------------------------------\r
2  *\r
3  * dirent.c\r
4  *        opendir/readdir/closedir for win32/msvc\r
5  *\r
6  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group\r
7  * Portions Copyright (c) 1994, Regents of the University of California\r
8  *\r
9  *\r
10  * IDENTIFICATION\r
11  *        $PostgreSQL: pgsql/src/port/dirent.c,v 1.1 2006/06/07 22:24:46 momjian Exp $\r
12  *\r
13  *-------------------------------------------------------------------------\r
14  */\r
15 \r
16 #include "postgres.h"\r
17 #include <dirent.h>\r
18 \r
19 \r
20 struct DIR {\r
21         char *dirname;\r
22         struct dirent ret; /* Used to return to caller */\r
23         HANDLE handle;\r
24 };\r
25 \r
26 DIR* opendir(const char *dirname)\r
27 {\r
28         DWORD attr;\r
29         DIR *d;\r
30 \r
31         /* Make sure it is a directory */\r
32         attr = GetFileAttributes(dirname);\r
33         if (attr == INVALID_FILE_ATTRIBUTES) \r
34         {\r
35                 errno = ENOENT;\r
36                 return NULL;\r
37         }\r
38         if ((attr & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)\r
39         {\r
40                 errno = ENOTDIR;\r
41                 return NULL;\r
42         }\r
43 \r
44         d = malloc(sizeof(DIR));\r
45         if (!d)\r
46         {\r
47                 errno = ENOMEM;\r
48                 return NULL;\r
49         }\r
50         d->dirname = malloc(strlen(dirname)+4);\r
51         if (!d->dirname)\r
52         {\r
53                 errno = ENOMEM;\r
54                 free(d);\r
55                 return NULL;\r
56         }\r
57         strcpy(d->dirname, dirname);\r
58         if (d->dirname[strlen(d->dirname)-1] != '/' &&\r
59             d->dirname[strlen(d->dirname)-1] != '\\')\r
60                 strcat(d->dirname,"\\"); /* Append backslash if not already there */\r
61         strcat(d->dirname,"*");          /* Search for entries named anything */\r
62         d->handle = INVALID_HANDLE_VALUE;\r
63         d->ret.d_ino = 0; /* no inodes on win32 */\r
64         d->ret.d_reclen =  0; /* not used on win32 */\r
65 \r
66         return d;\r
67 }\r
68 \r
69 struct dirent* readdir(DIR * d)\r
70 {\r
71         WIN32_FIND_DATA fd;\r
72 \r
73         if (d->handle == INVALID_HANDLE_VALUE)\r
74         {\r
75                 d->handle = FindFirstFile(d->dirname, &fd);\r
76                 if (d->handle == INVALID_HANDLE_VALUE)\r
77                 {\r
78                         errno = ENOENT;\r
79                         return NULL;\r
80                 }\r
81         }\r
82         else \r
83         {\r
84                 if (!FindNextFile(d->handle, &fd))\r
85                 {\r
86                         if (GetLastError() == ERROR_NO_MORE_FILES)\r
87                         {\r
88                                 /* No more files, force errno=0 (unlike mingw) */\r
89                                 errno = 0;\r
90                                 return NULL;\r
91                         }\r
92                         _dosmaperr(GetLastError());\r
93                         return NULL;\r
94                 }\r
95         }\r
96         strcpy(d->ret.d_name, fd.cFileName); /* Both strings are MAX_PATH long */\r
97         d->ret.d_namlen = strlen(d->ret.d_name);\r
98         return &d->ret;\r
99 }\r
100 \r
101 int closedir(DIR *d)\r
102 {\r
103         if (d->handle != INVALID_HANDLE_VALUE)\r
104                 FindClose(d->handle);\r
105         free(d->dirname);\r
106         free(d);\r
107         return 0;\r
108 }\r