globals.c revision 25aee82d491492e1fa3b005e5880e684dc081ffb
125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Global variable access routines for CUPS. 325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2015 by Apple Inc. 525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1997-2007 by Easy Software Products, all rights reserved. 625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the 825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright 925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law. Distribution and use rights are outlined in the file "LICENSE.txt" 1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file. If this file is 1125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * file is missing or damaged, see the license at "http://www.cups.org/". 1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception. 1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers... 1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "cups-private.h" 2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local globals... 2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int cups_global_index = 0; 2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Next thread number */ 3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic _cups_threadkey_t cups_globals_key = _CUPS_THREADKEY_INITIALIZER; 3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Thread local storage key */ 3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_PTHREAD_H 3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic pthread_once_t cups_globals_key_once = PTHREAD_ONCE_INIT; 3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* One-time initialization object */ 3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H */ 3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#if defined(HAVE_PTHREAD_H) || defined(WIN32) 3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic _cups_mutex_t cups_global_mutex = _CUPS_MUTEX_INITIALIZER; 3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Global critical section */ 4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H || WIN32 */ 4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local functions... 4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void cups_fix_path(char *path); 4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic _cups_globals_t *cups_globals_alloc(void); 5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#if defined(HAVE_PTHREAD_H) || defined(WIN32) 5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void cups_globals_free(_cups_globals_t *g); 5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H || WIN32 */ 5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_PTHREAD_H 5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void cups_globals_init(void); 5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H */ 5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsGlobalLock()' - Lock the global mutex. 6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsGlobalLock(void) 6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_PTHREAD_H 6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pthread_mutex_lock(&cups_global_mutex); 6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#elif defined(WIN32) 6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann EnterCriticalSection(&cups_global_mutex.m_criticalSection); 7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H */ 7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsGlobals()' - Return a pointer to thread local storage 7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cups_globals_t * /* O - Pointer to global data */ 7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsGlobals(void) 8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg; /* Pointer to global data */ 8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_PTHREAD_H 8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Initialize the global data exactly once... 8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pthread_once(&cups_globals_key_once, cups_globals_init); 9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H */ 9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * See if we have allocated the data yet... 9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg = (_cups_globals_t *)_cupsThreadGetData(cups_globals_key)) == NULL) 9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * No, allocate memory as set the pointer for the key... 10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg = cups_globals_alloc()) != NULL) 10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsThreadSetData(cups_globals_key, cg); 10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the pointer to the data... 10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cg); 11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsGlobalUnlock()' - Unlock the global mutex. 11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsGlobalUnlock(void) 12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_PTHREAD_H 12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pthread_mutex_unlock(&cups_global_mutex); 12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#elif defined(WIN32) 12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann LeaveCriticalSection(&cups_global_mutex.m_criticalSection); 12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H */ 12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'DllMain()' - Main entry for library. 13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannBOOL WINAPI /* O - Success/failure */ 13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannDllMain(HINSTANCE hinst, /* I - DLL module handle */ 13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DWORD reason, /* I - Reason */ 13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann LPVOID reserved) /* I - Unused */ 13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg; /* Global data */ 14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (void)hinst; 14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (void)reserved; 14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (reason) 14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case DLL_PROCESS_ATTACH : /* Called on library initialization */ 14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann InitializeCriticalSection(&cups_global_mutex.m_criticalSection); 14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cups_globals_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) 15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (FALSE); 15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case DLL_THREAD_DETACH : /* Called when a thread terminates */ 15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL) 15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_globals_free(cg); 15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case DLL_PROCESS_DETACH : /* Called when library is unloaded */ 16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL) 16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_globals_free(cg); 16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann TlsFree(cups_globals_key); 16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DeleteCriticalSection(&cups_global_mutex.m_criticalSection); 16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default: 16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (TRUE); 17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_globals_alloc()' - Allocate and initialize global data. 17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic _cups_globals_t * /* O - Pointer to global data */ 18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_globals_alloc(void) 18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = malloc(sizeof(_cups_globals_t)); 18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Pointer to global data */ 18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann HKEY key; /* Registry key */ 18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DWORD size; /* Size of string */ 18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann static char installdir[1024] = "", /* Install directory */ 18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann confdir[1024] = "", /* Server root directory */ 19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann localedir[1024] = ""; /* Locale directory */ 19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cg) 19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Clear the global storage and set the default encryption and password 19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * callback values... 20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(cg, 0, sizeof(_cups_globals_t)); 20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->encryption = (http_encryption_t)-1; 20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; 20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->trust_first = -1; 20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->any_root = -1; 20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->expired_certs = -1; 20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->validate_certs = -1; 20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Friendly thread ID for debugging... 21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->thread_id = ++ cups_global_index; 21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Then set directories as appropriate... 22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!installdir[0]) 22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open the registry... 22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(installdir, "C:/Program Files/cups.org", sizeof(installdir)); 23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ, 23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann &key)) 23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Grab the installation directory... 23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *ptr; /* Pointer into installdir */ 23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size = sizeof(installdir); 24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann RegQueryValueEx(key, "installdir", NULL, NULL, installdir, &size); 24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann RegCloseKey(key); 24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = installdir; *ptr;) 24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*ptr == '\\') 24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr[1]) 24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr++ = '/'; 25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr = '\0'; /* Strip trailing \ */ 25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (*ptr == '/' && !ptr[1]) 25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr = '\0'; /* Strip trailing / */ 25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr ++; 25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(confdir, sizeof(confdir), "%s/conf", installdir); 26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(localedir, sizeof(localedir), "%s/locale", installdir); 26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL) 26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_datadir = installdir; 26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) 26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_serverbin = installdir; 26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) 27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_serverroot = confdir; 27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL) 27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_statedir = confdir; 27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->localedir = getenv("LOCALEDIR")) == NULL) 27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->localedir = localedir; 27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef HAVE_GETEUID 28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((geteuid() != getuid() && getuid()) || getegid() != getgid()) 28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# else 28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!getuid()) 28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* HAVE_GETEUID */ 28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When running setuid/setgid, don't allow environment variables to override 28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the directories... 28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_datadir = CUPS_DATADIR; 29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_serverbin = CUPS_SERVERBIN; 29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_serverroot = CUPS_SERVERROOT; 29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_statedir = CUPS_STATEDIR; 29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->localedir = CUPS_LOCALEDIR; 29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Allow directories to be overridden by environment variables. 30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL) 30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_datadir = CUPS_DATADIR; 30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) 30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_serverbin = CUPS_SERVERBIN; 30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) 31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_serverroot = CUPS_SERVERROOT; 31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL) 31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->cups_statedir = CUPS_STATEDIR; 31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((cg->localedir = getenv("LOCALEDIR")) == NULL) 31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->localedir = CUPS_LOCALEDIR; 31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cg); 32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_globals_free()' - Free global data. 32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#if defined(HAVE_PTHREAD_H) || defined(WIN32) 32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */ 33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_buffer_t *buffer, /* Current read/write buffer */ 33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *next; /* Next buffer */ 33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cg->last_status_message) 33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsStrFree(cg->last_status_message); 33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (buffer = cg->cups_buffers; buffer; buffer = next) 34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann next = buffer->next; 34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(buffer); 34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsArrayDelete(cg->leg_size_lut); 34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsArrayDelete(cg->ppd_size_lut); 34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsArrayDelete(cg->pwg_size_lut); 34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpClose(cg->http); 35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_SSL 35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _httpFreeCredentials(cg->tls_credentials); 35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_SSL */ 35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsFileClose(cg->stdio_files[0]); 35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsFileClose(cg->stdio_files[1]); 35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsFileClose(cg->stdio_files[2]); 35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings); 36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(cg); 36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H || WIN32 */ 36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_PTHREAD_H 36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_globals_init()' - Initialize environment variables. 36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_globals_init(void) 37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Register the global data for this thread... 37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pthread_key_create(&cups_globals_key, (void (*)(void *))cups_globals_free); 37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_PTHREAD_H */ 381