2 * "$Id: globals.c 5047 2006-02-02 05:14:15Z mike $"
4 * Global variable access routines for the Common UNIX Printing System (CUPS).
6 * Copyright 1997-2006 by Easy Software Products, all rights reserved.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
24 * This file is subject to the Apple OS-Developed Software exception.
28 * _cupsGlobals() - Return a pointer to thread local storage.
29 * cups_env_init() - Initialize environment variables.
30 * globals_init() - Initialize globals once.
31 * globals_destructor() - Free memory allocated by _cupsGlobals().
35 * Include necessary headers...
38 #include "http-private.h"
44 * 'cups_env_init()' - Initialize environment variables.
48 cups_env_init(_cups_globals_t
*g
) /* I - Global data */
50 if ((g
->cups_datadir
= getenv("CUPS_DATADIR")) == NULL
)
51 g
->cups_datadir
= CUPS_DATADIR
;
53 if ((g
->cups_serverbin
= getenv("CUPS_SERVERBIN")) == NULL
)
54 g
->cups_serverbin
= CUPS_SERVERBIN
;
56 if ((g
->cups_serverroot
= getenv("CUPS_SERVERROOT")) == NULL
)
57 g
->cups_serverroot
= CUPS_SERVERROOT
;
59 if ((g
->cups_statedir
= getenv("CUPS_STATEDIR")) == NULL
)
60 g
->cups_statedir
= CUPS_STATEDIR
;
62 if ((g
->localedir
= getenv("LOCALEDIR")) == NULL
)
63 g
->localedir
= CUPS_LOCALEDIR
;
69 * Implement per-thread globals...
76 static pthread_key_t globals_key
= -1;
77 /* Thread local storage key */
78 static pthread_once_t globals_key_once
= PTHREAD_ONCE_INIT
;
79 /* One-time initialization object */
86 static void globals_init();
87 static void globals_destructor(void *value
);
91 * '_cupsGlobals()' - Return a pointer to thread local storage
94 _cups_globals_t
* /* O - Pointer to global data */
97 _cups_globals_t
*globals
; /* Pointer to global data */
101 * Initialize the global data exactly once...
104 pthread_once(&globals_key_once
, globals_init
);
107 * See if we have allocated the data yet...
110 if ((globals
= (_cups_globals_t
*)pthread_getspecific(globals_key
)) == NULL
)
113 * No, allocate memory as set the pointer for the key...
116 globals
= calloc(1, sizeof(_cups_globals_t
));
117 pthread_setspecific(globals_key
, globals
);
120 * Initialize variables that have non-zero values
123 globals
->encryption
= (http_encryption_t
)-1;
124 globals
->password_cb
= _cupsGetPassword
;
126 cups_env_init(globals
);
130 * Return the pointer to the data...
138 * 'globals_init()' - Initialize globals once.
144 pthread_key_create(&globals_key
, globals_destructor
);
149 * 'globals_destructor()' - Free memory allocated by _cupsGlobals().
153 globals_destructor(void *value
) /* I - Data to free */
155 _cups_globals_t
*cg
; /* Global data */
158 cg
= (_cups_globals_t
*)value
;
165 _cupsCharmapFlush(cg
);
166 _cupsNormalizeMapsFlush(cg
);
174 * Implement static globals...
178 * '_cupsGlobals()' - Return a pointer to thread local storage.
181 _cups_globals_t
* /* O - Pointer to global data */
184 static _cups_globals_t globals
; /* Global data */
185 static int initialized
= 0;/* Global data initialized? */
189 * Initialize global data as needed...
197 * Initialize global variables...
200 memset(&globals
, 0, sizeof(globals
));
202 globals
.encryption
= (http_encryption_t
)-1;
203 globals
.password_cb
= _cupsGetPassword
;
205 cups_env_init(&globals
);
210 #endif /* HAVE_PTHREAD_H */
214 * End of "$Id: globals.c 5047 2006-02-02 05:14:15Z mike $".