ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/AmigaOS/extfs_amiga.cpp
(Generate patch)

Comparing BasiliskII/src/AmigaOS/extfs_amiga.cpp (file contents):
Revision 1.1 by cebix, 1999-11-01T16:24:09Z vs.
Revision 1.13 by cebix, 2002-01-15T14:58:34Z

# Line 1 | Line 1
1   /*
2   *  extfs_amiga.cpp - MacOS file system for access native file system access, AmigaOS specific stuff
3   *
4 < *  Basilisk II (C) 1997-1999 Christian Bauer
4 > *  Basilisk II (C) 1997-2002 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
# Line 77 | Line 77 | void add_path_component(char *path, cons
77   *    /path/.finf/file
78   *  Resource fork:
79   *    /path/.rsrc/file
80 + *
81 + *  The .finf files store a FInfo/DInfo, followed by a FXInfo/DXInfo
82 + *  (16+16 bytes)
83   */
84  
82 // Layout of Finder info helper files (all fields big-endian)
83 struct finf_struct {
84        uint32 type;
85        uint32 creator;
86        uint16 flags;
87        uint16 pad0;
88 };
89
85   static void make_helper_path(const char *src, char *dest, const char *add, bool only_dir = false)
86   {
87          dest[0] = 0;
# Line 110 | Line 105 | static int create_helper_dir(const char
105   {
106          char helper_dir[MAX_PATH_LENGTH];
107          make_helper_path(path, helper_dir, add, true);
108 +        if (helper_dir[strlen(helper_dir) - 1] == '/')  // Remove trailing "/"
109 +                helper_dir[strlen(helper_dir) - 1] = 0;
110          return mkdir(helper_dir, 0777);
111   }
112  
# Line 118 | Line 115 | static int open_helper(const char *path,
115          char helper_path[MAX_PATH_LENGTH];
116          make_helper_path(path, helper_path, add);
117  
118 <        if ((flag & O_RDWR) || (flag && O_WRONLY))
118 >        if ((flag & O_ACCMODE) == O_RDWR || (flag & O_ACCMODE) == O_WRONLY)
119                  flag |= O_CREAT;
120          int fd = open(helper_path, flag, 0666);
121          if (fd < 0) {
# Line 156 | Line 153 | struct ext2type {
153   };
154  
155   static const ext2type e2t_translation[] = {
156 <        {".Z", 'ZIVM', 'LZIV'},
157 <        {".gz", 'Gzip', 'Gzip'},
158 <        {".hqx", 'TEXT', 'SITx'},
159 <        {".pdf", 'PDF ', 'CARO'},
160 <        {".ps", 'TEXT', 'ttxt'},
161 <        {".sit", 'SIT!', 'SITx'},
162 <        {".tar", 'TARF', 'TAR '},
163 <        {".uu", 'TEXT', 'SITx'},
164 <        {".uue", 'TEXT', 'SITx'},
165 <        {".zip", 'ZIP ', 'ZIP '},
166 <        {".8svx", '8SVX', 'SNDM'},
167 <        {".aifc", 'AIFC', 'TVOD'},
168 <        {".aiff", 'AIFF', 'TVOD'},
169 <        {".au", 'ULAW', 'TVOD'},
170 <        {".mid", 'MIDI', 'TVOD'},
171 <        {".midi", 'MIDI', 'TVOD'},
172 <        {".mp2", 'MPG ', 'TVOD'},
173 <        {".mp3", 'MPG ', 'TVOD'},
174 <        {".wav", 'WAVE', 'TVOD'},
175 <        {".bmp", 'BMPf', 'ogle'},
176 <        {".gif", 'GIFf', 'ogle'},
177 <        {".lbm", 'ILBM', 'GKON'},
178 <        {".ilbm", 'ILBM', 'GKON'},
179 <        {".jpg", 'JPEG', 'ogle'},
180 <        {".jpeg", 'JPEG', 'ogle'},
181 <        {".pict", 'PICT', 'ogle'},
182 <        {".png", 'PNGf', 'ogle'},
183 <        {".sgi", '.SGI', 'ogle'},
184 <        {".tga", 'TPIC', 'ogle'},
185 <        {".tif", 'TIFF', 'ogle'},
186 <        {".tiff", 'TIFF', 'ogle'},
187 <        {".html", 'TEXT', 'MOSS'},
188 <        {".txt", 'TEXT', 'ttxt'},
189 <        {".rtf", 'TEXT', 'MSWD'},
190 <        {".c", 'TEXT', 'R*ch'},
191 <        {".C", 'TEXT', 'R*ch'},
192 <        {".cc", 'TEXT', 'R*ch'},
193 <        {".cpp", 'TEXT', 'R*ch'},
194 <        {".cxx", 'TEXT', 'R*ch'},
195 <        {".h", 'TEXT', 'R*ch'},
196 <        {".hh", 'TEXT', 'R*ch'},
197 <        {".hpp", 'TEXT', 'R*ch'},
198 <        {".hxx", 'TEXT', 'R*ch'},
199 <        {".s", 'TEXT', 'R*ch'},
200 <        {".S", 'TEXT', 'R*ch'},
201 <        {".i", 'TEXT', 'R*ch'},
202 <        {".mpg", 'MPEG', 'TVOD'},
203 <        {".mpeg", 'MPEG', 'TVOD'},
204 <        {".mov", 'MooV', 'TVOD'},
205 <        {".fli", 'FLI ', 'TVOD'},
206 <        {".avi", 'VfW ', 'TVOD'},
156 >        {".z", FOURCC('Z','I','V','M'), FOURCC('L','Z','I','V')},
157 >        {".gz", FOURCC('G','z','i','p'), FOURCC('G','z','i','p')},
158 >        {".hqx", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')},
159 >        {".bin", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')},
160 >        {".pdf", FOURCC('P','D','F',' '), FOURCC('C','A','R','O')},
161 >        {".ps", FOURCC('T','E','X','T'), FOURCC('t','t','x','t')},
162 >        {".sit", FOURCC('S','I','T','!'), FOURCC('S','I','T','x')},
163 >        {".tar", FOURCC('T','A','R','F'), FOURCC('T','A','R',' ')},
164 >        {".uu", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')},
165 >        {".uue", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')},
166 >        {".zip", FOURCC('Z','I','P',' '), FOURCC('Z','I','P',' ')},
167 >        {".8svx", FOURCC('8','S','V','X'), FOURCC('S','N','D','M')},
168 >        {".aifc", FOURCC('A','I','F','C'), FOURCC('T','V','O','D')},
169 >        {".aiff", FOURCC('A','I','F','F'), FOURCC('T','V','O','D')},
170 >        {".au", FOURCC('U','L','A','W'), FOURCC('T','V','O','D')},
171 >        {".mid", FOURCC('M','I','D','I'), FOURCC('T','V','O','D')},
172 >        {".midi", FOURCC('M','I','D','I'), FOURCC('T','V','O','D')},
173 >        {".mp2", FOURCC('M','P','G',' '), FOURCC('T','V','O','D')},
174 >        {".mp3", FOURCC('M','P','G',' '), FOURCC('T','V','O','D')},
175 >        {".wav", FOURCC('W','A','V','E'), FOURCC('T','V','O','D')},
176 >        {".bmp", FOURCC('B','M','P','f'), FOURCC('o','g','l','e')},
177 >        {".gif", FOURCC('G','I','F','f'), FOURCC('o','g','l','e')},
178 >        {".lbm", FOURCC('I','L','B','M'), FOURCC('G','K','O','N')},
179 >        {".ilbm", FOURCC('I','L','B','M'), FOURCC('G','K','O','N')},
180 >        {".jpg", FOURCC('J','P','E','G'), FOURCC('o','g','l','e')},
181 >        {".jpeg", FOURCC('J','P','E','G'), FOURCC('o','g','l','e')},
182 >        {".pict", FOURCC('P','I','C','T'), FOURCC('o','g','l','e')},
183 >        {".png", FOURCC('P','N','G','f'), FOURCC('o','g','l','e')},
184 >        {".sgi", FOURCC('.','S','G','I'), FOURCC('o','g','l','e')},
185 >        {".tga", FOURCC('T','P','I','C'), FOURCC('o','g','l','e')},
186 >        {".tif", FOURCC('T','I','F','F'), FOURCC('o','g','l','e')},
187 >        {".tiff", FOURCC('T','I','F','F'), FOURCC('o','g','l','e')},
188 >        {".htm", FOURCC('T','E','X','T'), FOURCC('M','O','S','S')},
189 >        {".html", FOURCC('T','E','X','T'), FOURCC('M','O','S','S')},
190 >        {".txt", FOURCC('T','E','X','T'), FOURCC('t','t','x','t')},
191 >        {".rtf", FOURCC('T','E','X','T'), FOURCC('M','S','W','D')},
192 >        {".c", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
193 >        {".cc", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
194 >        {".cpp", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
195 >        {".cxx", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
196 >        {".h", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
197 >        {".hh", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
198 >        {".hpp", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
199 >        {".hxx", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
200 >        {".s", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
201 >        {".i", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')},
202 >        {".mpg", FOURCC('M','P','E','G'), FOURCC('T','V','O','D')},
203 >        {".mpeg", FOURCC('M','P','E','G'), FOURCC('T','V','O','D')},
204 >        {".mov", FOURCC('M','o','o','V'), FOURCC('T','V','O','D')},
205 >        {".fli", FOURCC('F','L','I',' '), FOURCC('T','V','O','D')},
206 >        {".avi", FOURCC('V','f','W',' '), FOURCC('T','V','O','D')},
207 >        {".qxd", FOURCC('X','D','O','C'), FOURCC('X','P','R','3')},
208 >        {".hfv", FOURCC('D','D','i','m'), FOURCC('d','d','s','k')},
209 >        {".dsk", FOURCC('D','D','i','m'), FOURCC('d','d','s','k')},
210 >        {".img", FOURCC('r','o','h','d'), FOURCC('d','d','s','k')},
211          {NULL, 0, 0}    // End marker
212   };
213  
214 < void get_finder_type(const char *path, uint32 &type, uint32 &creator)
214 > void get_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir)
215   {
216 <        type = 0;
217 <        creator = 0;
216 >        // Set default finder info
217 >        Mac_memset(finfo, 0, SIZEOF_FInfo);
218 >        if (fxinfo)
219 >                Mac_memset(fxinfo, 0, SIZEOF_FXInfo);
220 >        WriteMacInt16(finfo + fdFlags, DEFAULT_FINDER_FLAGS);
221 >        WriteMacInt32(finfo + fdLocation, (uint32)-1);
222  
223 <        // Open Finder info file
223 >        // Read Finder info file
224          int fd = open_finf(path, O_RDONLY);
225          if (fd >= 0) {
226 <
227 <                // Read file
228 <                finf_struct finf;
224 <                if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct)) {
225 <
226 <                        // Type/creator are in Finder info file, return them
227 <                        type = ntohl(finf.type);
228 <                        creator = ntohl(finf.creator);
229 <                        close(fd);
230 <                        return;
231 <                }
226 >                ssize_t actual = read(fd, Mac2HostAddr(finfo), SIZEOF_FInfo);
227 >                if (fxinfo)
228 >                        actual += read(fd, Mac2HostAddr(fxinfo), SIZEOF_FXInfo);
229                  close(fd);
230 +                if (actual >= SIZEOF_FInfo)
231 +                        return;
232          }
233  
234          // No Finder info file, translate file name extension to MacOS type/creator
235 <        int path_len = strlen(path);
236 <        for (int i=0; e2t_translation[i].ext; i++) {
237 <                int ext_len = strlen(e2t_translation[i].ext);
238 <                if (path_len < ext_len)
239 <                        continue;
240 <                if (!strcmp(path + path_len - ext_len, e2t_translation[i].ext)) {
241 <                        type = e2t_translation[i].type;
242 <                        creator = e2t_translation[i].creator;
243 <                        break;
235 >        if (!is_dir) {
236 >                int path_len = strlen(path);
237 >                for (int i=0; e2t_translation[i].ext; i++) {
238 >                        int ext_len = strlen(e2t_translation[i].ext);
239 >                        if (path_len < ext_len)
240 >                                continue;
241 >                        if (!strcasecmp(path + path_len - ext_len, e2t_translation[i].ext)) {
242 >                                WriteMacInt32(finfo + fdType, e2t_translation[i].type);
243 >                                WriteMacInt32(finfo + fdCreator, e2t_translation[i].creator);
244 >                                break;
245 >                        }
246                  }
247          }
248   }
249  
250 < void set_finder_type(const char *path, uint32 type, uint32 creator)
250 > void set_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir)
251   {
252          // Open Finder info file
253          int fd = open_finf(path, O_RDWR);
254          if (fd < 0)
255                  return;
256  
257 <        // Read file
258 <        finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS, 0};
259 <        read(fd, &finf, sizeof(finf_struct));
260 <
260 <        // Set Finder flags
261 <        finf.type = htonl(type);
262 <        finf.creator = htonl(creator);
263 <
264 <        // Update file
265 <        lseek(fd, 0, SEEK_SET);
266 <        write(fd, &finf, sizeof(finf_struct));
267 <        close(fd);
268 < }
269 <
270 <
271 < /*
272 < *  Get/set finder flags for file/dir specified by full path
273 < */
274 <
275 < void get_finder_flags(const char *path, uint16 &flags)
276 < {
277 <        flags = DEFAULT_FINDER_FLAGS;   // Default
278 <
279 <        // Open Finder info file
280 <        int fd = open_finf(path, O_RDONLY);
281 <        if (fd < 0)
282 <                return;
283 <
284 <        // Read Finder flags
285 <        finf_struct finf;
286 <        if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct))
287 <                flags = ntohs(finf.flags);
288 <
289 <        // Close file
290 <        close(fd);
291 < }
292 <
293 < void set_finder_flags(const char *path, uint16 flags)
294 < {
295 <        // Open Finder info file
296 <        int fd = open_finf(path, O_RDWR);
297 <        if (fd < 0)
298 <                return;
299 <
300 <        // Read file
301 <        finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS, 0};
302 <        read(fd, &finf, sizeof(finf_struct));
303 <
304 <        // Set Finder flags
305 <        finf.flags = htons(flags);
306 <
307 <        // Update file
308 <        lseek(fd, 0, SEEK_SET);
309 <        write(fd, &finf, sizeof(finf_struct));
257 >        // Write file
258 >        write(fd, Mac2HostAddr(finfo), SIZEOF_FInfo);
259 >        if (fxinfo)
260 >                write(fd, Mac2HostAddr(fxinfo), SIZEOF_FXInfo);
261          close(fd);
262   }
263  
# Line 343 | Line 294 | void close_rfork(const char *path, int f
294  
295   /*
296   *  Read "length" bytes from file to "buffer",
297 < *  returns number of bytes read (or 0)
297 > *  returns number of bytes read (or -1 on error)
298   */
299  
300 < size_t extfs_read(int fd, void *buffer, size_t length)
300 > ssize_t extfs_read(int fd, void *buffer, size_t length)
301   {
351        errno = 0;
302          return read(fd, buffer, length);
303   }
304  
305  
306   /*
307   *  Write "length" bytes from "buffer" to file,
308 < *  returns number of bytes written (or 0)
308 > *  returns number of bytes written (or -1 on error)
309   */
310  
311 < size_t extfs_write(int fd, void *buffer, size_t length)
311 > ssize_t extfs_write(int fd, void *buffer, size_t length)
312   {
363        errno = 0;
313          return write(fd, buffer, length);
314   }
315  
316  
317 + /*
318 + *  Remove file/directory (and associated helper files),
319 + *  returns false on error (and sets errno)
320 + */
321 +
322 + bool extfs_remove(const char *path)
323 + {
324 +        // Remove helpers first, don't complain if this fails
325 +        char helper_path[MAX_PATH_LENGTH];
326 +        make_helper_path(path, helper_path, ".finf/", false);
327 +        remove(helper_path);
328 +        make_helper_path(path, helper_path, ".rsrc/", false);
329 +        remove(helper_path);
330 +
331 +        // Now remove file or directory (and helper directories in the directory)
332 +        if (remove(path) < 0) {
333 +                if (errno == EISDIR || errno == ENOTEMPTY) {
334 +                        helper_path[0] = 0;
335 +                        strncpy(helper_path, path, MAX_PATH_LENGTH-1);
336 +                        add_path_component(helper_path, ".finf");
337 +                        rmdir(helper_path);
338 +                        helper_path[0] = 0;
339 +                        strncpy(helper_path, path, MAX_PATH_LENGTH-1);
340 +                        add_path_component(helper_path, ".rsrc");
341 +                        rmdir(helper_path);
342 +                        return rmdir(path) == 0;
343 +                } else
344 +                        return false;
345 +        }
346 +        return true;
347 + }
348 +
349 +
350 + /*
351 + *  Rename/move file/directory (and associated helper files),
352 + *  returns false on error (and sets errno)
353 + */
354 +
355 + bool extfs_rename(const char *old_path, const char *new_path)
356 + {
357 +        // Rename helpers first, don't complain if this fails
358 +        char old_helper_path[MAX_PATH_LENGTH], new_helper_path[MAX_PATH_LENGTH];
359 +        make_helper_path(old_path, old_helper_path, ".finf/", false);
360 +        make_helper_path(new_path, new_helper_path, ".finf/", false);
361 +        create_helper_dir(new_path, ".finf/");
362 +        rename(old_helper_path, new_helper_path);
363 +        make_helper_path(old_path, old_helper_path, ".rsrc/", false);
364 +        make_helper_path(new_path, new_helper_path, ".rsrc/", false);
365 +        create_helper_dir(new_path, ".rsrc/");
366 +        rename(old_helper_path, new_helper_path);
367 +
368 +        // Now rename file
369 +        return rename(old_path, new_path) == 0;
370 + }
371 +
372 +
373   /*
374   *  ftruncate() is missing from libnix
375   */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines