diff -urN uae-0.8.29-orig/src/fsdb_unix.c uae-0.8.29/src/fsdb_unix.c --- uae-0.8.29-orig/src/fsdb_unix.c 2001-02-26 00:21:48 +0900 +++ uae-0.8.29/src/fsdb_unix.c 2009-06-21 11:56:51 +0900 @@ -36,7 +36,11 @@ aino->dir = S_ISDIR (statbuf.st_mode) ? 1 : 0; aino->amigaos_mode = ((S_IXUSR & statbuf.st_mode ? 0 : A_FIBF_EXECUTE) | (S_IWUSR & statbuf.st_mode ? 0 : A_FIBF_WRITE) - | (S_IRUSR & statbuf.st_mode ? 0 : A_FIBF_READ)); + | (S_IRUSR & statbuf.st_mode ? 0 : A_FIBF_READ) + | (S_ISGID & statbuf.st_mode ? A_FIBF_DELETE : 0) + | (S_ISVTX & statbuf.st_mode ? A_FIBF_PURE : 0) + | (S_ISUID & statbuf.st_mode ? A_FIBF_SCRIPT : 0)); + } int fsdb_set_file_attrs (a_inode *aino, int mask) @@ -65,6 +69,21 @@ else mode |= S_IXUSR; + if (mask & A_FIBF_DELETE) + mode |= S_ISGID; + else + mode &= ~S_ISGID; + + if (mask & A_FIBF_PURE) + mode |= S_ISVTX; + else + mode &= ~S_ISVTX; + + if (mask & A_FIBF_SCRIPT) + mode |= S_ISUID; + else + mode &= ~S_ISUID; + chmod (aino->nname, mode); } @@ -79,7 +98,7 @@ { if (aino->dir) return aino->amigaos_mode == 0; - return (aino->amigaos_mode & (A_FIBF_DELETE | A_FIBF_SCRIPT | A_FIBF_PURE)) == 0; + return 1; } char *fsdb_create_unique_nname (a_inode *base, const char *suggestion)