int fsdb_set_file_attrs (a_inode *aino) { uae_u32 tmpmask; uae_u8 fsdb[UAEFSDB2_LEN]; uae_u32 mode; tmpmask = filesys_parse_mask (aino->amigaos_mode); mode = GetFileAttributesSafe (aino->nname); if (mode == INVALID_FILE_ATTRIBUTES) return ERROR_OBJECT_NOT_AROUND; mode &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; mode = 0; if ((tmpmask & (A_FIBF_WRITE | A_FIBF_DELETE)) == 0) mode |= FILE_ATTRIBUTE_READONLY; if (!(tmpmask & A_FIBF_ARCHIVE)) mode |= FILE_ATTRIBUTE_ARCHIVE; if (tmpmask & A_FIBF_PURE) mode |= FILE_ATTRIBUTE_SYSTEM; if (tmpmask & A_FIBF_HIDDEN) mode |= FILE_ATTRIBUTE_HIDDEN; SetFileAttributesSafe (aino->nname, mode); aino->dirty = 1; if (aino->volflags & MYVOLUMEINFO_STREAMS) { if (needs_fsdb (aino)) { create_uaefsdb (aino, fsdb, mode); write_uaefsdb (aino->nname, fsdb); } else { delete_uaefsdb (aino->nname); } } return 0; }
/****************************************************************** * fsdb_fill_file_attrs * * For an a_inode we have newly created based on a filename we * found on the native fs, fill in information about this * file/directory. * ******************************************************************/ int fsdb_fill_file_attrs (a_inode *base, a_inode *aino) { struct FileInfoBlock *fib=NULL; BPTR lock=NULL; int ret=0; //DebOut("%lx %lx\n", base, aino); //DebOut("aino->dir: %s\n", aino->dir); DebOut("aino->nname: %s\n", aino->nname); fib = (struct FileInfoBlock *)AllocDosObject(DOS_FIB, TAG_END); if(!fib) goto ERROR; lock=Lock(aino->nname, SHARED_LOCK); if(!lock) goto ERROR; if (!Examine(lock, fib)) goto ERROR; if(fib->fib_DirEntryType>0) { //DebOut("=> directory\n"); aino->dir=1; if(fib->fib_DirEntryType==ST_SOFTLINK) { DebOut("WARNING: not tested: SoftLink detected!\n"); aino->softlink=2; /* 1 hardlink, 2 softlink ? */ } } if(fib->fib_Comment) { //DebOut("comment: >%s<\n", fib->fib_Comment); aino->comment=(TCHAR *) strndup((const char *)fib->fib_Comment, 79); /* maximum length is 79 chars, 0 will be added automatically */ } aino->amigaos_mode=fib->fib_Protection; //DebOut("protection: %04x\n", fib->fib_Protection); /* !? */ #if 0 if (reset && (base->volflags & MYVOLUMEINFO_STREAMS)) { create_uaefsdb (aino, fsdb, mode); write_uaefsdb (aino->nname, fsdb); } #endif ret=1; #warning TODO?: care for base and host changes! ERROR: if(fib) FreeDosObject(DOS_FIB, fib); if(lock) UnLock(lock); return ret; }
/* For an a_inode we have newly created based on a filename we found on the * native fs, fill in information about this file/directory. */ int fsdb_fill_file_attrs (a_inode *base, a_inode *aino) { int mode, winmode, oldamode; uae_u8 fsdb[UAEFSDB2_LEN]; int reset = 0; if((mode = GetFileAttributesSafe (aino->nname)) == INVALID_FILE_ATTRIBUTES) { write_log (_T("GetFileAttributes('%s') failed! error=%d, aino=%p dir=%d\n"), aino->nname, GetLastError(), aino, aino->dir); return 0; } aino->dir = (mode & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0; mode &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; if ((base->volflags & MYVOLUMEINFO_STREAMS) && read_uaefsdb (aino->nname, NULL, fsdb)) { aino->amigaos_mode = do_get_mem_long ((uae_u32 *)(fsdb + 1)); xfree (aino->comment); aino->comment = NULL; if (fsdb[5 + 2 * 257]) aino->comment = my_strdup_ansi ((char*)fsdb + 5 + 2 * 257); xfree (aino_from_buf (base, fsdb, &winmode)); if (winmode == mode) /* no Windows-side editing? */ return 1; write_log (_T("FS: '%s' protection flags edited from Windows-side\n"), aino->nname); reset = 1; /* edited from Windows-side -> use Windows side flags instead */ } oldamode = aino->amigaos_mode; aino->amigaos_mode = A_FIBF_EXECUTE | A_FIBF_READ; if (!(FILE_ATTRIBUTE_ARCHIVE & mode)) aino->amigaos_mode |= A_FIBF_ARCHIVE; if (!(FILE_ATTRIBUTE_READONLY & mode)) aino->amigaos_mode |= A_FIBF_WRITE | A_FIBF_DELETE; if (FILE_ATTRIBUTE_SYSTEM & mode) aino->amigaos_mode |= A_FIBF_PURE; if (FILE_ATTRIBUTE_HIDDEN & mode) aino->amigaos_mode |= A_FIBF_HIDDEN; aino->amigaos_mode = filesys_parse_mask(aino->amigaos_mode); aino->amigaos_mode |= oldamode & A_FIBF_SCRIPT; if (reset && (base->volflags & MYVOLUMEINFO_STREAMS)) { create_uaefsdb (aino, fsdb, mode); write_uaefsdb (aino->nname, fsdb); } return 1; }