Changeset 34015 in vbox for trunk/src/VBox/Runtime/r3/posix/fs2-posix.cpp
- Timestamp:
- Nov 12, 2010 12:15:05 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 67680
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/posix/fs2-posix.cpp
r34013 r34015 1 1 /* $Id$ */ 2 2 /** @file 3 * IPRT - File System .3 * IPRT - File System Helpers, POSIX, Part 2. 4 4 */ 5 5 … … 29 29 * Header Files * 30 30 *******************************************************************************/ 31 #ifndef RT_OS_WINDOWS 32 # define RTTIME_INCL_TIMESPEC 33 # include <sys/time.h> 34 # include <sys/param.h> 35 # ifndef DEV_BSIZE 36 # include <sys/stat.h> 37 # define DEV_BSIZE S_BLKSIZE /** @todo bird: add DEV_BSIZE to sys/param.h on OS/2. */ 38 # endif 39 # include <grp.h> 40 # include <pwd.h> 31 #define RTTIME_INCL_TIMESPEC 32 #include <sys/time.h> 33 #include <sys/param.h> 34 #ifndef DEV_BSIZE 35 # include <sys/stat.h> 36 # define DEV_BSIZE S_BLKSIZE /** @todo bird: add DEV_BSIZE to sys/param.h on OS/2. */ 41 37 #endif 42 38 … … 44 40 #include "internal/iprt.h" 45 41 46 #include <iprt/asm.h>47 42 #include <iprt/assert.h> 48 #include <iprt/ctype.h>49 #include <iprt/path.h>50 #include <iprt/string.h>51 43 #include <iprt/time.h> 52 44 #include "internal/fs.h" 53 45 54 55 /**56 * Converts dos-style attributes to Unix attributes.57 *58 * @returns59 * @param fMode The mode mask containing dos-style attributes only.60 * @param pszName The filename which this applies to (exe check).61 * @param cbName The length of that filename. (optional, set 0)62 */63 RTFMODE rtFsModeFromDos(RTFMODE fMode, const char *pszName, size_t cbName)64 {65 fMode &= ~((1 << RTFS_DOS_SHIFT) - 1);66 67 /* everything is readable. */68 fMode |= RTFS_UNIX_IRUSR | RTFS_UNIX_IRGRP | RTFS_UNIX_IROTH;69 if (fMode & RTFS_DOS_DIRECTORY)70 /* directories are executable. */71 fMode |= RTFS_TYPE_DIRECTORY | RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH;72 else73 {74 fMode |= RTFS_TYPE_FILE;75 if (!cbName && pszName)76 cbName = strlen(pszName);77 if (cbName >= 4 && pszName[cbName - 4] == '.')78 {79 /* check for executable extension. */80 const char *pszExt = &pszName[cbName - 3];81 char szExt[4];82 szExt[0] = RT_C_TO_LOWER(pszExt[0]);83 szExt[1] = RT_C_TO_LOWER(pszExt[1]);84 szExt[2] = RT_C_TO_LOWER(pszExt[2]);85 szExt[3] = '\0';86 if ( !memcmp(szExt, "exe", 4)87 || !memcmp(szExt, "bat", 4)88 || !memcmp(szExt, "com", 4)89 || !memcmp(szExt, "cmd", 4)90 || !memcmp(szExt, "btm", 4)91 )92 fMode |= RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH;93 }94 }95 96 /* Is it really a symbolic link? */97 if (fMode & RTFS_DOS_NT_REPARSE_POINT)98 fMode = (fMode & ~RTFS_TYPE_MASK) | RTFS_TYPE_SYMLINK;99 100 /* writable? */101 if (!(fMode & RTFS_DOS_READONLY))102 fMode |= RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH;103 return fMode;104 }105 106 107 /**108 * Converts Unix attributes to Dos-style attributes.109 *110 * @returns File mode mask.111 * @param fMode The mode mask containing dos-style attributes only.112 * @param pszName The filename which this applies to (hidden check).113 * @param cbName The length of that filename. (optional, set 0)114 */115 RTFMODE rtFsModeFromUnix(RTFMODE fMode, const char *pszName, size_t cbName)116 {117 fMode &= RTFS_UNIX_MASK;118 119 if (!(fMode & (RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH)))120 fMode |= RTFS_DOS_READONLY;121 if (RTFS_IS_DIRECTORY(fMode))122 fMode |= RTFS_DOS_DIRECTORY;123 if (!(fMode & RTFS_DOS_MASK))124 fMode |= RTFS_DOS_NT_NORMAL;125 if (!(fMode & RTFS_DOS_HIDDEN) && pszName)126 {127 pszName = RTPathFilename(pszName);128 if (pszName && *pszName == '.')129 fMode |= RTFS_DOS_HIDDEN;130 }131 return fMode;132 }133 134 135 /**136 * Normalizes the give mode mask.137 *138 * It will create the missing unix or dos mask from the other (one139 * of them is required by all APIs), and guess the file type if that's140 * missing.141 *142 * @returns Normalized file mode.143 * @param fMode The mode mask that may contain a partial/incomplete mask.144 * @param pszName The filename which this applies to (exe check).145 * @param cbName The length of that filename. (optional, set 0)146 */147 RTFMODE rtFsModeNormalize(RTFMODE fMode, const char *pszName, size_t cbName)148 {149 if (!(fMode & RTFS_UNIX_MASK))150 fMode = rtFsModeFromDos(fMode, pszName, cbName);151 else if (!(fMode & RTFS_DOS_MASK))152 fMode = rtFsModeFromUnix(fMode, pszName, cbName);153 else if (!(fMode & RTFS_TYPE_MASK))154 fMode |= fMode & RTFS_DOS_DIRECTORY ? RTFS_TYPE_DIRECTORY : RTFS_TYPE_FILE;155 else if (RTFS_IS_DIRECTORY(fMode))156 fMode |= RTFS_DOS_DIRECTORY;157 return fMode;158 }159 160 161 /**162 * Checks if the file mode is valid or not.163 *164 * @return true if valid.165 * @return false if invalid, done bitching.166 * @param fMode The file mode.167 */168 bool rtFsModeIsValid(RTFMODE fMode)169 {170 AssertMsgReturn( (!RTFS_IS_DIRECTORY(fMode) && !(fMode & RTFS_DOS_DIRECTORY))171 || (RTFS_IS_DIRECTORY(fMode) && (fMode & RTFS_DOS_DIRECTORY)),172 ("%RTfmode\n", fMode), false);173 AssertMsgReturn(RTFS_TYPE_MASK & fMode,174 ("%RTfmode\n", fMode), false);175 /** @todo more checks! */176 return true;177 }178 179 180 /**181 * Checks if the file mode is valid as a permission mask or not.182 *183 * @return true if valid.184 * @return false if invalid, done bitching.185 * @param fMode The file mode.186 */187 bool rtFsModeIsValidPermissions(RTFMODE fMode)188 {189 AssertMsgReturn( (!RTFS_IS_DIRECTORY(fMode) && !(fMode & RTFS_DOS_DIRECTORY))190 || (RTFS_IS_DIRECTORY(fMode) && (fMode & RTFS_DOS_DIRECTORY)),191 ("%RTfmode\n", fMode), false);192 /** @todo more checks! */193 return true;194 }195 196 #ifndef RT_OS_WINDOWS197 46 198 47 /** … … 303 152 } 304 153 305 306 /**307 * Set user-owner additional attributes.308 *309 * @param pObjInfo The object info to fill add attrs for.310 * @param uid The user id.311 */312 void rtFsObjInfoAttrSetUnixOwner(PRTFSOBJINFO pObjInfo, RTUID uid)313 {314 pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_UNIX_OWNER;315 pObjInfo->Attr.u.UnixOwner.uid = uid;316 pObjInfo->Attr.u.UnixOwner.szName[0] = '\0';317 318 char achBuf[_4K];319 struct passwd Pwd;320 struct passwd *pPwd;321 int rc = getpwuid_r(uid, &Pwd, achBuf, sizeof(achBuf), &pPwd);322 if (!rc && pPwd)323 RTStrCopy(pObjInfo->Attr.u.UnixOwner.szName, sizeof(pObjInfo->Attr.u.UnixOwner.szName), pPwd->pw_name);324 }325 326 327 /**328 * Set user-group additional attributes.329 *330 * @param pObjInfo The object info to fill add attrs for.331 * @param gid The group id.332 */333 void rtFsObjInfoAttrSetUnixGroup(PRTFSOBJINFO pObjInfo, RTUID gid)334 {335 pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_UNIX_GROUP;336 pObjInfo->Attr.u.UnixGroup.gid = gid;337 pObjInfo->Attr.u.UnixGroup.szName[0] = '\0';338 339 char achBuf[_4K];340 struct group Grp;341 struct group *pGrp;342 343 int rc = getgrgid_r(gid, &Grp, achBuf, sizeof(achBuf), &pGrp);344 if (!rc && pGrp)345 RTStrCopy(pObjInfo->Attr.u.UnixGroup.szName, sizeof(pObjInfo->Attr.u.UnixGroup.szName), pGrp->gr_name);346 }347 348 #endif /* !RT_OS_WINDOWS */349 350 351 RTDECL(const char *) RTFsTypeName(RTFSTYPE enmType)352 {353 switch (enmType)354 {355 case RTFSTYPE_UNKNOWN: return "unknown";356 case RTFSTYPE_UDF: return "udf";357 case RTFSTYPE_ISO9660: return "iso9660";358 case RTFSTYPE_FUSE: return "fuse";359 case RTFSTYPE_VBOXSHF: return "vboxshf";360 361 case RTFSTYPE_EXT: return "ext";362 case RTFSTYPE_EXT2: return "ext2";363 case RTFSTYPE_EXT3: return "ext3";364 case RTFSTYPE_EXT4: return "ext4";365 case RTFSTYPE_XFS: return "xfs";366 case RTFSTYPE_CIFS: return "cifs";367 case RTFSTYPE_SMBFS: return "smbfs";368 case RTFSTYPE_TMPFS: return "tmpfs";369 case RTFSTYPE_SYSFS: return "sysfs";370 case RTFSTYPE_PROC: return "proc";371 372 case RTFSTYPE_NTFS: return "ntfs";373 case RTFSTYPE_FAT: return "fat";374 375 case RTFSTYPE_ZFS: return "zfs";376 case RTFSTYPE_UFS: return "ufs";377 case RTFSTYPE_NFS: return "nfs";378 379 case RTFSTYPE_HFS: return "hfs";380 case RTFSTYPE_AUTOFS: return "autofs";381 case RTFSTYPE_DEVFS: return "devfs";382 383 case RTFSTYPE_HPFS: return "hpfs";384 case RTFSTYPE_JFS: return "jfs";385 386 case RTFSTYPE_END: return "end";387 case RTFSTYPE_32BIT_HACK: break;388 }389 390 /* Don't put this in as 'default:', we wish GCC to warn about missing cases. */391 static char s_asz[4][64];392 static uint32_t volatile s_i = 0;393 uint32_t i = ASMAtomicIncU32(&s_i) % RT_ELEMENTS(s_asz);394 RTStrPrintf(s_asz[i], sizeof(s_asz[i]), "type=%d", enmType);395 return s_asz[i];396 }397
Note:
See TracChangeset
for help on using the changeset viewer.