#include "cupsd.h"
static int num_common_env = 0;
static char *common_env[MAX_ENV];
static void clear_env(void);
static int find_env(const char *name);
void
cupsdInitEnv(void)
{
clear_env();
#if defined(__APPLE__)
cupsdSetString(common_env, "<CFProcessPath>");
num_common_env = 1;
#endif
}
int
cupsdLoadEnv(char *envp[],
int envmax)
{
int i;
envmax --;
for (i = 0; i < num_common_env && i < envmax; i ++)
envp[i] = common_env[i];
envp[i] = NULL;
return (i);
}
void
cupsdSetEnv(const char *name,
const char *value)
{
int i;
if (!value)
value = getenv(name);
if (!value)
return;
if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3)))
return;
if ((i = find_env(name)) < 0)
{
if (num_common_env >= (int)(sizeof(common_env) / sizeof(common_env[0])))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdSetEnv: Too many environment variables set!");
return;
}
i = num_common_env;
num_common_env ++;
}
cupsdSetStringf(common_env + i, "%s=%s", name, value);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetEnv: %s", common_env[i]);
}
void
cupsdSetEnvf(const char *name,
const char *value,
...)
{
char v[4096];
va_list ap;
va_start(ap, value);
vsnprintf(v, sizeof(v), value, ap);
va_end(ap);
cupsdSetEnv(name, v);
}
void
cupsdUpdateEnv(void)
{
#define set_if_undefined(name,value) if (find_env(name) < 0) cupsdSetEnv(name,value)
set_if_undefined("CUPS_CACHEDIR", CacheDir);
set_if_undefined("CUPS_DATADIR", DataDir);
set_if_undefined("CUPS_DOCROOT", DocumentRoot);
set_if_undefined("CUPS_FONTPATH", FontPath);
set_if_undefined("CUPS_REQUESTROOT", RequestRoot);
set_if_undefined("CUPS_SERVERBIN", ServerBin);
set_if_undefined("CUPS_SERVERROOT", ServerRoot);
set_if_undefined("CUPS_STATEDIR", StateDir);
set_if_undefined("DYLD_LIBRARY_PATH", NULL);
set_if_undefined("HOME", TempDir);
set_if_undefined("LD_ASSUME_KERNEL", NULL);
set_if_undefined("LD_LIBRARY_PATH", NULL);
set_if_undefined("LD_PRELOAD", NULL);
set_if_undefined("NLSPATH", NULL);
if (find_env("PATH") < 0)
cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
":/bin:/usr/bin", ServerBin);
set_if_undefined("SERVER_ADMIN", ServerAdmin);
set_if_undefined("SHLIB_PATH", NULL);
set_if_undefined("SOFTWARE", CUPS_MINIMAL);
set_if_undefined("TMPDIR", TempDir);
set_if_undefined("TZ", NULL);
set_if_undefined("USER", "root");
set_if_undefined("VG_ARGS", NULL);
cupsdSetEnvf("CUPS_MAX_MESSAGE", "%d", CUPSD_SB_BUFFER_SIZE - 1);
}
static void
clear_env(void)
{
int i;
for (i = 0; i < num_common_env; i ++)
cupsdClearString(common_env + i);
num_common_env = 0;
}
static int
find_env(const char *name)
{
int i;
size_t namelen;
for (i = 0, namelen = strlen(name); i < num_common_env; i ++)
if (!strncmp(common_env[i], name, namelen) && common_env[i][namelen] == '=')
return (i);
return (-1);
}