tornavis/source/blender/blenlib/intern/tempfile.c

82 lines
2.6 KiB
C

/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "BLI_tempfile.h"
#include "BLI_fileops.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
bool BLI_temp_directory_path_copy_if_valid(char *tempdir,
const size_t tempdir_maxncpy,
const char *dirpath)
{
/* NOTE(@ideasman42): it is *not* the purpose of this function to check that
* `dirpath` is writable under all circumstances.
* Only check `dirpath` doesn't resolve to an empty string & points to a directory.
*
* While other checks could be added to avoid problems writing temporary files:
* (read-only, permission failure, out-of-I-nodes, disk-full... etc)
* it's out of scope for this function as these characteristics can change at run-time.
* In general temporary file IO should handle failure properly with sufficient user feedback,
* without attempting to *solve* the problem by anticipating file-system issues ahead of time. */
/* Disallow paths starting with two forward slashes. While they are valid paths,
* Blender interprets them as relative in situations relative paths aren't supported,
* see #95411. */
while (UNLIKELY(dirpath[0] == '/' && dirpath[1] == '/')) {
dirpath++;
}
if (dirpath[0] == '\0') {
return false;
}
if (!BLI_is_dir(dirpath)) {
return false;
}
BLI_strncpy(tempdir, dirpath, tempdir_maxncpy);
/* Add a trailing slash if needed. */
BLI_path_slash_ensure(tempdir, tempdir_maxncpy);
/* There's nothing preventing an environment variable (even preferences) from being CWD relative.
* This causes:
* - Asserts in code-paths which expect absolute paths (blend-file IO).
* - The temporary directory to change if the CWD changes.
* Avoid issues by ensuring the temporary directory is *never* CWD relative. */
BLI_path_abs_from_cwd(tempdir, tempdir_maxncpy);
return true;
}
void BLI_temp_directory_path_get(char *tempdir, const size_t tempdir_maxncpy)
{
tempdir[0] = '\0';
const char *env_vars[] = {
#ifdef WIN32
"TEMP",
#else
/* Non standard (could be removed). */
"TMP",
/* Posix standard. */
"TMPDIR",
#endif
};
for (int i = 0; i < ARRAY_SIZE(env_vars); i++) {
const char *tempdir_test = BLI_getenv(env_vars[i]);
if (tempdir_test == NULL) {
continue;
}
if (BLI_temp_directory_path_copy_if_valid(tempdir, tempdir_maxncpy, tempdir_test)) {
break;
}
}
if (tempdir[0] == '\0') {
BLI_strncpy(tempdir, "/tmp/", tempdir_maxncpy);
}
}