From 3398ed425c80894a4e0bd53babd86ac5b25a2a08 Mon Sep 17 00:00:00 2001 From: Dietrich Epp Date: Sat, 6 May 2023 14:03:13 -0400 Subject: [PATCH] Use paths for volumes without file ID support This fixes an issue where remote folders on the Basilisk II "Unix" volume would not resolve correctly after a system restart. --- SyncFiles CW4.mcp | Bin 341489 -> 322973 bytes macos/project.c | 44 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/SyncFiles CW4.mcp b/SyncFiles CW4.mcp index 5c714c1139971da1553ba45e5303297bc900476a..21fb0c874d75cc7ce2caca7176331680a9dbd761 100644 GIT binary patch delta 6135 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 VMajCx9>^7{{z9Uuh{?q diff --git a/macos/project.c b/macos/project.c index 2175dfe..666a379 100644 --- a/macos/project.c +++ b/macos/project.c @@ -38,7 +38,9 @@ uint32 chunk crc32 Chunks: (names zero-padded) "LOCA" local directory alias +"LOCP" local directory path "REMA" destination directory alias +"REMP" destination directory path Chunks are aligned to 16 byte boundaries, and the file is padded to a 16 byte boundary. This is just to make it easier to read hexdumps. @@ -183,7 +185,7 @@ static void ProjectClose(WindowRef window, ProjectHandle project) DisposeHandle((Handle)project); } -#define kChunkCount 2 +#define kChunkCount 4 #define ALIGN(x) (((x) + 15) & ~(UInt32)15) @@ -218,6 +220,7 @@ static OSErr ProjectWriteHeader(short refNum, int nchunks, } static const UInt32 kProjectAliasChunks[2] = {'LOCA', 'REMA'}; +static const UInt32 kProjectPathChunks[2] = {'LOCP', 'REMP'}; static OSErr ProjectFlush(short refNum) { @@ -250,6 +253,12 @@ static OSErr ProjectWriteContent(ProjectHandle project, short refNum) ckInfo[nchunks].id = kProjectAliasChunks[i]; nchunks++; } + h = (*project)->dirs[i].path; + if (h != NULL) { + ckData[nchunks] = h; + ckInfo[nchunks].id = kProjectPathChunks[i]; + nchunks++; + } } // Calculate chunk offsets. @@ -543,6 +552,28 @@ void ProjectActivate(WindowRef window, ProjectHandle project, int isActive) } } +// VolumeDoesSupportIDs returns true if the volume supports file IDs. If the +// volume does not support file IDs, then we fall back to using paths to refer +// to project directories. This applies to the Basilisk II "Unix" volume. If you +// try to resolve an alias to a file on the Basilisk II "Unix" volume, you may +// get a different file than intended, because the directory IDs are not stable. +static Boolean VolumeDoesSupportIDs(short vRefNum) +{ + HParamBlockRec hb; + GetVolParmsInfoBuffer parms; + OSErr err; + + memset(&hb, 0, sizeof(hb)); + hb.ioParam.ioVRefNum = vRefNum; + hb.ioParam.ioBuffer = (Ptr)&parms; + hb.ioParam.ioReqCount = sizeof(parms); + err = PBHGetVolParms(&hb, false); + if (err != noErr) { + ExitErrorOS(kErrUnknown, err); + } + return (parms.vMAttrib & (1ul << bHasFileIDs)) != 0; +} + static void ProjectChooseDir(WindowRef window, ProjectHandle project, int whichDir) { @@ -557,13 +588,16 @@ static void ProjectChooseDir(WindowRef window, ProjectHandle project, if (!ChooseDirectory(&directory)) { return; } - err = NewAlias(NULL, &directory, &alias); - if (err != noErr) { - ExitErrorOS(kErrUnknown, err); + if (VolumeDoesSupportIDs(directory.vRefNum)) { + err = NewAlias(NULL, &directory, &alias); + if (err != noErr) { + ExitErrorOS(kErrUnknown, err); + } + } else { + alias = NULL; } err = GetDirPath(&directory, &pathLength, &path); if (err != noErr) { - DisposeHandle((Handle)alias); ExitErrorOS(kErrUnknown, err); } projectp = *project;