1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Global variable access routines for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
16*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
17*5e7646d2SAndroid Build Coastguard Worker # include <pwd.h>
18*5e7646d2SAndroid Build Coastguard Worker #endif /* !_WIN32 */
19*5e7646d2SAndroid Build Coastguard Worker
20*5e7646d2SAndroid Build Coastguard Worker
21*5e7646d2SAndroid Build Coastguard Worker /*
22*5e7646d2SAndroid Build Coastguard Worker * Local globals...
23*5e7646d2SAndroid Build Coastguard Worker */
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
26*5e7646d2SAndroid Build Coastguard Worker static int cups_global_index = 0;
27*5e7646d2SAndroid Build Coastguard Worker /* Next thread number */
28*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
29*5e7646d2SAndroid Build Coastguard Worker static _cups_threadkey_t cups_globals_key = _CUPS_THREADKEY_INITIALIZER;
30*5e7646d2SAndroid Build Coastguard Worker /* Thread local storage key */
31*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_PTHREAD_H
32*5e7646d2SAndroid Build Coastguard Worker static pthread_once_t cups_globals_key_once = PTHREAD_ONCE_INIT;
33*5e7646d2SAndroid Build Coastguard Worker /* One-time initialization object */
34*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
35*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_PTHREAD_H) || defined(_WIN32)
36*5e7646d2SAndroid Build Coastguard Worker static _cups_mutex_t cups_global_mutex = _CUPS_MUTEX_INITIALIZER;
37*5e7646d2SAndroid Build Coastguard Worker /* Global critical section */
38*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H || _WIN32 */
39*5e7646d2SAndroid Build Coastguard Worker
40*5e7646d2SAndroid Build Coastguard Worker
41*5e7646d2SAndroid Build Coastguard Worker /*
42*5e7646d2SAndroid Build Coastguard Worker * Local functions...
43*5e7646d2SAndroid Build Coastguard Worker */
44*5e7646d2SAndroid Build Coastguard Worker
45*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
46*5e7646d2SAndroid Build Coastguard Worker static void cups_fix_path(char *path);
47*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
48*5e7646d2SAndroid Build Coastguard Worker static _cups_globals_t *cups_globals_alloc(void);
49*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_PTHREAD_H) || defined(_WIN32)
50*5e7646d2SAndroid Build Coastguard Worker static void cups_globals_free(_cups_globals_t *g);
51*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H || _WIN32 */
52*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_PTHREAD_H
53*5e7646d2SAndroid Build Coastguard Worker static void cups_globals_init(void);
54*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
55*5e7646d2SAndroid Build Coastguard Worker
56*5e7646d2SAndroid Build Coastguard Worker
57*5e7646d2SAndroid Build Coastguard Worker /*
58*5e7646d2SAndroid Build Coastguard Worker * '_cupsGlobalLock()' - Lock the global mutex.
59*5e7646d2SAndroid Build Coastguard Worker */
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker void
_cupsGlobalLock(void)62*5e7646d2SAndroid Build Coastguard Worker _cupsGlobalLock(void)
63*5e7646d2SAndroid Build Coastguard Worker {
64*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_PTHREAD_H
65*5e7646d2SAndroid Build Coastguard Worker pthread_mutex_lock(&cups_global_mutex);
66*5e7646d2SAndroid Build Coastguard Worker #elif defined(_WIN32)
67*5e7646d2SAndroid Build Coastguard Worker EnterCriticalSection(&cups_global_mutex.m_criticalSection);
68*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
69*5e7646d2SAndroid Build Coastguard Worker }
70*5e7646d2SAndroid Build Coastguard Worker
71*5e7646d2SAndroid Build Coastguard Worker
72*5e7646d2SAndroid Build Coastguard Worker /*
73*5e7646d2SAndroid Build Coastguard Worker * '_cupsGlobals()' - Return a pointer to thread local storage
74*5e7646d2SAndroid Build Coastguard Worker */
75*5e7646d2SAndroid Build Coastguard Worker
76*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t * /* O - Pointer to global data */
_cupsGlobals(void)77*5e7646d2SAndroid Build Coastguard Worker _cupsGlobals(void)
78*5e7646d2SAndroid Build Coastguard Worker {
79*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg; /* Pointer to global data */
80*5e7646d2SAndroid Build Coastguard Worker
81*5e7646d2SAndroid Build Coastguard Worker
82*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_PTHREAD_H
83*5e7646d2SAndroid Build Coastguard Worker /*
84*5e7646d2SAndroid Build Coastguard Worker * Initialize the global data exactly once...
85*5e7646d2SAndroid Build Coastguard Worker */
86*5e7646d2SAndroid Build Coastguard Worker
87*5e7646d2SAndroid Build Coastguard Worker pthread_once(&cups_globals_key_once, cups_globals_init);
88*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
89*5e7646d2SAndroid Build Coastguard Worker
90*5e7646d2SAndroid Build Coastguard Worker /*
91*5e7646d2SAndroid Build Coastguard Worker * See if we have allocated the data yet...
92*5e7646d2SAndroid Build Coastguard Worker */
93*5e7646d2SAndroid Build Coastguard Worker
94*5e7646d2SAndroid Build Coastguard Worker if ((cg = (_cups_globals_t *)_cupsThreadGetData(cups_globals_key)) == NULL)
95*5e7646d2SAndroid Build Coastguard Worker {
96*5e7646d2SAndroid Build Coastguard Worker /*
97*5e7646d2SAndroid Build Coastguard Worker * No, allocate memory as set the pointer for the key...
98*5e7646d2SAndroid Build Coastguard Worker */
99*5e7646d2SAndroid Build Coastguard Worker
100*5e7646d2SAndroid Build Coastguard Worker if ((cg = cups_globals_alloc()) != NULL)
101*5e7646d2SAndroid Build Coastguard Worker _cupsThreadSetData(cups_globals_key, cg);
102*5e7646d2SAndroid Build Coastguard Worker }
103*5e7646d2SAndroid Build Coastguard Worker
104*5e7646d2SAndroid Build Coastguard Worker /*
105*5e7646d2SAndroid Build Coastguard Worker * Return the pointer to the data...
106*5e7646d2SAndroid Build Coastguard Worker */
107*5e7646d2SAndroid Build Coastguard Worker
108*5e7646d2SAndroid Build Coastguard Worker return (cg);
109*5e7646d2SAndroid Build Coastguard Worker }
110*5e7646d2SAndroid Build Coastguard Worker
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker /*
113*5e7646d2SAndroid Build Coastguard Worker * '_cupsGlobalUnlock()' - Unlock the global mutex.
114*5e7646d2SAndroid Build Coastguard Worker */
115*5e7646d2SAndroid Build Coastguard Worker
116*5e7646d2SAndroid Build Coastguard Worker void
_cupsGlobalUnlock(void)117*5e7646d2SAndroid Build Coastguard Worker _cupsGlobalUnlock(void)
118*5e7646d2SAndroid Build Coastguard Worker {
119*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_PTHREAD_H
120*5e7646d2SAndroid Build Coastguard Worker pthread_mutex_unlock(&cups_global_mutex);
121*5e7646d2SAndroid Build Coastguard Worker #elif defined(_WIN32)
122*5e7646d2SAndroid Build Coastguard Worker LeaveCriticalSection(&cups_global_mutex.m_criticalSection);
123*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
124*5e7646d2SAndroid Build Coastguard Worker }
125*5e7646d2SAndroid Build Coastguard Worker
126*5e7646d2SAndroid Build Coastguard Worker
127*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
128*5e7646d2SAndroid Build Coastguard Worker /*
129*5e7646d2SAndroid Build Coastguard Worker * 'DllMain()' - Main entry for library.
130*5e7646d2SAndroid Build Coastguard Worker */
131*5e7646d2SAndroid Build Coastguard Worker
132*5e7646d2SAndroid Build Coastguard Worker BOOL WINAPI /* O - Success/failure */
DllMain(HINSTANCE hinst,DWORD reason,LPVOID reserved)133*5e7646d2SAndroid Build Coastguard Worker DllMain(HINSTANCE hinst, /* I - DLL module handle */
134*5e7646d2SAndroid Build Coastguard Worker DWORD reason, /* I - Reason */
135*5e7646d2SAndroid Build Coastguard Worker LPVOID reserved) /* I - Unused */
136*5e7646d2SAndroid Build Coastguard Worker {
137*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg; /* Global data */
138*5e7646d2SAndroid Build Coastguard Worker
139*5e7646d2SAndroid Build Coastguard Worker
140*5e7646d2SAndroid Build Coastguard Worker (void)hinst;
141*5e7646d2SAndroid Build Coastguard Worker (void)reserved;
142*5e7646d2SAndroid Build Coastguard Worker
143*5e7646d2SAndroid Build Coastguard Worker switch (reason)
144*5e7646d2SAndroid Build Coastguard Worker {
145*5e7646d2SAndroid Build Coastguard Worker case DLL_PROCESS_ATTACH : /* Called on library initialization */
146*5e7646d2SAndroid Build Coastguard Worker InitializeCriticalSection(&cups_global_mutex.m_criticalSection);
147*5e7646d2SAndroid Build Coastguard Worker
148*5e7646d2SAndroid Build Coastguard Worker if ((cups_globals_key = TlsAlloc()) == TLS_OUT_OF_INDEXES)
149*5e7646d2SAndroid Build Coastguard Worker return (FALSE);
150*5e7646d2SAndroid Build Coastguard Worker break;
151*5e7646d2SAndroid Build Coastguard Worker
152*5e7646d2SAndroid Build Coastguard Worker case DLL_THREAD_DETACH : /* Called when a thread terminates */
153*5e7646d2SAndroid Build Coastguard Worker if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL)
154*5e7646d2SAndroid Build Coastguard Worker cups_globals_free(cg);
155*5e7646d2SAndroid Build Coastguard Worker break;
156*5e7646d2SAndroid Build Coastguard Worker
157*5e7646d2SAndroid Build Coastguard Worker case DLL_PROCESS_DETACH : /* Called when library is unloaded */
158*5e7646d2SAndroid Build Coastguard Worker if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL)
159*5e7646d2SAndroid Build Coastguard Worker cups_globals_free(cg);
160*5e7646d2SAndroid Build Coastguard Worker
161*5e7646d2SAndroid Build Coastguard Worker TlsFree(cups_globals_key);
162*5e7646d2SAndroid Build Coastguard Worker DeleteCriticalSection(&cups_global_mutex.m_criticalSection);
163*5e7646d2SAndroid Build Coastguard Worker break;
164*5e7646d2SAndroid Build Coastguard Worker
165*5e7646d2SAndroid Build Coastguard Worker default:
166*5e7646d2SAndroid Build Coastguard Worker break;
167*5e7646d2SAndroid Build Coastguard Worker }
168*5e7646d2SAndroid Build Coastguard Worker
169*5e7646d2SAndroid Build Coastguard Worker return (TRUE);
170*5e7646d2SAndroid Build Coastguard Worker }
171*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
172*5e7646d2SAndroid Build Coastguard Worker
173*5e7646d2SAndroid Build Coastguard Worker
174*5e7646d2SAndroid Build Coastguard Worker /*
175*5e7646d2SAndroid Build Coastguard Worker * 'cups_globals_alloc()' - Allocate and initialize global data.
176*5e7646d2SAndroid Build Coastguard Worker */
177*5e7646d2SAndroid Build Coastguard Worker
178*5e7646d2SAndroid Build Coastguard Worker static _cups_globals_t * /* O - Pointer to global data */
cups_globals_alloc(void)179*5e7646d2SAndroid Build Coastguard Worker cups_globals_alloc(void)
180*5e7646d2SAndroid Build Coastguard Worker {
181*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg = malloc(sizeof(_cups_globals_t));
182*5e7646d2SAndroid Build Coastguard Worker /* Pointer to global data */
183*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
184*5e7646d2SAndroid Build Coastguard Worker HKEY key; /* Registry key */
185*5e7646d2SAndroid Build Coastguard Worker DWORD size; /* Size of string */
186*5e7646d2SAndroid Build Coastguard Worker static char installdir[1024] = "", /* Install directory */
187*5e7646d2SAndroid Build Coastguard Worker confdir[1024] = "", /* Server root directory */
188*5e7646d2SAndroid Build Coastguard Worker localedir[1024] = ""; /* Locale directory */
189*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
190*5e7646d2SAndroid Build Coastguard Worker
191*5e7646d2SAndroid Build Coastguard Worker
192*5e7646d2SAndroid Build Coastguard Worker if (!cg)
193*5e7646d2SAndroid Build Coastguard Worker return (NULL);
194*5e7646d2SAndroid Build Coastguard Worker
195*5e7646d2SAndroid Build Coastguard Worker /*
196*5e7646d2SAndroid Build Coastguard Worker * Clear the global storage and set the default encryption and password
197*5e7646d2SAndroid Build Coastguard Worker * callback values...
198*5e7646d2SAndroid Build Coastguard Worker */
199*5e7646d2SAndroid Build Coastguard Worker
200*5e7646d2SAndroid Build Coastguard Worker memset(cg, 0, sizeof(_cups_globals_t));
201*5e7646d2SAndroid Build Coastguard Worker cg->encryption = (http_encryption_t)-1;
202*5e7646d2SAndroid Build Coastguard Worker cg->password_cb = (cups_password_cb2_t)_cupsGetPassword;
203*5e7646d2SAndroid Build Coastguard Worker cg->trust_first = -1;
204*5e7646d2SAndroid Build Coastguard Worker cg->any_root = -1;
205*5e7646d2SAndroid Build Coastguard Worker cg->expired_certs = -1;
206*5e7646d2SAndroid Build Coastguard Worker cg->validate_certs = -1;
207*5e7646d2SAndroid Build Coastguard Worker
208*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
209*5e7646d2SAndroid Build Coastguard Worker /*
210*5e7646d2SAndroid Build Coastguard Worker * Friendly thread ID for debugging...
211*5e7646d2SAndroid Build Coastguard Worker */
212*5e7646d2SAndroid Build Coastguard Worker
213*5e7646d2SAndroid Build Coastguard Worker cg->thread_id = ++ cups_global_index;
214*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker /*
217*5e7646d2SAndroid Build Coastguard Worker * Then set directories as appropriate...
218*5e7646d2SAndroid Build Coastguard Worker */
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
221*5e7646d2SAndroid Build Coastguard Worker if (!installdir[0])
222*5e7646d2SAndroid Build Coastguard Worker {
223*5e7646d2SAndroid Build Coastguard Worker /*
224*5e7646d2SAndroid Build Coastguard Worker * Open the registry...
225*5e7646d2SAndroid Build Coastguard Worker */
226*5e7646d2SAndroid Build Coastguard Worker
227*5e7646d2SAndroid Build Coastguard Worker strlcpy(installdir, "C:/Program Files/cups.org", sizeof(installdir));
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ, &key))
230*5e7646d2SAndroid Build Coastguard Worker {
231*5e7646d2SAndroid Build Coastguard Worker /*
232*5e7646d2SAndroid Build Coastguard Worker * Grab the installation directory...
233*5e7646d2SAndroid Build Coastguard Worker */
234*5e7646d2SAndroid Build Coastguard Worker
235*5e7646d2SAndroid Build Coastguard Worker char *ptr; /* Pointer into installdir */
236*5e7646d2SAndroid Build Coastguard Worker
237*5e7646d2SAndroid Build Coastguard Worker size = sizeof(installdir);
238*5e7646d2SAndroid Build Coastguard Worker RegQueryValueExA(key, "installdir", NULL, NULL, installdir, &size);
239*5e7646d2SAndroid Build Coastguard Worker RegCloseKey(key);
240*5e7646d2SAndroid Build Coastguard Worker
241*5e7646d2SAndroid Build Coastguard Worker for (ptr = installdir; *ptr;)
242*5e7646d2SAndroid Build Coastguard Worker {
243*5e7646d2SAndroid Build Coastguard Worker if (*ptr == '\\')
244*5e7646d2SAndroid Build Coastguard Worker {
245*5e7646d2SAndroid Build Coastguard Worker if (ptr[1])
246*5e7646d2SAndroid Build Coastguard Worker *ptr++ = '/';
247*5e7646d2SAndroid Build Coastguard Worker else
248*5e7646d2SAndroid Build Coastguard Worker *ptr = '\0'; /* Strip trailing \ */
249*5e7646d2SAndroid Build Coastguard Worker }
250*5e7646d2SAndroid Build Coastguard Worker else if (*ptr == '/' && !ptr[1])
251*5e7646d2SAndroid Build Coastguard Worker *ptr = '\0'; /* Strip trailing / */
252*5e7646d2SAndroid Build Coastguard Worker else
253*5e7646d2SAndroid Build Coastguard Worker ptr ++;
254*5e7646d2SAndroid Build Coastguard Worker }
255*5e7646d2SAndroid Build Coastguard Worker }
256*5e7646d2SAndroid Build Coastguard Worker
257*5e7646d2SAndroid Build Coastguard Worker snprintf(confdir, sizeof(confdir), "%s/conf", installdir);
258*5e7646d2SAndroid Build Coastguard Worker snprintf(localedir, sizeof(localedir), "%s/locale", installdir);
259*5e7646d2SAndroid Build Coastguard Worker }
260*5e7646d2SAndroid Build Coastguard Worker
261*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
262*5e7646d2SAndroid Build Coastguard Worker cg->cups_datadir = installdir;
263*5e7646d2SAndroid Build Coastguard Worker
264*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
265*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverbin = installdir;
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
268*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverroot = confdir;
269*5e7646d2SAndroid Build Coastguard Worker
270*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
271*5e7646d2SAndroid Build Coastguard Worker cg->cups_statedir = confdir;
272*5e7646d2SAndroid Build Coastguard Worker
273*5e7646d2SAndroid Build Coastguard Worker if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
274*5e7646d2SAndroid Build Coastguard Worker cg->localedir = localedir;
275*5e7646d2SAndroid Build Coastguard Worker
276*5e7646d2SAndroid Build Coastguard Worker cg->home = getenv("HOME");
277*5e7646d2SAndroid Build Coastguard Worker
278*5e7646d2SAndroid Build Coastguard Worker #else
279*5e7646d2SAndroid Build Coastguard Worker # ifdef HAVE_GETEUID
280*5e7646d2SAndroid Build Coastguard Worker if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
281*5e7646d2SAndroid Build Coastguard Worker # else
282*5e7646d2SAndroid Build Coastguard Worker if (!getuid())
283*5e7646d2SAndroid Build Coastguard Worker # endif /* HAVE_GETEUID */
284*5e7646d2SAndroid Build Coastguard Worker {
285*5e7646d2SAndroid Build Coastguard Worker /*
286*5e7646d2SAndroid Build Coastguard Worker * When running setuid/setgid, don't allow environment variables to override
287*5e7646d2SAndroid Build Coastguard Worker * the directories...
288*5e7646d2SAndroid Build Coastguard Worker */
289*5e7646d2SAndroid Build Coastguard Worker
290*5e7646d2SAndroid Build Coastguard Worker cg->cups_datadir = CUPS_DATADIR;
291*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverbin = CUPS_SERVERBIN;
292*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverroot = CUPS_SERVERROOT;
293*5e7646d2SAndroid Build Coastguard Worker cg->cups_statedir = CUPS_STATEDIR;
294*5e7646d2SAndroid Build Coastguard Worker cg->localedir = CUPS_LOCALEDIR;
295*5e7646d2SAndroid Build Coastguard Worker }
296*5e7646d2SAndroid Build Coastguard Worker else
297*5e7646d2SAndroid Build Coastguard Worker {
298*5e7646d2SAndroid Build Coastguard Worker /*
299*5e7646d2SAndroid Build Coastguard Worker * Allow directories to be overridden by environment variables.
300*5e7646d2SAndroid Build Coastguard Worker */
301*5e7646d2SAndroid Build Coastguard Worker
302*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
303*5e7646d2SAndroid Build Coastguard Worker cg->cups_datadir = CUPS_DATADIR;
304*5e7646d2SAndroid Build Coastguard Worker
305*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
306*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverbin = CUPS_SERVERBIN;
307*5e7646d2SAndroid Build Coastguard Worker
308*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
309*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverroot = CUPS_SERVERROOT;
310*5e7646d2SAndroid Build Coastguard Worker
311*5e7646d2SAndroid Build Coastguard Worker if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
312*5e7646d2SAndroid Build Coastguard Worker cg->cups_statedir = CUPS_STATEDIR;
313*5e7646d2SAndroid Build Coastguard Worker
314*5e7646d2SAndroid Build Coastguard Worker if ((cg->localedir = getenv("LOCALEDIR")) == NULL)
315*5e7646d2SAndroid Build Coastguard Worker cg->localedir = CUPS_LOCALEDIR;
316*5e7646d2SAndroid Build Coastguard Worker
317*5e7646d2SAndroid Build Coastguard Worker cg->home = getenv("HOME");
318*5e7646d2SAndroid Build Coastguard Worker
319*5e7646d2SAndroid Build Coastguard Worker # ifdef __APPLE__ /* Sandboxing now exposes the container as the home directory */
320*5e7646d2SAndroid Build Coastguard Worker if (cg->home && strstr(cg->home, "/Library/Containers/"))
321*5e7646d2SAndroid Build Coastguard Worker cg->home = NULL;
322*5e7646d2SAndroid Build Coastguard Worker # endif /* !__APPLE__ */
323*5e7646d2SAndroid Build Coastguard Worker }
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker if (!cg->home)
326*5e7646d2SAndroid Build Coastguard Worker {
327*5e7646d2SAndroid Build Coastguard Worker struct passwd *pw; /* User info */
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker if ((pw = getpwuid(getuid())) != NULL)
330*5e7646d2SAndroid Build Coastguard Worker cg->home = _cupsStrAlloc(pw->pw_dir);
331*5e7646d2SAndroid Build Coastguard Worker }
332*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
333*5e7646d2SAndroid Build Coastguard Worker
334*5e7646d2SAndroid Build Coastguard Worker return (cg);
335*5e7646d2SAndroid Build Coastguard Worker }
336*5e7646d2SAndroid Build Coastguard Worker
337*5e7646d2SAndroid Build Coastguard Worker
338*5e7646d2SAndroid Build Coastguard Worker /*
339*5e7646d2SAndroid Build Coastguard Worker * 'cups_globals_free()' - Free global data.
340*5e7646d2SAndroid Build Coastguard Worker */
341*5e7646d2SAndroid Build Coastguard Worker
342*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_PTHREAD_H) || defined(_WIN32)
343*5e7646d2SAndroid Build Coastguard Worker static void
cups_globals_free(_cups_globals_t * cg)344*5e7646d2SAndroid Build Coastguard Worker cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */
345*5e7646d2SAndroid Build Coastguard Worker {
346*5e7646d2SAndroid Build Coastguard Worker _cups_buffer_t *buffer, /* Current read/write buffer */
347*5e7646d2SAndroid Build Coastguard Worker *next; /* Next buffer */
348*5e7646d2SAndroid Build Coastguard Worker
349*5e7646d2SAndroid Build Coastguard Worker
350*5e7646d2SAndroid Build Coastguard Worker if (cg->last_status_message)
351*5e7646d2SAndroid Build Coastguard Worker _cupsStrFree(cg->last_status_message);
352*5e7646d2SAndroid Build Coastguard Worker
353*5e7646d2SAndroid Build Coastguard Worker for (buffer = cg->cups_buffers; buffer; buffer = next)
354*5e7646d2SAndroid Build Coastguard Worker {
355*5e7646d2SAndroid Build Coastguard Worker next = buffer->next;
356*5e7646d2SAndroid Build Coastguard Worker free(buffer);
357*5e7646d2SAndroid Build Coastguard Worker }
358*5e7646d2SAndroid Build Coastguard Worker
359*5e7646d2SAndroid Build Coastguard Worker cupsArrayDelete(cg->leg_size_lut);
360*5e7646d2SAndroid Build Coastguard Worker cupsArrayDelete(cg->ppd_size_lut);
361*5e7646d2SAndroid Build Coastguard Worker cupsArrayDelete(cg->pwg_size_lut);
362*5e7646d2SAndroid Build Coastguard Worker
363*5e7646d2SAndroid Build Coastguard Worker httpClose(cg->http);
364*5e7646d2SAndroid Build Coastguard Worker
365*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
366*5e7646d2SAndroid Build Coastguard Worker _httpFreeCredentials(cg->tls_credentials);
367*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
368*5e7646d2SAndroid Build Coastguard Worker
369*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(cg->stdio_files[0]);
370*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(cg->stdio_files[1]);
371*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(cg->stdio_files[2]);
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings);
374*5e7646d2SAndroid Build Coastguard Worker
375*5e7646d2SAndroid Build Coastguard Worker if (cg->raster_error.start)
376*5e7646d2SAndroid Build Coastguard Worker free(cg->raster_error.start);
377*5e7646d2SAndroid Build Coastguard Worker
378*5e7646d2SAndroid Build Coastguard Worker free(cg);
379*5e7646d2SAndroid Build Coastguard Worker }
380*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H || _WIN32 */
381*5e7646d2SAndroid Build Coastguard Worker
382*5e7646d2SAndroid Build Coastguard Worker
383*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_PTHREAD_H
384*5e7646d2SAndroid Build Coastguard Worker /*
385*5e7646d2SAndroid Build Coastguard Worker * 'cups_globals_init()' - Initialize environment variables.
386*5e7646d2SAndroid Build Coastguard Worker */
387*5e7646d2SAndroid Build Coastguard Worker
388*5e7646d2SAndroid Build Coastguard Worker static void
cups_globals_init(void)389*5e7646d2SAndroid Build Coastguard Worker cups_globals_init(void)
390*5e7646d2SAndroid Build Coastguard Worker {
391*5e7646d2SAndroid Build Coastguard Worker /*
392*5e7646d2SAndroid Build Coastguard Worker * Register the global data for this thread...
393*5e7646d2SAndroid Build Coastguard Worker */
394*5e7646d2SAndroid Build Coastguard Worker
395*5e7646d2SAndroid Build Coastguard Worker pthread_key_create(&cups_globals_key, (void (*)(void *))cups_globals_free);
396*5e7646d2SAndroid Build Coastguard Worker }
397*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_PTHREAD_H */
398