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
112447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann * 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