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