#include "http-private.h"
#include "globals.h"
#include "debug.h"
#include <stdlib.h>
static void
cups_env_init(_cups_globals_t *g)
{
if ((g->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
g->cups_datadir = CUPS_DATADIR;
if ((g->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
g->cups_serverbin = CUPS_SERVERBIN;
if ((g->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
g->cups_serverroot = CUPS_SERVERROOT;
if ((g->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
g->cups_statedir = CUPS_STATEDIR;
if ((g->localedir = getenv("LOCALEDIR")) == NULL)
g->localedir = CUPS_LOCALEDIR;
}
#ifdef HAVE_PTHREAD_H
static pthread_key_t globals_key = -1;
static pthread_once_t globals_key_once = PTHREAD_ONCE_INIT;
static void globals_init();
static void globals_destructor(void *value);
_cups_globals_t *
_cupsGlobals(void)
{
_cups_globals_t *globals;
DEBUG_printf(("_cupsGlobals(): globals_key_once=%d\n", globals_key_once));
pthread_once(&globals_key_once, globals_init);
if ((globals = (_cups_globals_t *)pthread_getspecific(globals_key)) == NULL)
{
DEBUG_puts("_cupsGlobals: allocating memory for thread...");
globals = calloc(1, sizeof(_cups_globals_t));
pthread_setspecific(globals_key, globals);
DEBUG_printf((" globals=%p\n", globals));
globals->encryption = (http_encryption_t)-1;
globals->password_cb = _cupsGetPassword;
cups_env_init(globals);
}
return (globals);
}
static void
globals_init()
{
pthread_key_create(&globals_key, globals_destructor);
DEBUG_printf(("globals_init(): globals_key=%x(%u)\n", globals_key,
globals_key));
}
static void
globals_destructor(void *value)
{
int i;
_cups_globals_t *cg;
DEBUG_printf(("globals_destructor(value=%p)\n", value));
cg = (_cups_globals_t *)value;
httpClose(cg->http);
for (i = 0; i < 3; i ++)
cupsFileClose(cg->stdio_files[i]);
if (cg->last_status_message)
free(cg->last_status_message);
cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings);
free(value);
}
#else
_cups_globals_t *
_cupsGlobals(void)
{
static _cups_globals_t globals;
static int initialized = 0;
if (!initialized)
{
initialized = 1;
memset(&globals, 0, sizeof(globals));
globals.encryption = (http_encryption_t)-1;
globals.password_cb = _cupsGetPassword;
cups_env_init(&globals);
}
return (&globals);
}
#endif