xref: /aosp_15_r20/external/libcups/cups/globals.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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