ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/extfs_unix.cpp
Revision: 1.5
Committed: 1999-10-27T16:59:45Z (24 years, 7 months ago) by cebix
Branch: MAIN
Changes since 1.4: +159 -7 lines
Log Message:
- imported fixed UAE FPU from Lauri
- extfs.cpp: fixed bug with fsResolveWDCB in fs_get_wd_info()
- ExtFS: MAX_PATH_LENGTH is global, removed third parameter to
  add_path_component()
- rom_patches.cpp: added print_rom_info()
- Unix: added "-rominfo" command line argument
- extfs_unix.cpp: supports finder info and resource forks
- prefs_editor_gtk.cpp: tab widget is no longer scrollable

File Contents

# Content
1 /*
2 * extfs_unix.cpp - MacOS file system for access native file system access, Unix specific stuff
3 *
4 * Basilisk II (C) 1997-1999 Christian Bauer
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26 #include <dirent.h>
27 #include <errno.h>
28
29 #include "sysdeps.h"
30 #include "extfs.h"
31 #include "extfs_defs.h"
32
33 #define DEBUG 0
34 #include "debug.h"
35
36
37 // Default Finder flags
38 const uint16 DEFAULT_FINDER_FLAGS = kHasBeenInited;
39
40
41 /*
42 * Initialization
43 */
44
45 void extfs_init(void)
46 {
47 }
48
49
50 /*
51 * Deinitialization
52 */
53
54 void extfs_exit(void)
55 {
56 }
57
58
59 /*
60 * Add component to path name
61 */
62
63 void add_path_component(char *path, const char *component)
64 {
65 int l = strlen(path);
66 if (l < MAX_PATH_LENGTH-1 && path[l-1] != '/') {
67 path[l] = '/';
68 path[l+1] = 0;
69 }
70 strncat(path, component, MAX_PATH_LENGTH-1);
71 }
72
73
74 /*
75 * Finder info and resource forks are kept in helper files
76 *
77 * Finder info:
78 * /path/.finf/file
79 * Resource fork:
80 * /path/.rsrc/file
81 */
82
83 // Layout of Finder info helper files (all fields big-endian)
84 struct finf_struct {
85 uint32 type;
86 uint32 creator;
87 uint16 flags;
88 };
89
90 static void make_helper_path(const char *src, char *dest, const char *add, bool only_dir = false)
91 {
92 dest[0] = 0;
93
94 // Get pointer to last component of path
95 const char *last_part = strrchr(src, '/');
96 if (last_part)
97 last_part++;
98 else
99 last_part = src;
100
101 // Copy everything before
102 strncpy(dest, src, last_part-src);
103 dest[last_part-src] = 0;
104
105 // Add additional component
106 strncat(dest, add, MAX_PATH_LENGTH-1);
107
108 // Add last component
109 if (!only_dir)
110 strncat(dest, last_part, MAX_PATH_LENGTH-1);
111 }
112
113 static int create_helper_dir(const char *path, const char *add)
114 {
115 char helper_dir[MAX_PATH_LENGTH];
116 make_helper_path(path, helper_dir, add, true);
117 return mkdir(helper_dir, 0755);
118 }
119
120 static int open_helper(const char *path, const char *add, int flag)
121 {
122 char helper_path[MAX_PATH_LENGTH];
123 make_helper_path(path, helper_path, add);
124
125 if ((flag & O_RDWR) || (flag && O_WRONLY))
126 flag |= O_CREAT;
127 int fd = open(helper_path, flag, 0644);
128 if (fd < 0) {
129 if (errno == ENOENT && (flag & O_CREAT)) {
130 // One path component was missing, probably the helper
131 // directory. Try to create it and re-open the file.
132 int ret = create_helper_dir(path, add);
133 if (ret < 0)
134 return ret;
135 fd = open(helper_path, flag, 0644);
136 }
137 }
138 return fd;
139 }
140
141 static int open_finf(const char *path, int flag)
142 {
143 return open_helper(path, ".finf/", flag);
144 }
145
146 static int open_rsrc(const char *path, int flag)
147 {
148 return open_helper(path, ".rsrc/", flag);
149 }
150
151
152 /*
153 * Get/set finder type/creator for file specified by full path
154 */
155
156 struct ext2type {
157 const char *ext;
158 uint32 type;
159 uint32 creator;
160 };
161
162 static const ext2type e2t_translation[] = {
163 {".Z", 'ZIVM', 'LZIV'},
164 {".gz", 'Gzip', 'Gzip'},
165 {".hqx", 'TEXT', 'SITx'},
166 {".pdf", 'PDF ', 'CARO'},
167 {".ps", 'TEXT', 'ttxt'},
168 {".sit", 'SIT!', 'SITx'},
169 {".tar", 'TARF', 'TAR '},
170 {".uu", 'TEXT', 'SITx'},
171 {".uue", 'TEXT', 'SITx'},
172 {".zip", 'ZIP ', 'ZIP '},
173 {".8svx", '8SVX', 'SNDM'},
174 {".aifc", 'AIFC', 'TVOD'},
175 {".aiff", 'AIFF', 'TVOD'},
176 {".au", 'ULAW', 'TVOD'},
177 {".mid", 'MIDI', 'TVOD'},
178 {".midi", 'MIDI', 'TVOD'},
179 {".mp2", 'MPG ', 'TVOD'},
180 {".mp3", 'MPG ', 'TVOD'},
181 {".wav", 'WAVE', 'TVOD'},
182 {".bmp", 'BMPf', 'ogle'},
183 {".gif", 'GIFf', 'ogle'},
184 {".lbm", 'ILBM', 'GKON'},
185 {".ilbm", 'ILBM', 'GKON'},
186 {".jpg", 'JPEG', 'ogle'},
187 {".jpeg", 'JPEG', 'ogle'},
188 {".pict", 'PICT', 'ogle'},
189 {".png", 'PNGf', 'ogle'},
190 {".sgi", '.SGI', 'ogle'},
191 {".tga", 'TPIC', 'ogle'},
192 {".tif", 'TIFF', 'ogle'},
193 {".tiff", 'TIFF', 'ogle'},
194 {".html", 'TEXT', 'MOSS'},
195 {".txt", 'TEXT', 'ttxt'},
196 {".rtf", 'TEXT', 'MSWD'},
197 {".c", 'TEXT', 'R*ch'},
198 {".C", 'TEXT', 'R*ch'},
199 {".cc", 'TEXT', 'R*ch'},
200 {".cpp", 'TEXT', 'R*ch'},
201 {".cxx", 'TEXT', 'R*ch'},
202 {".h", 'TEXT', 'R*ch'},
203 {".hh", 'TEXT', 'R*ch'},
204 {".hpp", 'TEXT', 'R*ch'},
205 {".hxx", 'TEXT', 'R*ch'},
206 {".s", 'TEXT', 'R*ch'},
207 {".S", 'TEXT', 'R*ch'},
208 {".i", 'TEXT', 'R*ch'},
209 {".mpg", 'MPEG', 'TVOD'},
210 {".mpeg", 'MPEG', 'TVOD'},
211 {".mov", 'MooV', 'TVOD'},
212 {".fli", 'FLI ', 'TVOD'},
213 {".avi", 'VfW ', 'TVOD'},
214 {NULL, 0, 0} // End marker
215 };
216
217 void get_finder_type(const char *path, uint32 &type, uint32 &creator)
218 {
219 type = 0;
220 creator = 0;
221
222 // Open Finder info file
223 int fd = open_finf(path, O_RDONLY);
224 if (fd >= 0) {
225
226 // Read file
227 finf_struct finf;
228 if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct)) {
229
230 // Type/creator are in Finder info file, return them
231 type = ntohl(finf.type);
232 creator = ntohl(finf.creator);
233 close(fd);
234 return;
235 }
236 close(fd);
237 }
238
239 // No Finder info file, translate file name extension to MacOS type/creator
240 int path_len = strlen(path);
241 for (int i=0; e2t_translation[i].ext; i++) {
242 int ext_len = strlen(e2t_translation[i].ext);
243 if (path_len < ext_len)
244 continue;
245 if (!strcmp(path + path_len - ext_len, e2t_translation[i].ext)) {
246 type = e2t_translation[i].type;
247 creator = e2t_translation[i].creator;
248 break;
249 }
250 }
251 }
252
253 void set_finder_type(const char *path, uint32 type, uint32 creator)
254 {
255 // Open Finder info file
256 int fd = open_finf(path, O_RDWR);
257 if (fd < 0)
258 return;
259
260 // Read file
261 finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS};
262 read(fd, &finf, sizeof(finf_struct));
263
264 // Set Finder flags
265 finf.type = htonl(type);
266 finf.creator = htonl(creator);
267
268 // Update file
269 lseek(fd, 0, SEEK_SET);
270 write(fd, &finf, sizeof(finf_struct));
271 close(fd);
272 }
273
274
275 /*
276 * Get/set finder flags for file/dir specified by full path
277 */
278
279 void get_finder_flags(const char *path, uint16 &flags)
280 {
281 flags = DEFAULT_FINDER_FLAGS; // Default
282
283 // Open Finder info file
284 int fd = open_finf(path, O_RDONLY);
285 if (fd < 0)
286 return;
287
288 // Read Finder flags
289 finf_struct finf;
290 if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct))
291 flags = ntohs(finf.flags);
292
293 // Close file
294 close(fd);
295 }
296
297 void set_finder_flags(const char *path, uint16 flags)
298 {
299 // Open Finder info file
300 int fd = open_finf(path, O_RDWR);
301 if (fd < 0)
302 return;
303
304 // Read file
305 finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS};
306 read(fd, &finf, sizeof(finf_struct));
307
308 // Set Finder flags
309 finf.flags = htons(flags);
310
311 // Update file
312 lseek(fd, 0, SEEK_SET);
313 write(fd, &finf, sizeof(finf_struct));
314 close(fd);
315 }
316
317
318 /*
319 * Resource fork emulation functions
320 */
321
322 uint32 get_rfork_size(const char *path)
323 {
324 // Open resource file
325 int fd = open_rsrc(path, O_RDONLY);
326 if (fd < 0)
327 return 0;
328
329 // Get size
330 off_t size = lseek(fd, 0, SEEK_END);
331
332 // Close file and return size
333 close(fd);
334 return size < 0 ? 0 : size;
335 }
336
337 int open_rfork(const char *path, int flag)
338 {
339 return open_rsrc(path, flag);
340 }
341
342 void close_rfork(const char *path, int fd)
343 {
344 close(fd);
345 }
346
347
348 /*
349 * Read "length" bytes from file to "buffer",
350 * returns number of bytes read (or 0)
351 */
352
353 size_t extfs_read(int fd, void *buffer, size_t length)
354 {
355 errno = 0;
356 return read(fd, buffer, length);
357 }
358
359
360 /*
361 * Write "length" bytes from "buffer" to file,
362 * returns number of bytes written (or 0)
363 */
364
365 size_t extfs_write(int fd, void *buffer, size_t length)
366 {
367 errno = 0;
368 return write(fd, buffer, length);
369 }