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