fs.cpp revision 631bd6ab7342e103c759410bc10d2750b433bbb9
a23fd118e437af0a7877dd313db8fdaa3537c675yl * innotek Portable Runtime - File System.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Copyright (C) 2006-2007 innotek GmbH
a23fd118e437af0a7877dd313db8fdaa3537c675yl * This file is part of VirtualBox Open Source Edition (OSE), as
a23fd118e437af0a7877dd313db8fdaa3537c675yl * available from http://www.virtualbox.org. This file is free software;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * you can redistribute it and/or modify it under the terms of the GNU
a23fd118e437af0a7877dd313db8fdaa3537c675yl * General Public License as published by the Free Software Foundation,
a23fd118e437af0a7877dd313db8fdaa3537c675yl * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
a23fd118e437af0a7877dd313db8fdaa3537c675yl * distribution. VirtualBox OSE is distributed in the hope that it will
a23fd118e437af0a7877dd313db8fdaa3537c675yl * be useful, but WITHOUT ANY WARRANTY of any kind.
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*******************************************************************************
a23fd118e437af0a7877dd313db8fdaa3537c675yl* Header Files *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl*******************************************************************************/
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Converts dos-style attributes to Unix attributes.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @returns
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param fMode The mode mask containing dos-style attibutes only.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param pszName The filename which this applies to (exe check).
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param cbName The length of that filename. (optional, set 0)
8347601bcb0a439f6e50fc36b4039a73d08700e1ylRTFMODE rtFsModeFromDos(RTFMODE fMode, const char *pszName, unsigned cbName)
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* everything is readable. */
a23fd118e437af0a7877dd313db8fdaa3537c675yl fMode |= RTFS_UNIX_IRUSR | RTFS_UNIX_IRGRP | RTFS_UNIX_IROTH;
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* directories are executable. */
a23fd118e437af0a7877dd313db8fdaa3537c675yl fMode |= RTFS_TYPE_DIRECTORY | RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH;
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* check for executable extension. */
a23fd118e437af0a7877dd313db8fdaa3537c675yl fMode |= RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH;
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* writable? */
a23fd118e437af0a7877dd313db8fdaa3537c675yl fMode |= RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Converts Unix attributes to Dos-style attributes.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @returns
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param fMode The mode mask containing dos-style attibutes only.
a23fd118e437af0a7877dd313db8fdaa3537c675ylRTFMODE rtFsModeFromUnix(RTFMODE fMode, const char *pszName, unsigned cbName)
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (!(fMode & (RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH)))
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Converts dos-style attributes to Unix attributes.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @returns Normalized file mode.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param fMode The mode mask containing dos-style attibutes only.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param pszName The filename which this applies to (exe check).
8347601bcb0a439f6e50fc36b4039a73d08700e1yl * @param cbName The length of that filename. (optional, set 0)
8347601bcb0a439f6e50fc36b4039a73d08700e1ylRTFMODE rtFsModeNormalize(RTFMODE fMode, const char *pszName, unsigned cbName)
a23fd118e437af0a7877dd313db8fdaa3537c675yl fMode |= fMode & RTFS_DOS_DIRECTORY ? RTFS_TYPE_DIRECTORY : RTFS_TYPE_FILE;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Checks if the file mode is valid or not.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @return true if valid.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @return false if invalid, done bitching.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param fMode The file mode.
a23fd118e437af0a7877dd313db8fdaa3537c675yl AssertMsgReturn( (!RTFS_IS_DIRECTORY(fMode) && !(fMode & RTFS_DOS_DIRECTORY))
a23fd118e437af0a7877dd313db8fdaa3537c675yl || (RTFS_IS_DIRECTORY(fMode) && (fMode & RTFS_DOS_DIRECTORY)),
a23fd118e437af0a7877dd313db8fdaa3537c675yl /** @todo more checks! */
a23fd118e437af0a7877dd313db8fdaa3537c675yl return true;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Checks if the file mode is valid as a permission mask or not.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @return true if valid.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @return false if invalid, done bitching.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param fMode The file mode.
a23fd118e437af0a7877dd313db8fdaa3537c675yl AssertMsgReturn( (!RTFS_IS_DIRECTORY(fMode) && !(fMode & RTFS_DOS_DIRECTORY))
a23fd118e437af0a7877dd313db8fdaa3537c675yl || (RTFS_IS_DIRECTORY(fMode) && (fMode & RTFS_DOS_DIRECTORY)),
a23fd118e437af0a7877dd313db8fdaa3537c675yl /** @todo more checks! */
a23fd118e437af0a7877dd313db8fdaa3537c675yl return true;
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Internal worker function which setups RTFSOBJINFO based on a UNIX stat struct.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param pObjInfo The file system object info structure to setup.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @param pStat The stat structure to use.
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid rtFsConvertStatToObjInfo(PRTFSOBJINFO pObjInfo, const struct stat *pStat, const char *pszName, unsigned cbName)
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecAddNano(RTTimeSpecSetSeconds(&pObjInfo->AccessTime, pStat->st_atime), pStat->st_atimensec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecAddNano(RTTimeSpecSetSeconds(&pObjInfo->ModificationTime, pStat->st_mtime), pStat->st_mtimensec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecAddNano(RTTimeSpecSetSeconds(&pObjInfo->ChangeTime, pStat->st_ctime), pStat->st_ctimensec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecAddNano(RTTimeSpecSetSeconds(&pObjInfo->BirthTime, pStat->st_birthtime), pStat->st_birthtimensec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->AccessTime, &pStat->st_atim);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->ModificationTime, &pStat->st_mtim);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->ChangeTime, &pStat->st_ctim);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->BirthTime, &pStat->st_birthtim);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->AccessTime, pStat->st_atimespec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->ModificationTime, pStat->st_mtimespec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->ChangeTime, pStat->st_ctimespec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetTimespec(&pObjInfo->BirthTime, pStat->st_birthtimespec);
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else /* just the normal stuff */
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetSeconds(&pObjInfo->AccessTime, pStat->st_atime);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetSeconds(&pObjInfo->ModificationTime, pStat->st_mtime);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetSeconds(&pObjInfo->ChangeTime, pStat->st_ctime);
a23fd118e437af0a7877dd313db8fdaa3537c675yl RTTimeSpecSetSeconds(&pObjInfo->BirthTime, pStat->st_birthtime);
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* the file mode */
a23fd118e437af0a7877dd313db8fdaa3537c675yl pObjInfo->Attr.fMode = rtFsModeFromUnix(fMode, pszName, cbName);
a23fd118e437af0a7877dd313db8fdaa3537c675yl /* additional unix attribs */
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif /* !RT_OS_WINDOWS */