/*
- * "$Id: env.c 4719 2005-09-28 21:12:44Z mike $"
+ * "$Id: env.c 9459 2011-01-11 03:48:42Z mike $"
*
- * Environment management routines for the Common UNIX Printing System (CUPS).
+ * Environment management routines for the CUPS scheduler.
*
- * Copyright 1997-2005 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2011 by Apple Inc.
+ * Copyright 1997-2006 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
+ * property of Apple Inc. 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
+ * file is missing or damaged, see the license at "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.
+ * 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.
+ * cupsdUpdateEnv() - Update the environment for the configured directories.
+ * clear_env() - Clear common environment variables.
+ * find_env() - Find a common environment variable.
*/
/*
*/
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);
/*
* 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 X - this allows MacOS X
+ * programs to access their bundle resources properly...
+ *
+ * This string is replaced in cupsdStartProcess()...
*/
cupsdSetString(common_env, "<CFProcessPath>");
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);
}
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...
return;
/*
- * Set the new environment variable...
+ * See if this variable has already been defined...
*/
- cupsdSetStringf(common_env + num_common_env, "%s=%s", name, value);
+ 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 ++;
+ }
+
+ /*
+ * Set the new environment variable...
+ */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSetEnv: %s\n",
- common_env[num_common_env]);
+ cupsdSetStringf(common_env + i, "%s=%s", name, value);
- num_common_env ++;
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetEnv: %s", common_env[i]);
}
/*
- * 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);
+}
+
+
+/*
+ * '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);
+}
+
+
+/*
+ * End of "$Id: env.c 9459 2011-01-11 03:48:42Z mike $".
*/