void get_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir) { // 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); // Read Finder info file int fd = open_finf(path, O_RDONLY); if (fd >= 0) { 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 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_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; // Write file write(fd, Mac2HostAddr(finfo), SIZEOF_FInfo); if (fxinfo) write(fd, Mac2HostAddr(fxinfo), SIZEOF_FXInfo); close(fd); }
void set_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir) { struct utimbuf times; times.actime = MacTimeToTime(ReadMacInt32(finfo - ioFlFndrInfo + ioFlCrDat)); times.modtime = MacTimeToTime(ReadMacInt32(finfo - ioFlFndrInfo + ioFlMdDat)); if (utime(path, ×) < 0) { D(bug("utime failed on %s\n", path)); } // Open Finder info file int fd = open_finf(path, O_RDWR); if (fd < 0) return; // Write file write(fd, Mac2HostAddr(finfo), SIZEOF_FInfo); if (fxinfo) write(fd, Mac2HostAddr(fxinfo), SIZEOF_FXInfo); close(fd); }