|
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 | +} |