/** * Convert host VFS object mode flags into guest ones. * * @param fHostMode Host flags * * @return Guest flags */ mode_t vboxvfs_h2g_mode_inernal(RTFMODE fHostMode) { mode_t fGuestMode = 0; fGuestMode = /* Owner */ ((fHostMode & RTFS_UNIX_IRUSR) ? S_IRUSR : 0 ) | ((fHostMode & RTFS_UNIX_IWUSR) ? S_IWUSR : 0 ) | ((fHostMode & RTFS_UNIX_IXUSR) ? S_IXUSR : 0 ) | /* Group */ ((fHostMode & RTFS_UNIX_IRGRP) ? S_IRGRP : 0 ) | ((fHostMode & RTFS_UNIX_IWGRP) ? S_IWGRP : 0 ) | ((fHostMode & RTFS_UNIX_IXGRP) ? S_IXGRP : 0 ) | /* Other */ ((fHostMode & RTFS_UNIX_IROTH) ? S_IROTH : 0 ) | ((fHostMode & RTFS_UNIX_IWOTH) ? S_IWOTH : 0 ) | ((fHostMode & RTFS_UNIX_IXOTH) ? S_IXOTH : 0 ) | /* SUID, SGID, SVTXT */ ((fHostMode & RTFS_UNIX_ISUID) ? S_ISUID : 0 ) | ((fHostMode & RTFS_UNIX_ISGID) ? S_ISGID : 0 ) | ((fHostMode & RTFS_UNIX_ISTXT) ? S_ISVTX : 0 ) | /* VFS object types */ ((RTFS_IS_FIFO(fHostMode)) ? S_IFIFO : 0 ) | ((RTFS_IS_DEV_CHAR(fHostMode)) ? S_IFCHR : 0 ) | ((RTFS_IS_DIRECTORY(fHostMode)) ? S_IFDIR : 0 ) | ((RTFS_IS_DEV_BLOCK(fHostMode)) ? S_IFBLK : 0 ) | ((RTFS_IS_FILE(fHostMode)) ? S_IFREG : 0 ) | ((RTFS_IS_SYMLINK(fHostMode)) ? S_IFLNK : 0 ) | ((RTFS_IS_SOCKET(fHostMode)) ? S_IFSOCK : 0 ); return fGuestMode; }
RTDECL(int) RTDirQueryUnknownTypeEx(const char *pszComposedName, bool fFollowSymlinks, RTDIRENTRYTYPE *penmType, PRTFSOBJINFO pObjInfo) { int rc = RTPathQueryInfoEx(pszComposedName, pObjInfo, RTFSOBJATTRADD_NOTHING, fFollowSymlinks ? RTPATH_F_FOLLOW_LINK : RTPATH_F_ON_LINK); if (RT_FAILURE(rc)) return rc; if (RTFS_IS_DIRECTORY(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_DIRECTORY; else if (RTFS_IS_FILE(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_FILE; else if (RTFS_IS_SYMLINK(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_SYMLINK; else if (RTFS_IS_FIFO(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_FIFO; else if (RTFS_IS_DEV_CHAR(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_DEV_CHAR; else if (RTFS_IS_DEV_BLOCK(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_DEV_BLOCK; else if (RTFS_IS_SOCKET(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_SOCKET; else if (RTFS_IS_WHITEOUT(pObjInfo->Attr.fMode)) *penmType = RTDIRENTRYTYPE_WHITEOUT; else *penmType = RTDIRENTRYTYPE_UNKNOWN; return VINF_SUCCESS; }
/** * Check whether a device node points to a valid device and create a UDI and * a description for it, and store the device number, if it does. * @returns true if the device is valid, false otherwise * @param pcszNode the path to the device node * @param isDVD are we looking for a DVD device (or a floppy device)? * @param pDevice where to store the device node (optional) * @param pszDesc where to store the device description (optional) * @param cchDesc the size of the buffer in @a pszDesc * @param pszUdi where to store the device UDI (optional) * @param cchUdi the size of the buffer in @a pszUdi */ static bool devValidateDevice(const char *pcszNode, bool isDVD, dev_t *pDevice, char *pszDesc, size_t cchDesc, char *pszUdi, size_t cchUdi) { AssertPtrReturn(pcszNode, false); AssertPtrNullReturn(pDevice, false); AssertPtrNullReturn(pszDesc, false); AssertReturn(!pszDesc || cchDesc > 0, false); AssertPtrNullReturn(pszUdi, false); AssertReturn(!pszUdi || cchUdi > 0, false); RTFSOBJINFO ObjInfo; if (RT_FAILURE(RTPathQueryInfo(pcszNode, &ObjInfo, RTFSOBJATTRADD_UNIX))) return false; if (!RTFS_IS_DEV_BLOCK(ObjInfo.Attr.fMode)) return false; if (pDevice) *pDevice = ObjInfo.Attr.u.Unix.Device; if (isDVD) { char szVendor[128], szModel[128]; uint8_t u8Type; if (!isCdromDevNum(ObjInfo.Attr.u.Unix.Device)) return false; if (RT_FAILURE(cdromDoInquiry(pcszNode, &u8Type, szVendor, sizeof(szVendor), szModel, sizeof(szModel)))) return false; if (u8Type != TYPE_ROM) return false; dvdCreateDeviceStrings(szVendor, szModel, pszDesc, cchDesc, pszUdi, cchUdi); } else { /* Floppies on Linux are legacy devices with hardcoded majors and * minors */ unsigned Number; floppy_drive_name szName; if (major(ObjInfo.Attr.u.Unix.Device) != FLOPPY_MAJOR) return false; switch (minor(ObjInfo.Attr.u.Unix.Device)) { case 0: case 1: case 2: case 3: Number = minor(ObjInfo.Attr.u.Unix.Device); break; case 128: case 129: case 130: case 131: Number = minor(ObjInfo.Attr.u.Unix.Device) - 128 + 4; break; default: return false; } if (!floppyGetName(pcszNode, Number, szName)) return false; floppyCreateDeviceStrings(szName, Number, pszDesc, cchDesc, pszUdi, cchUdi); } return true; }