RTR3DECL(int) RTPathSetMode(const char *pszPath, RTFMODE fMode) { AssertPtrReturn(pszPath, VERR_INVALID_POINTER); AssertReturn(*pszPath, VERR_INVALID_PARAMETER); int rc; fMode = rtFsModeNormalize(fMode, pszPath, 0); if (rtFsModeIsValidPermissions(fMode)) { char const *pszNativePath; rc = rtPathToNative(&pszNativePath, pszPath, NULL); if (RT_SUCCESS(rc)) { if (chmod(pszNativePath, fMode & RTFS_UNIX_MASK) != 0) rc = RTErrConvertFromErrno(errno); rtPathFreeNative(pszNativePath, pszPath); } } else { AssertMsgFailed(("Invalid file mode! %RTfmode\n", fMode)); rc = VERR_INVALID_FMODE; } return rc; }
RTDECL(int) RTDirCreate(const char *pszPath, RTFMODE fMode, uint32_t fCreate) { /* * Validate the file mode. */ int rc; fMode = rtFsModeNormalize(fMode, pszPath, 0); if (rtFsModeIsValidPermissions(fMode)) { /* * Convert to UTF-16. */ PRTUTF16 pwszString; rc = RTStrToUtf16(pszPath, &pwszString); AssertRC(rc); if (RT_SUCCESS(rc)) { /* * Create the directory. */ if (CreateDirectoryW((LPCWSTR)pwszString, NULL)) rc = VINF_SUCCESS; else rc = RTErrConvertFromWin32(GetLastError()); /* * Turn off indexing of directory through Windows Indexing Service */ /** @todo This FILE_ATTRIBUTE_NOT_CONTENT_INDEXED hack (for .VDI files, * really) may cause failures on samba shares. That really sweet and * need to be addressed differently. We shouldn't be doing this * unless the caller actually asks for it, must less returning failure, * for crying out loud! This is only important a couple of places in * main, if important is the right way to put it... */ if ( RT_SUCCESS(rc) && !(fCreate & RTDIRCREATE_FLAGS_NOT_CONTENT_INDEXED_DONT_SET)) { if ( SetFileAttributesW((LPCWSTR)pwszString, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) || (fCreate & RTDIRCREATE_FLAGS_NOT_CONTENT_INDEXED_NOT_CRITICAL) ) rc = VINF_SUCCESS; else rc = RTErrConvertFromWin32(GetLastError()); } RTUtf16Free(pwszString); } } else { AssertMsgFailed(("Invalid file mode! %RTfmode\n", fMode)); rc = VERR_INVALID_FMODE; } LogFlow(("RTDirCreate(%p:{%s}, %RTfmode): returns %Rrc\n", pszPath, pszPath, fMode, rc)); return rc; }
RTDECL(int) RTDirCreate(const char *pszPath, RTFMODE fMode) { /* * Validate the file mode. */ int rc; fMode = rtFsModeNormalize(fMode, pszPath, 0); if (rtFsModeIsValidPermissions(fMode)) { /* * Convert to UTF-16. */ PRTUTF16 pwszString; rc = RTStrToUtf16(pszPath, &pwszString); AssertRC(rc); if (RT_SUCCESS(rc)) { /* * Create the directory. */ if (CreateDirectoryW((LPCWSTR)pwszString, NULL)) rc = VINF_SUCCESS; else rc = RTErrConvertFromWin32(GetLastError()); /* * Turn off indexing of directory through Windows Indexing Service */ if (RT_SUCCESS(rc)) { if (SetFileAttributesW((LPCWSTR)pwszString, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) rc = VINF_SUCCESS; else rc = RTErrConvertFromWin32(GetLastError()); } RTUtf16Free(pwszString); } } else { AssertMsgFailed(("Invalid file mode! %RTfmode\n", fMode)); rc = VERR_INVALID_FMODE; } LogFlow(("RTDirCreate(%p:{%s}, %RTfmode): returns %Rrc\n", pszPath, pszPath, fMode, rc)); return rc; }
RTDECL(int) RTDirCreate(const char *pszPath, RTFMODE fMode, uint32_t fCreate) { int rc; fMode = rtFsModeNormalize(fMode, pszPath, 0); if (rtFsModeIsValidPermissions(fMode)) { char const *pszNativePath; rc = rtPathToNative(&pszNativePath, pszPath, NULL); if (RT_SUCCESS(rc)) { if (mkdir(pszNativePath, fMode & RTFS_UNIX_MASK)) { rc = errno; bool fVerifyIsDir = true; #ifdef RT_OS_SOLARIS /* * mkdir on nfs mount points has been/is busted in various * during the Nevada development cycle. We've observed: * - Build 111b (2009.06) returns EACCES. * - Build ca. 70-80 returns ENOSYS. */ if ( rc == ENOSYS || rc == EACCES) { rc = RTErrConvertFromErrno(rc); fVerifyIsDir = false; /* We'll check if it's a dir ourselves since we're going to stat() anyway. */ struct stat st; if (!stat(pszNativePath, &st)) { rc = VERR_ALREADY_EXISTS; if (!S_ISDIR(st.st_mode)) rc = VERR_IS_A_FILE; } } else rc = RTErrConvertFromErrno(rc); #else rc = RTErrConvertFromErrno(rc); #endif if ( rc == VERR_ALREADY_EXISTS && fVerifyIsDir == true) { /* * Verify that it really exists as a directory. */ struct stat st; if (!stat(pszNativePath, &st) && !S_ISDIR(st.st_mode)) rc = VERR_IS_A_FILE; } } } rtPathFreeNative(pszNativePath, pszPath); } else { AssertMsgFailed(("Invalid file mode! %RTfmode\n", fMode)); rc = VERR_INVALID_FMODE; } LogFlow(("RTDirCreate(%p={%s}, %RTfmode): returns %Rrc\n", pszPath, pszPath, fMode, rc)); return rc; }