diff --git a/BasiliskII/src/Unix/extfs_unix.cpp b/BasiliskII/src/Unix/extfs_unix.cpp index 03766241..c4f36d98 100644 --- a/BasiliskII/src/Unix/extfs_unix.cpp +++ b/BasiliskII/src/Unix/extfs_unix.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "sysdeps.h" #include "extfs.h" @@ -256,6 +257,14 @@ void get_finfo(const char *path, uint32 finfo, uint32 fxinfo, bool is_dir) 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) diff --git a/BasiliskII/src/include/macos_util.h b/BasiliskII/src/include/macos_util.h index c69e7426..d695a04e 100644 --- a/BasiliskII/src/include/macos_util.h +++ b/BasiliskII/src/include/macos_util.h @@ -265,6 +265,7 @@ extern void MountVolume(void *fh); // Mount volume with given file handle (s extern void FileDiskLayout(loff_t size, uint8 *data, loff_t &start_byte, loff_t &real_size); // Calculate disk image file layout given file size and first 256 data bytes extern uint32 DebugUtil(uint32 Selector); // DebugUtil() Replacement extern uint32 TimeToMacTime(time_t t); // Convert time_t value to MacOS time +extern time_t MacTimeToTime(uint32 t); // Convert MacOS time to time_t value // Construct four-character-code #define FOURCC(a,b,c,d) (((uint32)(a) << 24) | ((uint32)(b) << 16) | ((uint32)(c) << 8) | (uint32)(d)) diff --git a/BasiliskII/src/macos_util.cpp b/BasiliskII/src/macos_util.cpp index 97812ab0..9001d472 100644 --- a/BasiliskII/src/macos_util.cpp +++ b/BasiliskII/src/macos_util.cpp @@ -144,3 +144,13 @@ uint32 TimeToMacTime(time_t t) uint32 days = local->tm_yday + 365 * (local->tm_year - 4) + intervening_leap_days; return local->tm_sec + 60 * (local->tm_min + 60 * (local->tm_hour + 24 * days)); } + +/* + * Convert MacOS time to time_t (seconds since 1.1.1970) + */ + +time_t MacTimeToTime(uint32 t) +{ + // simply subtract number of seconds between 1.1.1094 and 1.1.1970 + return t - 2082826800; +}