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

Comparing BasiliskII/src/Unix/extfs_unix.cpp (file contents):
Revision 1.8 by cebix, 1999-11-08T17:00:13Z vs.
Revision 1.12 by cebix, 2000-04-10T18:53:02Z

# Line 1 | Line 1
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
4 > *  Basilisk II (C) 1997-2000 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 85 | Line 85 | struct finf_struct {
85          uint32 type;
86          uint32 creator;
87          uint16 flags;
88 <        uint16 pad0;
88 >        uint8 pad0[22]; // total size: 32 bytes to match the size of FInfo+FXInfo
89   };
90  
91   static void make_helper_path(const char *src, char *dest, const char *add, bool only_dir = false)
# Line 226 | Line 226 | void get_finder_type(const char *path, u
226  
227                  // Read file
228                  finf_struct finf;
229 <                if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct)) {
229 >                if (read(fd, &finf, sizeof(finf_struct)) >= 8) {
230  
231                          // Type/creator are in Finder info file, return them
232                          type = ntohl(finf.type);
# Line 259 | Line 259 | void set_finder_type(const char *path, u
259                  return;
260  
261          // Read file
262 <        finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS, 0};
262 >        finf_struct finf;
263 >        finf.flags = DEFAULT_FINDER_FLAGS;
264 >        memset(&finf, 0, sizeof(finf_struct));
265          read(fd, &finf, sizeof(finf_struct));
266  
267          // Set Finder flags
# Line 288 | Line 290 | void get_finder_flags(const char *path,
290  
291          // Read Finder flags
292          finf_struct finf;
293 <        if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct))
293 >        if (read(fd, &finf, sizeof(finf_struct)) >= 10)
294                  flags = ntohs(finf.flags);
295  
296          // Close file
# Line 303 | Line 305 | void set_finder_flags(const char *path,
305                  return;
306  
307          // Read file
308 <        finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS, 0};
308 >        finf_struct finf;
309 >        memset(&finf, 0, sizeof(finf_struct));
310 >        finf.flags = DEFAULT_FINDER_FLAGS;
311          read(fd, &finf, sizeof(finf_struct));
312  
313          // Set Finder flags
# Line 348 | Line 352 | void close_rfork(const char *path, int f
352  
353   /*
354   *  Read "length" bytes from file to "buffer",
355 < *  returns number of bytes read (or 0)
355 > *  returns number of bytes read (or -1 on error)
356   */
357  
358 < size_t extfs_read(int fd, void *buffer, size_t length)
358 > ssize_t extfs_read(int fd, void *buffer, size_t length)
359   {
356        errno = 0;
360          return read(fd, buffer, length);
361   }
362  
363  
364   /*
365   *  Write "length" bytes from "buffer" to file,
366 < *  returns number of bytes written (or 0)
366 > *  returns number of bytes written (or -1 on error)
367   */
368  
369 < size_t extfs_write(int fd, void *buffer, size_t length)
369 > ssize_t extfs_write(int fd, void *buffer, size_t length)
370   {
368        errno = 0;
371          return write(fd, buffer, length);
372   }
373  
# Line 384 | Line 386 | bool extfs_remove(const char *path)
386          make_helper_path(path, helper_path, ".rsrc/", false);
387          remove(helper_path);
388  
389 <        // Now remove file or directory
389 >        // Now remove file or directory (and helper directories in the directory)
390          if (remove(path) < 0) {
391 <                if (errno == EISDIR)
391 >                if (errno == EISDIR || errno == ENOTEMPTY) {
392 >                        helper_path[0] = 0;
393 >                        strncpy(helper_path, path, MAX_PATH_LENGTH-1);
394 >                        add_path_component(helper_path, ".finf");
395 >                        rmdir(helper_path);
396 >                        helper_path[0] = 0;
397 >                        strncpy(helper_path, path, MAX_PATH_LENGTH-1);
398 >                        add_path_component(helper_path, ".rsrc");
399 >                        rmdir(helper_path);
400                          return rmdir(path) == 0;
401 <                else
401 >                } else
402                          return false;
403          }
404          return true;
405   }
406 +
407 +
408 + /*
409 + *  Rename/move file/directory (and associated helper files),
410 + *  returns false on error (and sets errno)
411 + */
412 +
413 + bool extfs_rename(const char *old_path, const char *new_path)
414 + {
415 +        // Rename helpers first, don't complain if this fails
416 +        char old_helper_path[MAX_PATH_LENGTH], new_helper_path[MAX_PATH_LENGTH];
417 +        make_helper_path(old_path, old_helper_path, ".finf/", false);
418 +        make_helper_path(new_path, new_helper_path, ".finf/", false);
419 +        create_helper_dir(new_path, ".finf/");
420 +        rename(old_helper_path, new_helper_path);
421 +        make_helper_path(old_path, old_helper_path, ".rsrc/", false);
422 +        make_helper_path(new_path, new_helper_path, ".rsrc/", false);
423 +        create_helper_dir(new_path, ".rsrc/");
424 +        rename(old_helper_path, new_helper_path);
425 +
426 +        // Now rename file
427 +        return rename(old_path, new_path) == 0;
428 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines