static VixError VixToolsGetTempFile(VixCommandRequestHeader *requestMsg,
void *userToken,
+ Bool useSystemTemp,
char **tempFile,
int *tempFileFd);
static VixError VixToolsCreateTempFile(VixCommandRequestHeader *requestMsg,
char **result);
+static VixError VixToolsCreateTempFileInt(VixCommandRequestHeader *requestMsg,
+ Bool useSystemTemp,
+ char **result);
+
static VixError VixToolsReadVariable(VixCommandRequestHeader *requestMsg,
char **result);
*
* VixToolsCreateTempFile --
*
- * Create a temporary file on the guest.
+ * Wrapper to call VixToolsCreateTempFileInt.
*
* Return value:
* VixError
VixError
VixToolsCreateTempFile(VixCommandRequestHeader *requestMsg, // IN
char **result) // OUT: UTF-8
+{
+ VixError err = VixToolsCreateTempFileInt(requestMsg, FALSE, result);
+#ifdef _WIN32
+ /*
+ * PR 2155708: CreateTemporaryFileInGuest succeeds and returns a file
+ * path that does not exist when using user name format "domain\user"
+ * if the user does not have a profile folder created before, such as
+ * by interactively logging onto Windows. What happens here is that
+ * Win32 API UnloadUserProfile() deletes the temp user profile folder
+ * "C:\Users\TEMP" in the end.
+ * Verify existence of the returned path, retry the guest OP using
+ * system temp folder if the path disappears.
+ */
+ if (VIX_SUCCEEDED(err) && *result != NULL && !File_Exists(*result)) {
+ g_warning("%s: '%s' does not exist, retry using system temp.\n",
+ __FUNCTION__, *result);
+ free(*result);
+ *result = NULL;
+ err = VixToolsCreateTempFileInt(requestMsg, TRUE, result);
+ }
+#endif
+
+ return err;
+} // VixToolsCreateTempFile
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * VixToolsCreateTempFileInt --
+ *
+ * Create a temporary file on the guest.
+ *
+ * Return value:
+ * VixError
+ *
+ * Side effects:
+ * None
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+VixError
+VixToolsCreateTempFileInt(VixCommandRequestHeader *requestMsg, // IN
+ Bool useSystemTemp, // IN
+ char **result) // OUT: UTF-8
{
VixError err = VIX_OK;
char *filePathName = NULL;
g_debug("%s: User: %s\n",
__FUNCTION__, IMPERSONATED_USERNAME);
- err = VixToolsGetTempFile(requestMsg, userToken, &filePathName, &fd);
+ err = VixToolsGetTempFile(requestMsg, userToken, useSystemTemp,
+ &filePathName, &fd);
if (VIX_FAILED(err)) {
goto abort;
}
requestMsg->opCode, err);
return err;
-} // VixToolsCreateTempFile
+} // VixToolsCreateTempFileInt
/*
static VixError
VixToolsGetTempFile(VixCommandRequestHeader *requestMsg, // IN
void *userToken, // IN
+ Bool useSystemTemp, // IN
char **tempFile, // OUT
int *tempFileFd) // OUT
{
if (!(strcmp(directoryPath, ""))) {
free(directoryPath);
directoryPath = NULL;
- err = VixToolsGetUserTmpDir(userToken, &directoryPath);
+ if (useSystemTemp) {
+ wchar_t tempPath[MAX_PATH];
+ DWORD dwRet = GetTempPathW(ARRAYSIZE(tempPath), tempPath);
+ if (0 < dwRet && dwRet < ARRAYSIZE(tempPath)) {
+ directoryPath = Unicode_AllocWithUTF16(tempPath);
+ err = VIX_OK;
+ } else {
+ g_warning("%s: unable to get temp path: windows error code %d\n",
+ __FUNCTION__, GetLastError());
+ err = VIX_E_FAIL;
+ }
+ } else {
+ err = VixToolsGetUserTmpDir(userToken, &directoryPath);
+ }
} else {
/*
* Initially, when 'err' variable is defined, it is initialized to