1063 |
|
// D(bug(" fs_get_vol_parms(%08lx)\n", pb)); |
1064 |
|
|
1065 |
|
// Return parameter block |
1066 |
– |
uint8 vol[SIZEOF_GetVolParmsInfoBuffer]; |
1067 |
– |
WriteMacInt16((uint32)vol + vMVersion, 2); |
1068 |
– |
WriteMacInt32((uint32)vol + vMAttrib, kNoMiniFndr | kNoVNEdit | kNoLclSync | kTrshOffLine | kNoSwitchTo | kNoBootBlks | kNoSysDir | kHasExtFSVol); |
1069 |
– |
WriteMacInt32((uint32)vol + vMLocalHand, 0); |
1070 |
– |
WriteMacInt32((uint32)vol + vMServerAdr, 0); |
1071 |
– |
WriteMacInt32((uint32)vol + vMVolumeGrade, 0); |
1072 |
– |
WriteMacInt16((uint32)vol + vMForeignPrivID, 0); |
1066 |
|
uint32 actual = ReadMacInt32(pb + ioReqCount); |
1067 |
< |
if (actual > sizeof(vol)) |
1068 |
< |
actual = sizeof(vol); |
1076 |
< |
Host2Mac_memcpy(ReadMacInt32(pb + ioBuffer), vol, actual); |
1067 |
> |
if (actual > SIZEOF_GetVolParmsInfoBuffer) |
1068 |
> |
actual = SIZEOF_GetVolParmsInfoBuffer; |
1069 |
|
WriteMacInt32(pb + ioActCount, actual); |
1070 |
+ |
uint32 p = ReadMacInt32(pb + ioBuffer); |
1071 |
+ |
if (actual > vMVersion) WriteMacInt16(p + vMVersion, 2); |
1072 |
+ |
if (actual > vMAttrib) WriteMacInt32(p + vMAttrib, kNoMiniFndr | kNoVNEdit | kNoLclSync | kTrshOffLine | kNoSwitchTo | kNoBootBlks | kNoSysDir | kHasExtFSVol); |
1073 |
+ |
if (actual > vMLocalHand) WriteMacInt32(p + vMLocalHand, 0); |
1074 |
+ |
if (actual > vMServerAdr) WriteMacInt32(p + vMServerAdr, 0); |
1075 |
+ |
if (actual > vMVolumeGrade) WriteMacInt32(p + vMVolumeGrade, 0); |
1076 |
+ |
if (actual > vMForeignPrivID) WriteMacInt16(p + vMForeignPrivID, 0); |
1077 |
|
return noErr; |
1078 |
|
} |
1079 |
|
|
1474 |
|
return fnfErr; |
1475 |
|
fd = open_rfork(full_path, flag); |
1476 |
|
if (fd > 0) { |
1477 |
< |
if (fstat(fd, &st) < 0) |
1477 |
> |
if (fstat(fd, &st) < 0) { |
1478 |
> |
close(fd); |
1479 |
|
return errno2oserr(); |
1480 |
+ |
} |
1481 |
|
} else { // Resource fork not supported, silently ignore it ("pseudo" resource fork) |
1482 |
|
st.st_size = 0; |
1483 |
|
st.st_mode = 0; |
1486 |
|
fd = open(full_path, flag); |
1487 |
|
if (fd < 0) |
1488 |
|
return errno2oserr(); |
1489 |
< |
if (fstat(fd, &st) < 0) |
1489 |
> |
if (fstat(fd, &st) < 0) { |
1490 |
> |
close(fd); |
1491 |
|
return errno2oserr(); |
1492 |
+ |
} |
1493 |
|
} |
1494 |
|
|
1495 |
|
// File open, allocate FCB |
1512 |
|
WriteMacInt32(fcb + fcbCrPs, 0); |
1513 |
|
WriteMacInt32(fcb + fcbVPtr, vcb); |
1514 |
|
WriteMacInt32(fcb + fcbClmpSize, 1024); |
1515 |
< |
uint32 type, creator; // fcb may point to kernel space, but stack is switched |
1515 |
> |
uint32 type, creator; // BeOS: fcb may point to kernel space, but stack is switched |
1516 |
|
get_finder_type(full_path, type, creator); |
1517 |
|
WriteMacInt32(fcb + fcbFType, type); |
1518 |
|
WriteMacInt32(fcb + fcbCatPos, fd); |
1901 |
|
return result; |
1902 |
|
|
1903 |
|
// Delete file |
1904 |
< |
if (remove(full_path) < 0) { |
1905 |
< |
int16 err = errno2oserr(); |
1906 |
< |
if (errno == EISDIR) { // Workaround for BeOS bug |
1904 |
< |
if (rmdir(full_path) < 0) |
1905 |
< |
return errno2oserr(); |
1906 |
< |
else |
1907 |
< |
return noErr; |
1908 |
< |
} else |
1909 |
< |
return err; |
1910 |
< |
} else |
1904 |
> |
if (!extfs_remove(full_path)) |
1905 |
> |
return errno2oserr(); |
1906 |
> |
else |
1907 |
|
return noErr; |
1908 |
|
} |
1909 |
|
|
1936 |
|
|
1937 |
|
// Rename item |
1938 |
|
D(bug(" renaming %s -> %s\n", old_path, full_path)); |
1939 |
< |
if (rename(old_path, full_path) < 0) |
1939 |
> |
if (!extfs_rename(old_path, full_path)) |
1940 |
|
return errno2oserr(); |
1941 |
|
else { |
1942 |
|
// The ID of the old file/dir has to stay the same, so we swap the IDs of the FSItems |
1979 |
|
|
1980 |
|
// Move item |
1981 |
|
D(bug(" moving %s -> %s\n", old_path, full_path)); |
1982 |
< |
if (rename(old_path, full_path) < 0) |
1982 |
> |
if (!extfs_rename(old_path, full_path)) |
1983 |
|
return errno2oserr(); |
1984 |
|
else { |
1985 |
|
// The ID of the old file/dir has to stay the same, so we swap the IDs of the FSItems |