1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. 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[] = { "TMPDIR", "TMP", "TEMP"};
50 /* Our goal is to find a temporary directory suitable for writing
52 Here's the order in which we'll try various paths:
57 "C:\TEMP" (windows only)
58 "SYS:\TMP" (netware only)
62 P_tmpdir (POSIX define)
65 NOTE: This algorithm is basically the same one used by Python
66 2.2's tempfile.py module. */
68 /* Try the environment first. */
69 for (i = 0; i < (sizeof(try_envs) / sizeof(const char *)); i++) {
71 apr_err = apr_env_get(&value, try_envs[i], p);
72 if ((apr_err == APR_SUCCESS) && value) {
73 apr_size_t len = strlen(value);
74 if (len && (len < APR_PATH_MAX) && test_tempdir(value, p)) {
82 /* Next, on Win32, try the C:\TEMP directory. */
83 if (test_tempdir("C:\\TEMP", p)) {
89 /* Next, on NetWare, try the SYS:/TMP directory. */
90 if (test_tempdir("SYS:/TMP", p)) {
96 /* Next, try a set of hard-coded paths. */
97 for (i = 0; i < (sizeof(try_dirs) / sizeof(const char *)); i++) {
98 if (test_tempdir(try_dirs[i], p)) {
106 * If we have it, use the POSIX definition of where
107 * the tmpdir should be
109 if (test_tempdir(P_tmpdir, p)) {
115 /* Finally, try the current working directory. */
116 if (APR_SUCCESS == apr_filepath_get(&cwd, APR_FILEPATH_NATIVE, p)) {
117 if (test_tempdir(cwd, p)) {
123 /* We didn't find a suitable temp dir anywhere */
127 *temp_dir = apr_pstrdup(p, dir);