xref: /illumos-gate/usr/src/cmd/sendmail/db/os/os_tmpdir.c (revision 9164a50bf932130cbb5097a16f6986873ce0e6e5)
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1998
5  *	Sleepycat Software.  All rights reserved.
6  */
7 
8 #include "config.h"
9 
10 #ifndef lint
11 static const char sccsid[] = "@(#)os_tmpdir.c	10.3 (Sleepycat) 10/13/98";
12 #endif /* not lint */
13 
14 #ifndef NO_SYSTEM_INCLUDES
15 #include <sys/types.h>
16 
17 #include <errno.h>
18 #include <stdlib.h>
19 #endif
20 
21 #include "db_int.h"
22 #include "common_ext.h"
23 
24 #ifdef macintosh
25 #include <TFileSpec.h>
26 #endif
27 
28 /*
29  * __os_tmpdir --
30  *	Set the temporary directory path.
31  *
32  * The order of items in the list structure and the order of checks in
33  * the environment are documented.
34  *
35  * PUBLIC: int __os_tmpdir __P((DB_ENV *, u_int32_t));
36  */
37 int
38 __os_tmpdir(dbenv, flags)
39 	DB_ENV *dbenv;
40 	u_int32_t flags;
41 {
42 	/*
43 	 * !!!
44 	 * Don't change this to:
45 	 *
46 	 *	static const char * const list[]
47 	 *
48 	 * because it creates a text relocation in position independent code.
49 	 */
50 	static const char * list[] = {
51 		"/var/tmp",
52 		"/usr/tmp",
53 		"/temp",		/* Windows. */
54 		"/tmp",
55 		"C:/temp",		/* Windows. */
56 		"C:/tmp",		/* Windows. */
57 		NULL
58 	};
59 	const char * const *lp, *p;
60 
61 	/* Use the environment if it's permitted and initialized. */
62 	p = NULL;
63 #ifdef HAVE_GETEUID
64 	if (LF_ISSET(DB_USE_ENVIRON) ||
65 	    (LF_ISSET(DB_USE_ENVIRON_ROOT) && getuid() == 0))
66 #else
67 	if (LF_ISSET(DB_USE_ENVIRON))
68 #endif
69 	{
70 		if ((p = getenv("TMPDIR")) != NULL && p[0] == '\0') {
71 			__db_err(dbenv, "illegal TMPDIR environment variable");
72 			return (EINVAL);
73 		}
74 		/* Windows */
75 		if (p == NULL && (p = getenv("TEMP")) != NULL && p[0] == '\0') {
76 			__db_err(dbenv, "illegal TEMP environment variable");
77 			return (EINVAL);
78 		}
79 		/* Windows */
80 		if (p == NULL && (p = getenv("TMP")) != NULL && p[0] == '\0') {
81 			__db_err(dbenv, "illegal TMP environment variable");
82 			return (EINVAL);
83 		}
84 		/* Macintosh */
85 		if (p == NULL &&
86 		    (p = getenv("TempFolder")) != NULL && p[0] == '\0') {
87 			__db_err(dbenv,
88 			    "illegal TempFolder environment variable");
89 			return (EINVAL);
90 		}
91 	}
92 
93 #ifdef macintosh
94 	/* Get the path to the temporary folder. */
95 	if (p == NULL) {
96 		FSSpec spec;
97 
98 		if (!Special2FSSpec(kTemporaryFolderType,
99 		    kOnSystemDisk, 0, &spec))
100 			(void)__os_strdup(FSp2FullPath(&spec), &p);
101 	}
102 #endif
103 
104 	/* Step through the list looking for a possibility. */
105 	if (p == NULL)
106 		for (lp = list; *lp != NULL; ++lp)
107 			if (__os_exists(p = *lp, NULL) == 0)
108 				break;
109 	if (p == NULL)
110 		return (0);
111 
112 	return (__os_strdup(p, &dbenv->db_tmp_dir));
113 }
114