--- BasiliskII/src/extfs.cpp 1999/11/08 17:00:04 1.12 +++ BasiliskII/src/extfs.cpp 1999/12/22 16:16:09 1.15 @@ -223,6 +223,23 @@ static void get_path_for_fsitem(FSItem * /* + * Exchange parent CNIDs in all FSItems + */ + +static void swap_parent_ids(uint32 parent1, uint32 parent2) +{ + FSItem *p = first_fs_item; + while (p) { + if (p->parent_id == parent1) + p->parent_id = parent2; + else if (p->parent_id == parent2) + p->parent_id = parent1; + p = p->next; + } +} + + +/* * String handling functions */ @@ -1063,18 +1080,17 @@ static int16 fs_get_vol_parms(uint32 pb) // D(bug(" fs_get_vol_parms(%08lx)\n", pb)); // Return parameter block - uint8 vol[SIZEOF_GetVolParmsInfoBuffer]; - WriteMacInt16((uint32)vol + vMVersion, 2); - WriteMacInt32((uint32)vol + vMAttrib, kNoMiniFndr | kNoVNEdit | kNoLclSync | kTrshOffLine | kNoSwitchTo | kNoBootBlks | kNoSysDir | kHasExtFSVol); - WriteMacInt32((uint32)vol + vMLocalHand, 0); - WriteMacInt32((uint32)vol + vMServerAdr, 0); - WriteMacInt32((uint32)vol + vMVolumeGrade, 0); - WriteMacInt16((uint32)vol + vMForeignPrivID, 0); uint32 actual = ReadMacInt32(pb + ioReqCount); - if (actual > sizeof(vol)) - actual = sizeof(vol); - Host2Mac_memcpy(ReadMacInt32(pb + ioBuffer), vol, actual); + if (actual > SIZEOF_GetVolParmsInfoBuffer) + actual = SIZEOF_GetVolParmsInfoBuffer; WriteMacInt32(pb + ioActCount, actual); + uint32 p = ReadMacInt32(pb + ioBuffer); + if (actual > vMVersion) WriteMacInt16(p + vMVersion, 2); + if (actual > vMAttrib) WriteMacInt32(p + vMAttrib, kNoMiniFndr | kNoVNEdit | kNoLclSync | kTrshOffLine | kNoSwitchTo | kNoBootBlks | kNoSysDir | kHasExtFSVol); + if (actual > vMLocalHand) WriteMacInt32(p + vMLocalHand, 0); + if (actual > vMServerAdr) WriteMacInt32(p + vMServerAdr, 0); + if (actual > vMVolumeGrade) WriteMacInt32(p + vMVolumeGrade, 0); + if (actual > vMForeignPrivID) WriteMacInt16(p + vMForeignPrivID, 0); return noErr; } @@ -1475,8 +1491,10 @@ static int16 fs_open(uint32 pb, uint32 d return fnfErr; fd = open_rfork(full_path, flag); if (fd > 0) { - if (fstat(fd, &st) < 0) + if (fstat(fd, &st) < 0) { + close(fd); return errno2oserr(); + } } else { // Resource fork not supported, silently ignore it ("pseudo" resource fork) st.st_size = 0; st.st_mode = 0; @@ -1485,8 +1503,10 @@ static int16 fs_open(uint32 pb, uint32 d fd = open(full_path, flag); if (fd < 0) return errno2oserr(); - if (fstat(fd, &st) < 0) + if (fstat(fd, &st) < 0) { + close(fd); return errno2oserr(); + } } // File open, allocate FCB @@ -1509,7 +1529,7 @@ static int16 fs_open(uint32 pb, uint32 d WriteMacInt32(fcb + fcbCrPs, 0); WriteMacInt32(fcb + fcbVPtr, vcb); WriteMacInt32(fcb + fcbClmpSize, 1024); - uint32 type, creator; // fcb may point to kernel space, but stack is switched + uint32 type, creator; // BeOS: fcb may point to kernel space, but stack is switched get_finder_type(full_path, type, creator); WriteMacInt32(fcb + fcbFType, type); WriteMacInt32(fcb + fcbCatPos, fd); @@ -1775,15 +1795,15 @@ static int16 fs_read(uint32 pb) } // Read - size_t actual = extfs_read(fd, Mac2HostAddr(ReadMacInt32(pb + ioBuffer)), ReadMacInt32(pb + ioReqCount)); + ssize_t actual = extfs_read(fd, Mac2HostAddr(ReadMacInt32(pb + ioBuffer)), ReadMacInt32(pb + ioReqCount)); int16 read_err = errno2oserr(); D(bug(" actual %d\n", actual)); - WriteMacInt32(pb + ioActCount, actual); + WriteMacInt32(pb + ioActCount, actual >= 0 ? actual : 0); uint32 pos = lseek(fd, 0, SEEK_CUR); WriteMacInt32(fcb + fcbCrPs, pos); WriteMacInt32(pb + ioPosOffset, pos); if (actual != ReadMacInt32(pb + ioReqCount)) - return read_err ? read_err : eofErr; + return actual < 0 ? read_err : eofErr; else return noErr; } @@ -1824,10 +1844,10 @@ static int16 fs_write(uint32 pb) } // Write - size_t actual = extfs_write(fd, Mac2HostAddr(ReadMacInt32(pb + ioBuffer)), ReadMacInt32(pb + ioReqCount)); + ssize_t actual = extfs_write(fd, Mac2HostAddr(ReadMacInt32(pb + ioBuffer)), ReadMacInt32(pb + ioReqCount)); int16 write_err = errno2oserr(); D(bug(" actual %d\n", actual)); - WriteMacInt32(pb + ioActCount, actual); + WriteMacInt32(pb + ioActCount, actual >= 0 ? actual : 0); uint32 pos = lseek(fd, 0, SEEK_CUR); WriteMacInt32(fcb + fcbCrPs, pos); WriteMacInt32(pb + ioPosOffset, pos); @@ -1933,10 +1953,11 @@ static int16 fs_rename(uint32 pb, uint32 // Rename item D(bug(" renaming %s -> %s\n", old_path, full_path)); - if (rename(old_path, full_path) < 0) + if (!extfs_rename(old_path, full_path)) return errno2oserr(); else { // The ID of the old file/dir has to stay the same, so we swap the IDs of the FSItems + swap_parent_ids(fs_item->id, new_item->id); uint32 t = fs_item->id; fs_item->id = new_item->id; new_item->id = t; @@ -1976,12 +1997,13 @@ static int16 fs_cat_move(uint32 pb) // Move item D(bug(" moving %s -> %s\n", old_path, full_path)); - if (rename(old_path, full_path) < 0) + if (!extfs_rename(old_path, full_path)) return errno2oserr(); else { // The ID of the old file/dir has to stay the same, so we swap the IDs of the FSItems FSItem *new_item = find_fsitem(fs_item->name, new_dir_item); if (new_item) { + swap_parent_ids(fs_item->id, new_item->id); uint32 t = fs_item->id; fs_item->id = new_item->id; new_item->id = t;