X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=scheduler%2Fenv.c;h=13b72412a4c230895ac64afcbe235a14b4f0de67;hb=2c3b8f53ada35cb3e7cef1c835dbde432e365042;hp=df13dab18bcc9b315c93fd7fadd6b898cd9fc96c;hpb=ef416fc25c4af449e930416117bedb12fc9924ba;p=thirdparty%2Fcups.git diff --git a/scheduler/env.c b/scheduler/env.c index df13dab18..13b72412a 100644 --- a/scheduler/env.c +++ b/scheduler/env.c @@ -1,34 +1,10 @@ /* - * "$Id: env.c 4719 2005-09-28 21:12:44Z mike $" + * Environment management routines for the CUPS scheduler. * - * Environment management routines for the Common UNIX Printing System (CUPS). + * Copyright 2007-2016 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. * - * Copyright 1997-2005 by Easy Software Products, all rights reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Easy Software Products and are protected by Federal - * copyright law. Distribution and use rights are outlined in the file - * "LICENSE.txt" which should have been included with this file. If this - * file is missing or damaged please contact Easy Software Products - * at: - * - * Attn: CUPS Licensing Information - * Easy Software Products - * 44141 Airport View Drive, Suite 204 - * Hollywood, Maryland 20636 USA - * - * Voice: (301) 373-9600 - * EMail: cups-info@cups.org - * WWW: http://www.cups.org - * - * Contents: - * - * cupsdClearEnv() - Clear common environment variables. - * cupsdInitEnv() - Initialize the current environment with standard - * variables. - * cupsdLoadEnv() - Copy common environment variables into an array. - * cupsdSetEnv() - Set a common environment variable. - * cupsdSetEnvf() - Set a formatted common environment variable. + * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* @@ -43,24 +19,15 @@ */ static int num_common_env = 0; /* Number of common env vars */ -static char *common_env[100]; /* Common env vars */ +static char *common_env[MAX_ENV]; /* Common env vars */ /* - * 'cupsdClearEnv()' - Clear common environment variables. + * Local functions... */ -void -cupsdClearEnv(void) -{ - int i; /* Looping var */ - - - for (i = 0; i < num_common_env; i ++) - cupsdClearString(common_env + i); - - num_common_env = 0; -} +static void clear_env(void); +static int find_env(const char *name); /* @@ -74,42 +41,19 @@ cupsdInitEnv(void) * Clear existing environment variables... */ - cupsdClearEnv(); + clear_env(); -#ifdef __APPLE__ +#if defined(__APPLE__) /* - * Add special voodoo magic for MacOS X - this allows MacOS X programs - * to access their bundle resources properly... + * Add special voodoo magic for macOS - this allows macOS + * programs to access their bundle resources properly... + * + * This string is replaced in cupsdStartProcess()... */ cupsdSetString(common_env, ""); num_common_env = 1; #endif /* __APPLE__ */ - - /* - * Set common variables... - */ - - cupsdSetEnv("CUPS_CACHEDIR", CacheDir); - cupsdSetEnv("CUPS_DATADIR", DataDir); - cupsdSetEnv("CUPS_DOCROOT", DocumentRoot); - cupsdSetEnv("CUPS_FONTPATH", FontPath); - cupsdSetEnv("CUPS_REQUESTROOT", RequestRoot); - cupsdSetEnv("CUPS_SERVERBIN", ServerBin); - cupsdSetEnv("CUPS_SERVERROOT", ServerRoot); - cupsdSetEnv("CUPS_STATEDIR", StateDir); - cupsdSetEnv("DYLD_LIBRARY_PATH", NULL); - cupsdSetEnv("LD_ASSUME_KERNEL", NULL); - cupsdSetEnv("LD_LIBRARY_PATH", NULL); - cupsdSetEnv("LD_PRELOAD", NULL); - cupsdSetEnv("NLSPATH", NULL); - cupsdSetEnvf("PATH", "%s/filter:/bin:/usr/bin", ServerBin); - cupsdSetEnv("SHLIB_PATH", NULL); - cupsdSetEnv("SOFTWARE", CUPS_MINIMAL); - cupsdSetEnv("TMPDIR", TempDir); - cupsdSetEnv("TZ", NULL); - cupsdSetEnv("USER", "root"); - cupsdSetEnv("VG_ARGS", NULL); } @@ -156,16 +100,8 @@ void cupsdSetEnv(const char *name, /* I - Name of variable */ const char *value) /* I - Value of variable */ { - /* - * Check for room... - */ + int i; /* Index into environent array */ - if (num_common_env >= (int)(sizeof(common_env) / sizeof(common_env[0]))) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "cupsdSetEnv: Too many environment variables set!"); - return; - } /* * If "value" is NULL, try getting value from current environment... @@ -178,15 +114,40 @@ cupsdSetEnv(const char *name, /* I - Name of variable */ return; /* - * Set the new environment variable... + * Do not allow dynamic linker variables when running as root... */ - cupsdSetStringf(common_env + num_common_env, "%s=%s", name, value); + if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3))) + return; - cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSetEnv: %s\n", - common_env[num_common_env]); + /* + * See if this variable has already been defined... + */ + + if ((i = find_env(name)) < 0) + { + /* + * Check for room... + */ + + 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 ++; + } - num_common_env ++; + /* + * Set the new environment variable... + */ + + cupsdSetStringf(common_env + i, "%s=%s", name, value); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetEnv: %s", common_env[i]); } @@ -220,5 +181,78 @@ cupsdSetEnvf(const char *name, /* I - Name of variable */ /* - * End of "$Id: env.c 4719 2005-09-28 21:12:44Z mike $". + * 'cupsdUpdateEnv()' - Update the environment for the configured directories. + */ + +void +cupsdUpdateEnv(void) +{ + /* + * Set common variables... + */ + +#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); +} + + +/* + * 'clear_env()' - Clear common environment variables. + */ + +static void +clear_env(void) +{ + int i; /* Looping var */ + + + for (i = 0; i < num_common_env; i ++) + cupsdClearString(common_env + i); + + num_common_env = 0; +} + + +/* + * 'find_env()' - Find a common environment variable. */ + +static int /* O - Index or -1 if not found */ +find_env(const char *name) /* I - Variable name */ +{ + int i; /* Looping var */ + size_t namelen; /* Length of name */ + + + 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); +}