]>
Commit | Line | Data |
---|---|---|
c7de829c WD |
1 | /**************************************************************************** |
2 | * | |
3 | * SciTech OS Portability Manager Library | |
4 | * | |
5 | * ======================================================================== | |
6 | * | |
7 | * The contents of this file are subject to the SciTech MGL Public | |
8 | * License Version 1.0 (the "License"); you may not use this file | |
9 | * except in compliance with the License. You may obtain a copy of | |
10 | * the License at http://www.scitechsoft.com/mgl-license.txt | |
11 | * | |
12 | * Software distributed under the License is distributed on an | |
13 | * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | |
14 | * implied. See the License for the specific language governing | |
15 | * rights and limitations under the License. | |
16 | * | |
17 | * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. | |
18 | * | |
19 | * The Initial Developer of the Original Code is SciTech Software, Inc. | |
20 | * All Rights Reserved. | |
21 | * | |
22 | * ======================================================================== | |
23 | * | |
24 | * Language: ANSI C | |
25 | * Environment: Any | |
26 | * | |
27 | * Description: Module containing Unix I/O functions. | |
28 | * | |
29 | ****************************************************************************/ | |
30 | ||
31 | #include "pmapi.h" | |
32 | #include <stdio.h> | |
33 | #include <stdlib.h> | |
34 | #include <string.h> | |
35 | #include <sys/stat.h> | |
36 | #include <unistd.h> | |
37 | #include <dirent.h> | |
38 | ||
39 | /*----------------------------- Implementation ----------------------------*/ | |
40 | ||
41 | /* {secret} */ | |
42 | typedef struct { | |
43 | DIR *d; | |
44 | char path[PM_MAX_PATH]; | |
45 | char mask[PM_MAX_PATH]; | |
46 | } PM_findHandle; | |
47 | ||
48 | /**************************************************************************** | |
49 | REMARKS: | |
50 | Internal function to convert the find data to the generic interface. | |
51 | ****************************************************************************/ | |
52 | static void convertFindData( | |
53 | PM_findData *findData, | |
54 | struct dirent *blk, | |
55 | const char *path) | |
56 | { | |
57 | ulong dwSize = findData->dwSize; | |
58 | struct stat st; | |
59 | char filename[PM_MAX_PATH]; | |
60 | ||
61 | memset(findData,0,findData->dwSize); | |
62 | findData->dwSize = dwSize; | |
63 | strcpy(filename,path); | |
64 | PM_backslash(filename); | |
65 | strcat(filename,blk->d_name); | |
66 | stat(filename,&st); | |
67 | if (!(st.st_mode & S_IWRITE)) | |
8bde7f77 | 68 | findData->attrib |= PM_FILE_READONLY; |
c7de829c | 69 | if (st.st_mode & S_IFDIR) |
8bde7f77 | 70 | findData->attrib |= PM_FILE_DIRECTORY; |
c7de829c WD |
71 | findData->sizeLo = st.st_size; |
72 | findData->sizeHi = 0; | |
73 | strncpy(findData->name,blk->d_name,PM_MAX_PATH); | |
74 | findData->name[PM_MAX_PATH-1] = 0; | |
75 | } | |
76 | ||
77 | /**************************************************************************** | |
78 | REMARKS: | |
79 | Determines if a file name matches the passed in pattern. | |
80 | ****************************************************************************/ | |
81 | static ibool filematch( | |
82 | char *pattern, | |
83 | char *dirpath, | |
84 | struct dirent *dire) | |
85 | { | |
86 | struct stat st; | |
87 | int i = 0,j = 0,lastchar = '\0'; | |
88 | char fullpath[PM_MAX_PATH]; | |
89 | ||
90 | strcpy(fullpath,dirpath); | |
91 | PM_backslash(fullpath); | |
92 | strcat(fullpath, dire->d_name); | |
93 | if (stat(fullpath, &st) != 0) | |
8bde7f77 | 94 | return false; |
c7de829c | 95 | for (; i < (int)strlen(dire->d_name) && j < (int)strlen(pattern); i++, j++) { |
8bde7f77 WD |
96 | if (pattern[j] == '*' && lastchar != '\\') { |
97 | if (pattern[j+1] == '\0') | |
98 | return true; | |
99 | while (dire->d_name[i++] != pattern[j+1]) { | |
100 | if (dire->d_name[i] == '\0') | |
101 | return false; | |
102 | } | |
103 | i -= 2; | |
104 | } | |
105 | else if (dire->d_name[i] != pattern[j] && | |
106 | !(pattern[j] == '?' && lastchar != '\\')) | |
107 | return false; | |
108 | lastchar = pattern[i]; | |
109 | } | |
c7de829c | 110 | if (j == (int)strlen(pattern) && i == (int)strlen(dire->d_name)) |
8bde7f77 | 111 | return true; |
c7de829c WD |
112 | return false; |
113 | } | |
114 | ||
115 | /**************************************************************************** | |
116 | REMARKS: | |
117 | Function to find the first file matching a search criteria in a directory. | |
118 | ****************************************************************************/ | |
119 | void * PMAPI PM_findFirstFile( | |
120 | const char *filename, | |
121 | PM_findData *findData) | |
122 | { | |
123 | PM_findHandle *d; | |
124 | struct dirent *dire; | |
125 | char name[PM_MAX_PATH]; | |
126 | char ext[PM_MAX_PATH]; | |
127 | ||
128 | if ((d = PM_malloc(sizeof(*d))) == NULL) | |
8bde7f77 | 129 | return PM_FILE_INVALID; |
c7de829c WD |
130 | PM_splitpath(filename,NULL,d->path,name,ext); |
131 | strcpy(d->mask,name); | |
132 | strcat(d->mask,ext); | |
133 | if (strlen(d->path) == 0) | |
8bde7f77 | 134 | strcpy(d->path, "."); |
c7de829c | 135 | if (d->path[strlen(d->path)-1] == '/') |
8bde7f77 | 136 | d->path[strlen(d->path)-1] = 0; |
c7de829c | 137 | if ((d->d = opendir(d->path)) != NULL) { |
8bde7f77 WD |
138 | while ((dire = readdir(d->d)) != NULL) { |
139 | if (filematch(d->mask,d->path,dire)) { | |
140 | convertFindData(findData,dire,d->path); | |
141 | return d; | |
142 | } | |
143 | } | |
144 | closedir(d->d); | |
145 | } | |
c7de829c WD |
146 | PM_free(d); |
147 | return PM_FILE_INVALID; | |
148 | } | |
149 | ||
150 | /**************************************************************************** | |
151 | REMARKS: | |
152 | Function to find the next file matching a search criteria in a directory. | |
153 | ****************************************************************************/ | |
154 | ibool PMAPI PM_findNextFile( | |
155 | void *handle, | |
156 | PM_findData *findData) | |
157 | { | |
158 | PM_findHandle *d = handle; | |
159 | struct dirent *dire; | |
160 | ||
161 | while ((dire = readdir(d->d)) != NULL) { | |
8bde7f77 WD |
162 | if (filematch(d->mask,d->path,dire)) { |
163 | convertFindData(findData,dire,d->path); | |
164 | return true; | |
165 | } | |
166 | } | |
c7de829c WD |
167 | return false; |
168 | } | |
169 | ||
170 | /**************************************************************************** | |
171 | REMARKS: | |
172 | Function to close the find process | |
173 | ****************************************************************************/ | |
174 | void PMAPI PM_findClose( | |
175 | void *handle) | |
176 | { | |
177 | PM_findHandle *d = handle; | |
178 | ||
179 | closedir(d->d); | |
180 | free(d); | |
181 | } | |
182 | ||
183 | /**************************************************************************** | |
184 | REMARKS: | |
185 | Function to determine if a drive is a valid drive or not. Under Unix this | |
186 | function will return false for anything except a value of 3 (considered | |
187 | the root drive, and equivalent to C: for non-Unix systems). The drive | |
188 | numbering is: | |
189 | ||
190 | 1 - Drive A: | |
191 | 2 - Drive B: | |
192 | 3 - Drive C: | |
193 | etc | |
194 | ||
195 | ****************************************************************************/ | |
196 | ibool PMAPI PM_driveValid( | |
197 | char drive) | |
198 | { | |
199 | if (drive == 3) | |
8bde7f77 | 200 | return true; |
c7de829c WD |
201 | return false; |
202 | } | |
203 | ||
204 | /**************************************************************************** | |
205 | REMARKS: | |
206 | Function to get the current working directory for the specififed drive. | |
207 | Under Unix this will always return the current working directory regardless | |
208 | of what the value of 'drive' is. | |
209 | ****************************************************************************/ | |
210 | void PMAPI PM_getdcwd( | |
211 | int drive, | |
212 | char *dir, | |
213 | int len) | |
214 | { | |
215 | (void)drive; | |
216 | getcwd(dir,len); | |
217 | } | |
218 | ||
219 | /**************************************************************************** | |
220 | REMARKS: | |
221 | Function to change the file attributes for a specific file. | |
222 | ****************************************************************************/ | |
223 | void PMAPI PM_setFileAttr( | |
224 | const char *filename, | |
225 | uint attrib) | |
226 | { | |
227 | struct stat st; | |
228 | mode_t mode; | |
229 | ||
230 | stat(filename,&st); | |
231 | mode = st.st_mode; | |
232 | if (attrib & PM_FILE_READONLY) | |
8bde7f77 | 233 | mode &= ~S_IWRITE; |
c7de829c | 234 | else |
8bde7f77 | 235 | mode |= S_IWRITE; |
c7de829c WD |
236 | chmod(filename,mode); |
237 | } | |
238 | ||
239 | /**************************************************************************** | |
240 | REMARKS: | |
241 | Function to get the file attributes for a specific file. | |
242 | ****************************************************************************/ | |
243 | uint PMAPI PM_getFileAttr( | |
244 | const char *filename) | |
245 | { | |
246 | struct stat st; | |
247 | ||
248 | stat(filename,&st); | |
249 | if (st.st_mode & S_IWRITE) | |
8bde7f77 | 250 | return 0; |
c7de829c WD |
251 | return PM_FILE_READONLY; |
252 | } | |
253 | ||
254 | /**************************************************************************** | |
255 | REMARKS: | |
256 | Function to create a directory. | |
257 | ****************************************************************************/ | |
258 | ibool PMAPI PM_mkdir( | |
259 | const char *filename) | |
260 | { | |
261 | return mkdir(filename,0x1FF) == 0; | |
262 | } | |
263 | ||
264 | /**************************************************************************** | |
265 | REMARKS: | |
266 | Function to remove a directory. | |
267 | ****************************************************************************/ | |
268 | ibool PMAPI PM_rmdir( | |
269 | const char *filename) | |
270 | { | |
271 | return rmdir(filename) == 0; | |
272 | } | |
273 | ||
274 | /**************************************************************************** | |
275 | REMARKS: | |
276 | Function to get the file time and date for a specific file. | |
277 | ****************************************************************************/ | |
278 | ibool PMAPI PM_getFileTime( | |
279 | const char *filename, | |
280 | ibool gmTime, | |
281 | PM_time *time) | |
282 | { | |
8bde7f77 | 283 | /* TODO: Implement this! */ |
c7de829c WD |
284 | (void)filename; |
285 | (void)gmTime; | |
286 | (void)time; | |
287 | PM_fatalError("PM_getFileTime not implemented yet!"); | |
288 | return false; | |
289 | } | |
290 | ||
291 | /**************************************************************************** | |
292 | REMARKS: | |
293 | Function to set the file time and date for a specific file. | |
294 | ****************************************************************************/ | |
295 | ibool PMAPI PM_setFileTime( | |
296 | const char *filename, | |
297 | ibool gmTime, | |
298 | PM_time *time) | |
299 | { | |
8bde7f77 | 300 | /* TODO: Implement this! */ |
c7de829c WD |
301 | (void)filename; |
302 | (void)gmTime; | |
303 | (void)time; | |
304 | PM_fatalError("PM_setFileTime not implemented yet!"); | |
305 | return false; | |
306 | } |