diff options
Diffstat (limited to 'mac/tclMacResource.c')
-rw-r--r-- | mac/tclMacResource.c | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/mac/tclMacResource.c b/mac/tclMacResource.c index 81fe0bf..77879b4 100644 --- a/mac/tclMacResource.c +++ b/mac/tclMacResource.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclMacResource.c,v 1.3 1998/09/14 18:40:06 stanton Exp $ + * RCS: @(#) $Id: tclMacResource.c,v 1.4 1998/11/10 06:49:44 jingham Exp $ */ #include <Errors.h> @@ -1823,7 +1823,7 @@ GetRsrcRefFromObj( * managed by the procedures in this file. If the resource file * is already registered with the table, then no new token is made. * - * The bahavior is controlled by the value of tokenPtr, and of the + * The behavior is controlled by the value of tokenPtr, and of the * flags variable. For tokenPtr, the possibilities are: * - NULL: The new token is auto-generated, but not returned. * - The string value of tokenPtr is the empty string: Then @@ -1845,7 +1845,7 @@ GetRsrcRefFromObj( * Standard Tcl Result * * Side effects: - * An entry is added to the resource name table. + * An entry may be added to the resource name table. * *---------------------------------------------------------------------- */ @@ -1871,12 +1871,14 @@ TclMacRegisterResourceFork( /* * If we were asked to, check that this file has not been opened - * already. + * already with a different permission. It it has, then return an error. */ + new = 1; + if (flags & TCL_RESOURCE_CHECK_IF_OPEN) { Tcl_HashSearch search; - short oldFileRef; + short oldFileRef, filePermissionFlag; FCBPBRec newFileRec, oldFileRec; OSErr err; @@ -1890,15 +1892,17 @@ TclMacRegisterResourceFork( newFileRec.ioVRefNum = 0; newFileRec.ioRefNum = fileRef; err = PBGetFCBInfo(&newFileRec, false); + filePermissionFlag = ( newFileRec.ioFCBFlags >> 12 ) & 0x1; resourceHashPtr = Tcl_FirstHashEntry(&resourceTable, &search); while (resourceHashPtr != NULL) { - oldFileRef = (short) Tcl_GetHashKey(&resourceTable, resourceHashPtr); - - + if (oldFileRef == fileRef) { + new = 0; + break; + } oldFileRec.ioVRefNum = 0; oldFileRec.ioRefNum = oldFileRef; err = PBGetFCBInfo(&oldFileRec, false); @@ -1909,34 +1913,52 @@ TclMacRegisterResourceFork( * to fix it here, OR because it is the ROM MAP, which has a * fileRef, but can't be gotten to by PBGetFCBInfo. */ - - if ((oldFileRef == fileRef) || - ((err == noErr) + + if ((err == noErr) && (newFileRec.ioFCBVRefNum == oldFileRec.ioFCBVRefNum) - && (newFileRec.ioFCBFlNm == oldFileRec.ioFCBFlNm))) { - - resourceId = (char *) Tcl_GetHashValue(resourceHashPtr); - Tcl_SetStringObj(tokenPtr, resourceId, -1); - return TCL_OK; + && (newFileRec.ioFCBFlNm == oldFileRec.ioFCBFlNm)) { + /* In MacOS 8.1 it seems like we get different file refs even though + * we pass the same file & permissions. This is not what Inside Mac + * says should happen, but it does, so if it does, then close the new res + * file and return the original one... + */ + + if (filePermissionFlag == ((oldFileRec.ioFCBFlags >> 12) & 0x1)) { + CloseResFile(fileRef); + new = 0; + break; + } else { + if (tokenPtr != NULL) { + Tcl_SetStringObj(tokenPtr, + "Resource already open with different permissions.", -1); + } + return TCL_ERROR; + } } - resourceHashPtr = Tcl_NextHashEntry(&search); } - - } + - resourceHashPtr = Tcl_CreateHashEntry(&resourceTable, + /* + * If the file has already been opened with these same permissions, then it + * will be in our list and we will have set new to 0 above. + * So we will just return the token (if tokenPtr is non-null) + */ + + if (new) { + resourceHashPtr = Tcl_CreateHashEntry(&resourceTable, (char *) fileRef, &new); + } + if (!new) { - if (tokenPtr != NULL) { + if (tokenPtr != NULL) { resourceId = (char *) Tcl_GetHashValue(resourceHashPtr); - Tcl_SetStringObj(tokenPtr, resourceId, -1); + Tcl_SetStringObj(tokenPtr, resourceId, -1); } - return TCL_OK; - } - - + return TCL_OK; + } + /* * If we were passed in a result pointer which is not an empty * string, attempt to use that as the key. If the key already |