#include "http-private.h"
#include "globals.h"
#include <stdlib.h>
static void
cups_env_init(_cups_globals_t *g)
{
#ifndef WIN32
# ifdef HAVE_GETEUID
if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
# else
if (!getuid())
# endif
{
g->cups_datadir = CUPS_DATADIR;
g->cups_serverbin = CUPS_SERVERBIN;
g->cups_serverroot = CUPS_SERVERROOT;
g->cups_statedir = CUPS_STATEDIR;
g->localedir = CUPS_LOCALEDIR;
}
else
#endif
{
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;
pthread_once(&globals_key_once, globals_init);
if ((globals = (_cups_globals_t *)pthread_getspecific(globals_key)) == NULL)
{
globals = calloc(1, sizeof(_cups_globals_t));
pthread_setspecific(globals_key, globals);
globals->encryption = (http_encryption_t)-1;
globals->password_cb = (cups_password_cb2_t)_cupsGetPassword;
cups_env_init(globals);
}
return (globals);
}
static void
globals_init()
{
pthread_key_create(&globals_key, globals_destructor);
}
static void
globals_destructor(void *value)
{
int i;
_ipp_buffer_t *buffer,
*next;
_cups_globals_t *cg;
cg = (_cups_globals_t *)value;
httpClose(cg->http);
for (i = 0; i < 3; i ++)
cupsFileClose(cg->stdio_files[i]);
if (cg->last_status_message)
_cupsStrFree(cg->last_status_message);
# ifndef CUPS_LITE
cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings);
# endif
for (buffer = cg->ipp_buffers; buffer; buffer = next)
{
next = buffer->next;
free(buffer);
}
cupsArrayDelete(cg->pwg_size_lut);
cupsArrayDelete(cg->leg_size_lut);
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 = (cups_password_cb2_t)_cupsGetPassword;
cups_env_init(&globals);
}
return (&globals);
}
#endif