--- BasiliskII/src/Unix/extfs_unix.cpp 1999/11/08 18:06:00 1.9 +++ BasiliskII/src/Unix/extfs_unix.cpp 2007/01/24 02:37:06 1.22 @@ -1,7 +1,7 @@ /* * extfs_unix.cpp - MacOS file system for access native file system access, Unix specific stuff * - * Basilisk II (C) 1997-1999 Christian Bauer + * Basilisk II (C) 1997-2005 Christian Bauer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -78,16 +78,11 @@ void add_path_component(char *path, cons * /path/.finf/file * Resource fork: * /path/.rsrc/file + * + * The .finf files store a FInfo/DInfo, followed by a FXInfo/DXInfo + * (16+16 bytes) */ -// Layout of Finder info helper files (all fields big-endian) -struct finf_struct { - uint32 type; - uint32 creator; - uint16 flags; - uint16 pad0; -}; - static void make_helper_path(const char *src, char *dest, const char *add, bool only_dir = false) { dest[0] = 0; @@ -115,6 +110,8 @@ static int create_helper_dir(const char { char helper_dir[MAX_PATH_LENGTH]; make_helper_path(path, helper_dir, add, true); + if (helper_dir[strlen(helper_dir) - 1] == '/') // Remove trailing "/" + helper_dir[strlen(helper_dir) - 1] = 0; return mkdir(helper_dir, 0777); } @@ -151,7 +148,7 @@ static int open_rsrc(const char *path, i /* - * Get/set finder type/creator for file specified by full path + * Get/set finder info for file/directory specified by full path */ struct ext2type { @@ -161,157 +158,113 @@ struct ext2type { }; static const ext2type e2t_translation[] = { - {".Z", 'ZIVM', 'LZIV'}, - {".gz", 'Gzip', 'Gzip'}, - {".hqx", 'TEXT', 'SITx'}, - {".pdf", 'PDF ', 'CARO'}, - {".ps", 'TEXT', 'ttxt'}, - {".sit", 'SIT!', 'SITx'}, - {".tar", 'TARF', 'TAR '}, - {".uu", 'TEXT', 'SITx'}, - {".uue", 'TEXT', 'SITx'}, - {".zip", 'ZIP ', 'ZIP '}, - {".8svx", '8SVX', 'SNDM'}, - {".aifc", 'AIFC', 'TVOD'}, - {".aiff", 'AIFF', 'TVOD'}, - {".au", 'ULAW', 'TVOD'}, - {".mid", 'MIDI', 'TVOD'}, - {".midi", 'MIDI', 'TVOD'}, - {".mp2", 'MPG ', 'TVOD'}, - {".mp3", 'MPG ', 'TVOD'}, - {".wav", 'WAVE', 'TVOD'}, - {".bmp", 'BMPf', 'ogle'}, - {".gif", 'GIFf', 'ogle'}, - {".lbm", 'ILBM', 'GKON'}, - {".ilbm", 'ILBM', 'GKON'}, - {".jpg", 'JPEG', 'ogle'}, - {".jpeg", 'JPEG', 'ogle'}, - {".pict", 'PICT', 'ogle'}, - {".png", 'PNGf', 'ogle'}, - {".sgi", '.SGI', 'ogle'}, - {".tga", 'TPIC', 'ogle'}, - {".tif", 'TIFF', 'ogle'}, - {".tiff", 'TIFF', 'ogle'}, - {".html", 'TEXT', 'MOSS'}, - {".txt", 'TEXT', 'ttxt'}, - {".rtf", 'TEXT', 'MSWD'}, - {".c", 'TEXT', 'R*ch'}, - {".C", 'TEXT', 'R*ch'}, - {".cc", 'TEXT', 'R*ch'}, - {".cpp", 'TEXT', 'R*ch'}, - {".cxx", 'TEXT', 'R*ch'}, - {".h", 'TEXT', 'R*ch'}, - {".hh", 'TEXT', 'R*ch'}, - {".hpp", 'TEXT', 'R*ch'}, - {".hxx", 'TEXT', 'R*ch'}, - {".s", 'TEXT', 'R*ch'}, - {".S", 'TEXT', 'R*ch'}, - {".i", 'TEXT', 'R*ch'}, - {".mpg", 'MPEG', 'TVOD'}, - {".mpeg", 'MPEG', 'TVOD'}, - {".mov", 'MooV', 'TVOD'}, - {".fli", 'FLI ', 'TVOD'}, - {".avi", 'VfW ', 'TVOD'}, + {".Z", FOURCC('Z','I','V','M'), FOURCC('L','Z','I','V')}, + {".gz", FOURCC('G','z','i','p'), FOURCC('G','z','i','p')}, + {".hqx", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')}, + {".bin", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')}, + {".pdf", FOURCC('P','D','F',' '), FOURCC('C','A','R','O')}, + {".ps", FOURCC('T','E','X','T'), FOURCC('t','t','x','t')}, + {".sit", FOURCC('S','I','T','!'), FOURCC('S','I','T','x')}, + {".tar", FOURCC('T','A','R','F'), FOURCC('T','A','R',' ')}, + {".uu", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')}, + {".uue", FOURCC('T','E','X','T'), FOURCC('S','I','T','x')}, + {".zip", FOURCC('Z','I','P',' '), FOURCC('Z','I','P',' ')}, + {".8svx", FOURCC('8','S','V','X'), FOURCC('S','N','D','M')}, + {".aifc", FOURCC('A','I','F','C'), FOURCC('T','V','O','D')}, + {".aiff", FOURCC('A','I','F','F'), FOURCC('T','V','O','D')}, + {".au", FOURCC('U','L','A','W'), FOURCC('T','V','O','D')}, + {".mid", FOURCC('M','I','D','I'), FOURCC('T','V','O','D')}, + {".midi", FOURCC('M','I','D','I'), FOURCC('T','V','O','D')}, + {".mp2", FOURCC('M','P','G',' '), FOURCC('T','V','O','D')}, + {".mp3", FOURCC('M','P','G',' '), FOURCC('T','V','O','D')}, + {".wav", FOURCC('W','A','V','E'), FOURCC('T','V','O','D')}, + {".bmp", FOURCC('B','M','P','f'), FOURCC('o','g','l','e')}, + {".gif", FOURCC('G','I','F','f'), FOURCC('o','g','l','e')}, + {".lbm", FOURCC('I','L','B','M'), FOURCC('G','K','O','N')}, + {".ilbm", FOURCC('I','L','B','M'), FOURCC('G','K','O','N')}, + {".jpg", FOURCC('J','P','E','G'), FOURCC('o','g','l','e')}, + {".jpeg", FOURCC('J','P','E','G'), FOURCC('o','g','l','e')}, + {".pict", FOURCC('P','I','C','T'), FOURCC('o','g','l','e')}, + {".png", FOURCC('P','N','G','f'), FOURCC('o','g','l','e')}, + {".sgi", FOURCC('.','S','G','I'), FOURCC('o','g','l','e')}, + {".tga", FOURCC('T','P','I','C'), FOURCC('o','g','l','e')}, + {".tif", FOURCC('T','I','F','F'), FOURCC('o','g','l','e')}, + {".tiff", FOURCC('T','I','F','F'), FOURCC('o','g','l','e')}, + {".htm", FOURCC('T','E','X','T'), FOURCC('M','O','S','S')}, + {".html", FOURCC('T','E','X','T'), FOURCC('M','O','S','S')}, + {".txt", FOURCC('T','E','X','T'), FOURCC('t','t','x','t')}, + {".rtf", FOURCC('T','E','X','T'), FOURCC('M','S','W','D')}, + {".c", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".C", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".cc", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".cpp", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".cxx", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".h", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".hh", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".hpp", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".hxx", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".s", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".S", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".i", FOURCC('T','E','X','T'), FOURCC('R','*','c','h')}, + {".mpg", FOURCC('M','P','E','G'), FOURCC('T','V','O','D')}, + {".mpeg", FOURCC('M','P','E','G'), FOURCC('T','V','O','D')}, + {".mov", FOURCC('M','o','o','V'), FOURCC('T','V','O','D')}, + {".fli", FOURCC('F','L','I',' '), FOURCC('T','V','O','D')}, + {".avi", FOURCC('V','f','W',' '), FOURCC('T','V','O','D')}, + {".qxd", FOURCC('X','D','O','C'), FOURCC('X','P','R','3')}, + {".hfv", FOURCC('D','D','i','m'), FOURCC('d','d','s','k')}, + {".dsk", FOURCC('D','D','i','m'), FOURCC('d','d','s','k')}, + {".img", FOURCC('r','o','h','d'), FOURCC('d','d','s','k')}, {NULL, 0, 0} // End marker }; -void get_finder_type(const char *path, uint32 &type, uint32 &creator) +void get_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir) { - type = 0; - creator = 0; + // Set default finder info + Mac_memset(finfo, 0, SIZEOF_FInfo); + if (fxinfo) + Mac_memset(fxinfo, 0, SIZEOF_FXInfo); + WriteMacInt16(finfo + fdFlags, DEFAULT_FINDER_FLAGS); + WriteMacInt32(finfo + fdLocation, (uint32)-1); - // Open Finder info file + // Read Finder info file int fd = open_finf(path, O_RDONLY); if (fd >= 0) { - - // Read file - finf_struct finf; - if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct)) { - - // Type/creator are in Finder info file, return them - type = ntohl(finf.type); - creator = ntohl(finf.creator); - close(fd); - return; - } + ssize_t actual = read(fd, Mac2HostAddr(finfo), SIZEOF_FInfo); + if (fxinfo) + actual += read(fd, Mac2HostAddr(fxinfo), SIZEOF_FXInfo); close(fd); + if (actual >= SIZEOF_FInfo) + return; } // No Finder info file, translate file name extension to MacOS type/creator - int path_len = strlen(path); - for (int i=0; e2t_translation[i].ext; i++) { - int ext_len = strlen(e2t_translation[i].ext); - if (path_len < ext_len) - continue; - if (!strcmp(path + path_len - ext_len, e2t_translation[i].ext)) { - type = e2t_translation[i].type; - creator = e2t_translation[i].creator; - break; + if (!is_dir) { + int path_len = strlen(path); + for (int i=0; e2t_translation[i].ext; i++) { + int ext_len = strlen(e2t_translation[i].ext); + if (path_len < ext_len) + continue; + if (!strcmp(path + path_len - ext_len, e2t_translation[i].ext)) { + WriteMacInt32(finfo + fdType, e2t_translation[i].type); + WriteMacInt32(finfo + fdCreator, e2t_translation[i].creator); + break; + } } } } -void set_finder_type(const char *path, uint32 type, uint32 creator) +void set_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir) { // Open Finder info file int fd = open_finf(path, O_RDWR); if (fd < 0) return; - // Read file - finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS, 0}; - read(fd, &finf, sizeof(finf_struct)); - - // Set Finder flags - finf.type = htonl(type); - finf.creator = htonl(creator); - - // Update file - lseek(fd, 0, SEEK_SET); - write(fd, &finf, sizeof(finf_struct)); - close(fd); -} - - -/* - * Get/set finder flags for file/dir specified by full path - */ - -void get_finder_flags(const char *path, uint16 &flags) -{ - flags = DEFAULT_FINDER_FLAGS; // Default - - // Open Finder info file - int fd = open_finf(path, O_RDONLY); - if (fd < 0) - return; - - // Read Finder flags - finf_struct finf; - if (read(fd, &finf, sizeof(finf_struct)) == sizeof(finf_struct)) - flags = ntohs(finf.flags); - - // Close file - close(fd); -} - -void set_finder_flags(const char *path, uint16 flags) -{ - // Open Finder info file - int fd = open_finf(path, O_RDWR); - if (fd < 0) - return; - - // Read file - finf_struct finf = {0, 0, DEFAULT_FINDER_FLAGS, 0}; - read(fd, &finf, sizeof(finf_struct)); - - // Set Finder flags - finf.flags = htons(flags); - - // Update file - lseek(fd, 0, SEEK_SET); - write(fd, &finf, sizeof(finf_struct)); + // Write file + write(fd, Mac2HostAddr(finfo), SIZEOF_FInfo); + if (fxinfo) + write(fd, Mac2HostAddr(fxinfo), SIZEOF_FXInfo); close(fd); } @@ -348,24 +301,22 @@ void close_rfork(const char *path, int f /* * Read "length" bytes from file to "buffer", - * returns number of bytes read (or 0) + * returns number of bytes read (or -1 on error) */ -size_t extfs_read(int fd, void *buffer, size_t length) +ssize_t extfs_read(int fd, void *buffer, size_t length) { - errno = 0; return read(fd, buffer, length); } /* * Write "length" bytes from "buffer" to file, - * returns number of bytes written (or 0) + * returns number of bytes written (or -1 on error) */ -size_t extfs_write(int fd, void *buffer, size_t length) +ssize_t extfs_write(int fd, void *buffer, size_t length) { - errno = 0; return write(fd, buffer, length); } @@ -424,3 +375,18 @@ bool extfs_rename(const char *old_path, // Now rename file return rename(old_path, new_path) == 0; } + + +// Convert from the host OS filename encoding to MacRoman +const char *host_encoding_to_macroman(const char *filename) +{ + return filename; +} + +// Convert from MacRoman to host OS filename encoding +const char *macroman_to_host_encoding(const char *filename) +{ + return filename; +} + +