1
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
16
#include "apr_private.h"
17
#include "apr_file_io.h"
18
#include "apr_strings.h"
22
/* Try to open a temporary file in the temporary dir, write to it,
24
static int test_tempdir(const char *temp_dir, apr_pool_t *p)
26
apr_file_t *dummy_file;
27
char *path = apr_pstrcat(p, temp_dir, "/apr-tmp.XXXXXX", NULL);
29
if (apr_file_mktemp(&dummy_file, path, 0, p) == APR_SUCCESS) {
30
if (apr_file_putc('!', dummy_file) == APR_SUCCESS) {
31
if (apr_file_close(dummy_file) == APR_SUCCESS) {
40
APR_DECLARE(apr_status_t) apr_temp_dir_get(const char **temp_dir,
44
const char *try_dirs[] = { "/tmp", "/usr/tmp", "/var/tmp" };
45
const char *try_envs[] = { "TMP", "TEMP", "TMPDIR" };
50
/* Our goal is to find a temporary directory suitable for writing
51
into. We'll only pay the price once if we're successful -- we
52
cache our successful find. Here's the order in which we'll try
58
"C:\TEMP" (windows only)
59
"SYS:\TMP" (netware only)
63
P_tmpdir (POSIX define)
66
NOTE: This algorithm is basically the same one used by Python
67
2.2's tempfile.py module. */
69
/* Try the environment first. */
70
for (i = 0; i < (sizeof(try_envs) / sizeof(const char *)); i++) {
72
apr_err = apr_env_get(&value, try_envs[i], p);
73
if ((apr_err == APR_SUCCESS) && value) {
74
apr_size_t len = strlen(value);
75
if (len && (len < APR_PATH_MAX) && test_tempdir(value, p)) {
83
/* Next, on Win32, try the C:\TEMP directory. */
84
if (test_tempdir("C:\\TEMP", p)) {
90
/* Next, on NetWare, try the SYS:/TMP directory. */
91
if (test_tempdir("SYS:/TMP", p)) {
97
/* Next, try a set of hard-coded paths. */
98
for (i = 0; i < (sizeof(try_dirs) / sizeof(const char *)); i++) {
99
if (test_tempdir(try_dirs[i], p)) {
107
* If we have it, use the POSIX definition of where
108
* the tmpdir should be
110
if (test_tempdir(P_tmpdir, p)) {
116
/* Finally, try the current working directory. */
117
if (APR_SUCCESS == apr_filepath_get(&cwd, APR_FILEPATH_NATIVE, p)) {
118
if (test_tempdir(cwd, p)) {
124
/* We didn't find a suitable temp dir anywhere */
128
*temp_dir = apr_pstrdup(p, dir);