]> git.ipfire.org Git - thirdparty/cups.git/blob - cups/globals.c
Load cups into easysw/current.
[thirdparty/cups.git] / cups / globals.c
1 /*
2 * "$Id: globals.c 5319 2006-03-21 15:28:29Z mike $"
3 *
4 * Global variable access routines for the Common UNIX Printing System (CUPS).
5 *
6 * Copyright 1997-2006 by Easy Software Products, all rights reserved.
7 *
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
13 * at:
14 *
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
19 *
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
23 *
24 * This file is subject to the Apple OS-Developed Software exception.
25 *
26 * Contents:
27 *
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().
32 */
33
34 /*
35 * Include necessary headers...
36 */
37
38 #include "http-private.h"
39 #include "globals.h"
40 #include <stdlib.h>
41
42
43 /*
44 * 'cups_env_init()' - Initialize environment variables.
45 */
46
47 static void
48 cups_env_init(_cups_globals_t *g) /* I - Global data */
49 {
50 if ((g->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
51 g->cups_datadir = CUPS_DATADIR;
52
53 if ((g->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
54 g->cups_serverbin = CUPS_SERVERBIN;
55
56 if ((g->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
57 g->cups_serverroot = CUPS_SERVERROOT;
58
59 if ((g->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
60 g->cups_statedir = CUPS_STATEDIR;
61
62 if ((g->localedir = getenv("LOCALEDIR")) == NULL)
63 g->localedir = CUPS_LOCALEDIR;
64 }
65
66
67 #ifdef HAVE_PTHREAD_H
68 /*
69 * Implement per-thread globals...
70 */
71
72 /*
73 * Local globals...
74 */
75
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 */
80
81
82 /*
83 * Local functions...
84 */
85
86 static void globals_init();
87 static void globals_destructor(void *value);
88
89
90 /*
91 * '_cupsGlobals()' - Return a pointer to thread local storage
92 */
93
94 _cups_globals_t * /* O - Pointer to global data */
95 _cupsGlobals(void)
96 {
97 _cups_globals_t *globals; /* Pointer to global data */
98
99
100 /*
101 * Initialize the global data exactly once...
102 */
103
104 pthread_once(&globals_key_once, globals_init);
105
106 /*
107 * See if we have allocated the data yet...
108 */
109
110 if ((globals = (_cups_globals_t *)pthread_getspecific(globals_key)) == NULL)
111 {
112 /*
113 * No, allocate memory as set the pointer for the key...
114 */
115
116 globals = calloc(1, sizeof(_cups_globals_t));
117 pthread_setspecific(globals_key, globals);
118
119 /*
120 * Initialize variables that have non-zero values
121 */
122
123 globals->encryption = (http_encryption_t)-1;
124 globals->password_cb = _cupsGetPassword;
125
126 cups_env_init(globals);
127 }
128
129 /*
130 * Return the pointer to the data...
131 */
132
133 return (globals);
134 }
135
136
137 /*
138 * 'globals_init()' - Initialize globals once.
139 */
140
141 static void
142 globals_init()
143 {
144 pthread_key_create(&globals_key, globals_destructor);
145 }
146
147
148 /*
149 * 'globals_destructor()' - Free memory allocated by _cupsGlobals().
150 */
151
152 static void
153 globals_destructor(void *value) /* I - Data to free */
154 {
155 int i; /* Looping var */
156 _cups_globals_t *cg; /* Global data */
157
158
159 cg = (_cups_globals_t *)value;
160
161 httpClose(cg->http);
162
163 for (i = 0; i < 3; i ++)
164 cupsFileClose(cg->stdio_files[i]);
165
166 _cupsStrFlush(cg);
167 _cupsLangFlush(cg);
168 _cupsCharmapFlush(cg);
169
170 cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings);
171
172 free(value);
173 }
174
175
176 #else
177 /*
178 * Implement static globals...
179 */
180
181 /*
182 * '_cupsGlobals()' - Return a pointer to thread local storage.
183 */
184
185 _cups_globals_t * /* O - Pointer to global data */
186 _cupsGlobals(void)
187 {
188 static _cups_globals_t globals; /* Global data */
189 static int initialized = 0;/* Global data initialized? */
190
191
192 /*
193 * Initialize global data as needed...
194 */
195
196 if (!initialized)
197 {
198 initialized = 1;
199
200 /*
201 * Initialize global variables...
202 */
203
204 memset(&globals, 0, sizeof(globals));
205
206 globals.encryption = (http_encryption_t)-1;
207 globals.password_cb = _cupsGetPassword;
208
209 cups_env_init(&globals);
210 }
211
212 return (&globals);
213 }
214 #endif /* HAVE_PTHREAD_H */
215
216
217 /*
218 * End of "$Id: globals.c 5319 2006-03-21 15:28:29Z mike $".
219 */