xref: /aosp_15_r20/external/libcups/scheduler/env.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Environment management routines for the CUPS scheduler.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2016 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright 1997-2006 by Easy Software Products, all rights reserved.
6*5e7646d2SAndroid Build Coastguard Worker  *
7*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "cupsd.h"
15*5e7646d2SAndroid Build Coastguard Worker 
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker  * Local globals...
19*5e7646d2SAndroid Build Coastguard Worker  */
20*5e7646d2SAndroid Build Coastguard Worker 
21*5e7646d2SAndroid Build Coastguard Worker static int	num_common_env = 0;	/* Number of common env vars */
22*5e7646d2SAndroid Build Coastguard Worker static char	*common_env[MAX_ENV];	/* Common env vars */
23*5e7646d2SAndroid Build Coastguard Worker 
24*5e7646d2SAndroid Build Coastguard Worker 
25*5e7646d2SAndroid Build Coastguard Worker /*
26*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
27*5e7646d2SAndroid Build Coastguard Worker  */
28*5e7646d2SAndroid Build Coastguard Worker 
29*5e7646d2SAndroid Build Coastguard Worker static void	clear_env(void);
30*5e7646d2SAndroid Build Coastguard Worker static int	find_env(const char *name);
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker /*
34*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdInitEnv()' - Initialize the current environment with standard variables.
35*5e7646d2SAndroid Build Coastguard Worker  */
36*5e7646d2SAndroid Build Coastguard Worker 
37*5e7646d2SAndroid Build Coastguard Worker void
cupsdInitEnv(void)38*5e7646d2SAndroid Build Coastguard Worker cupsdInitEnv(void)
39*5e7646d2SAndroid Build Coastguard Worker {
40*5e7646d2SAndroid Build Coastguard Worker  /*
41*5e7646d2SAndroid Build Coastguard Worker   * Clear existing environment variables...
42*5e7646d2SAndroid Build Coastguard Worker   */
43*5e7646d2SAndroid Build Coastguard Worker 
44*5e7646d2SAndroid Build Coastguard Worker   clear_env();
45*5e7646d2SAndroid Build Coastguard Worker 
46*5e7646d2SAndroid Build Coastguard Worker #if defined(__APPLE__)
47*5e7646d2SAndroid Build Coastguard Worker  /*
48*5e7646d2SAndroid Build Coastguard Worker   * Add special voodoo magic for macOS - this allows macOS
49*5e7646d2SAndroid Build Coastguard Worker   * programs to access their bundle resources properly...
50*5e7646d2SAndroid Build Coastguard Worker   *
51*5e7646d2SAndroid Build Coastguard Worker   * This string is replaced in cupsdStartProcess()...
52*5e7646d2SAndroid Build Coastguard Worker   */
53*5e7646d2SAndroid Build Coastguard Worker 
54*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(common_env, "<CFProcessPath>");
55*5e7646d2SAndroid Build Coastguard Worker   num_common_env = 1;
56*5e7646d2SAndroid Build Coastguard Worker #endif	/* __APPLE__ */
57*5e7646d2SAndroid Build Coastguard Worker }
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker 
60*5e7646d2SAndroid Build Coastguard Worker /*
61*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdLoadEnv()' - Copy common environment variables into an array.
62*5e7646d2SAndroid Build Coastguard Worker  */
63*5e7646d2SAndroid Build Coastguard Worker 
64*5e7646d2SAndroid Build Coastguard Worker int					/* O - Number of environment variables */
cupsdLoadEnv(char * envp[],int envmax)65*5e7646d2SAndroid Build Coastguard Worker cupsdLoadEnv(char *envp[],		/* I - Environment array */
66*5e7646d2SAndroid Build Coastguard Worker              int  envmax)		/* I - Maximum number of elements */
67*5e7646d2SAndroid Build Coastguard Worker {
68*5e7646d2SAndroid Build Coastguard Worker   int	i;				/* Looping var */
69*5e7646d2SAndroid Build Coastguard Worker 
70*5e7646d2SAndroid Build Coastguard Worker 
71*5e7646d2SAndroid Build Coastguard Worker  /*
72*5e7646d2SAndroid Build Coastguard Worker   * Leave room for a NULL pointer at the end...
73*5e7646d2SAndroid Build Coastguard Worker   */
74*5e7646d2SAndroid Build Coastguard Worker 
75*5e7646d2SAndroid Build Coastguard Worker   envmax --;
76*5e7646d2SAndroid Build Coastguard Worker 
77*5e7646d2SAndroid Build Coastguard Worker  /*
78*5e7646d2SAndroid Build Coastguard Worker   * Copy pointers to the environment...
79*5e7646d2SAndroid Build Coastguard Worker   */
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < num_common_env && i < envmax; i ++)
82*5e7646d2SAndroid Build Coastguard Worker     envp[i] = common_env[i];
83*5e7646d2SAndroid Build Coastguard Worker 
84*5e7646d2SAndroid Build Coastguard Worker  /*
85*5e7646d2SAndroid Build Coastguard Worker   * NULL terminate the environment array and return the number of
86*5e7646d2SAndroid Build Coastguard Worker   * elements we added...
87*5e7646d2SAndroid Build Coastguard Worker   */
88*5e7646d2SAndroid Build Coastguard Worker 
89*5e7646d2SAndroid Build Coastguard Worker   envp[i] = NULL;
90*5e7646d2SAndroid Build Coastguard Worker 
91*5e7646d2SAndroid Build Coastguard Worker   return (i);
92*5e7646d2SAndroid Build Coastguard Worker }
93*5e7646d2SAndroid Build Coastguard Worker 
94*5e7646d2SAndroid Build Coastguard Worker 
95*5e7646d2SAndroid Build Coastguard Worker /*
96*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdSetEnv()' - Set a common environment variable.
97*5e7646d2SAndroid Build Coastguard Worker  */
98*5e7646d2SAndroid Build Coastguard Worker 
99*5e7646d2SAndroid Build Coastguard Worker void
cupsdSetEnv(const char * name,const char * value)100*5e7646d2SAndroid Build Coastguard Worker cupsdSetEnv(const char *name,		/* I - Name of variable */
101*5e7646d2SAndroid Build Coastguard Worker             const char *value)		/* I - Value of variable */
102*5e7646d2SAndroid Build Coastguard Worker {
103*5e7646d2SAndroid Build Coastguard Worker   int	i;				/* Index into environent array */
104*5e7646d2SAndroid Build Coastguard Worker 
105*5e7646d2SAndroid Build Coastguard Worker 
106*5e7646d2SAndroid Build Coastguard Worker  /*
107*5e7646d2SAndroid Build Coastguard Worker   * If "value" is NULL, try getting value from current environment...
108*5e7646d2SAndroid Build Coastguard Worker   */
109*5e7646d2SAndroid Build Coastguard Worker 
110*5e7646d2SAndroid Build Coastguard Worker   if (!value)
111*5e7646d2SAndroid Build Coastguard Worker     value = getenv(name);
112*5e7646d2SAndroid Build Coastguard Worker 
113*5e7646d2SAndroid Build Coastguard Worker   if (!value)
114*5e7646d2SAndroid Build Coastguard Worker     return;
115*5e7646d2SAndroid Build Coastguard Worker 
116*5e7646d2SAndroid Build Coastguard Worker  /*
117*5e7646d2SAndroid Build Coastguard Worker   * Do not allow dynamic linker variables when running as root...
118*5e7646d2SAndroid Build Coastguard Worker   */
119*5e7646d2SAndroid Build Coastguard Worker 
120*5e7646d2SAndroid Build Coastguard Worker   if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3)))
121*5e7646d2SAndroid Build Coastguard Worker     return;
122*5e7646d2SAndroid Build Coastguard Worker 
123*5e7646d2SAndroid Build Coastguard Worker  /*
124*5e7646d2SAndroid Build Coastguard Worker   * See if this variable has already been defined...
125*5e7646d2SAndroid Build Coastguard Worker   */
126*5e7646d2SAndroid Build Coastguard Worker 
127*5e7646d2SAndroid Build Coastguard Worker   if ((i = find_env(name)) < 0)
128*5e7646d2SAndroid Build Coastguard Worker   {
129*5e7646d2SAndroid Build Coastguard Worker    /*
130*5e7646d2SAndroid Build Coastguard Worker     * Check for room...
131*5e7646d2SAndroid Build Coastguard Worker     */
132*5e7646d2SAndroid Build Coastguard Worker 
133*5e7646d2SAndroid Build Coastguard Worker     if (num_common_env >= (int)(sizeof(common_env) / sizeof(common_env[0])))
134*5e7646d2SAndroid Build Coastguard Worker     {
135*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
136*5e7646d2SAndroid Build Coastguard Worker                       "cupsdSetEnv: Too many environment variables set!");
137*5e7646d2SAndroid Build Coastguard Worker       return;
138*5e7646d2SAndroid Build Coastguard Worker     }
139*5e7646d2SAndroid Build Coastguard Worker 
140*5e7646d2SAndroid Build Coastguard Worker     i = num_common_env;
141*5e7646d2SAndroid Build Coastguard Worker     num_common_env ++;
142*5e7646d2SAndroid Build Coastguard Worker   }
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker  /*
145*5e7646d2SAndroid Build Coastguard Worker   * Set the new environment variable...
146*5e7646d2SAndroid Build Coastguard Worker   */
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker   cupsdSetStringf(common_env + i, "%s=%s", name, value);
149*5e7646d2SAndroid Build Coastguard Worker 
150*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetEnv: %s", common_env[i]);
151*5e7646d2SAndroid Build Coastguard Worker }
152*5e7646d2SAndroid Build Coastguard Worker 
153*5e7646d2SAndroid Build Coastguard Worker 
154*5e7646d2SAndroid Build Coastguard Worker /*
155*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdSetEnvf()' - Set a formatted common environment variable.
156*5e7646d2SAndroid Build Coastguard Worker  */
157*5e7646d2SAndroid Build Coastguard Worker 
158*5e7646d2SAndroid Build Coastguard Worker void
cupsdSetEnvf(const char * name,const char * value,...)159*5e7646d2SAndroid Build Coastguard Worker cupsdSetEnvf(const char *name,		/* I - Name of variable */
160*5e7646d2SAndroid Build Coastguard Worker              const char *value,		/* I - Printf-style value of variable */
161*5e7646d2SAndroid Build Coastguard Worker 	     ...)			/* I - Additional args as needed */
162*5e7646d2SAndroid Build Coastguard Worker {
163*5e7646d2SAndroid Build Coastguard Worker   char		v[4096];		/* Formatting string value */
164*5e7646d2SAndroid Build Coastguard Worker   va_list	ap;			/* Argument pointer */
165*5e7646d2SAndroid Build Coastguard Worker 
166*5e7646d2SAndroid Build Coastguard Worker 
167*5e7646d2SAndroid Build Coastguard Worker  /*
168*5e7646d2SAndroid Build Coastguard Worker   * Format the value string...
169*5e7646d2SAndroid Build Coastguard Worker   */
170*5e7646d2SAndroid Build Coastguard Worker 
171*5e7646d2SAndroid Build Coastguard Worker   va_start(ap, value);
172*5e7646d2SAndroid Build Coastguard Worker   vsnprintf(v, sizeof(v), value, ap);
173*5e7646d2SAndroid Build Coastguard Worker   va_end(ap);
174*5e7646d2SAndroid Build Coastguard Worker 
175*5e7646d2SAndroid Build Coastguard Worker  /*
176*5e7646d2SAndroid Build Coastguard Worker   * Set the env variable...
177*5e7646d2SAndroid Build Coastguard Worker   */
178*5e7646d2SAndroid Build Coastguard Worker 
179*5e7646d2SAndroid Build Coastguard Worker   cupsdSetEnv(name, v);
180*5e7646d2SAndroid Build Coastguard Worker }
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker 
183*5e7646d2SAndroid Build Coastguard Worker /*
184*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdUpdateEnv()' - Update the environment for the configured directories.
185*5e7646d2SAndroid Build Coastguard Worker  */
186*5e7646d2SAndroid Build Coastguard Worker 
187*5e7646d2SAndroid Build Coastguard Worker void
cupsdUpdateEnv(void)188*5e7646d2SAndroid Build Coastguard Worker cupsdUpdateEnv(void)
189*5e7646d2SAndroid Build Coastguard Worker {
190*5e7646d2SAndroid Build Coastguard Worker  /*
191*5e7646d2SAndroid Build Coastguard Worker   * Set common variables...
192*5e7646d2SAndroid Build Coastguard Worker   */
193*5e7646d2SAndroid Build Coastguard Worker 
194*5e7646d2SAndroid Build Coastguard Worker #define set_if_undefined(name,value) if (find_env(name) < 0) cupsdSetEnv(name,value)
195*5e7646d2SAndroid Build Coastguard Worker 
196*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_CACHEDIR", CacheDir);
197*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_DATADIR", DataDir);
198*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_DOCROOT", DocumentRoot);
199*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_FONTPATH", FontPath);
200*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_REQUESTROOT", RequestRoot);
201*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_SERVERBIN", ServerBin);
202*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_SERVERROOT", ServerRoot);
203*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("CUPS_STATEDIR", StateDir);
204*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("DYLD_INSERT_LIBRARIES", NULL);
205*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("DYLD_LIBRARY_PATH", NULL);
206*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("HOME", TempDir);
207*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("LD_ASSUME_KERNEL", NULL);
208*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("LD_LIBRARY_PATH", NULL);
209*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("LD_PRELOAD", NULL);
210*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("NLSPATH", NULL);
211*5e7646d2SAndroid Build Coastguard Worker   if (find_env("PATH") < 0)
212*5e7646d2SAndroid Build Coastguard Worker     cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
213*5e7646d2SAndroid Build Coastguard Worker 			 ":/bin:/usr/bin", ServerBin);
214*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("SERVER_ADMIN", ServerAdmin);
215*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("SHLIB_PATH", NULL);
216*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("SOFTWARE", CUPS_MINIMAL);
217*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("TMPDIR", TempDir);
218*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("TZ", NULL);
219*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("USER", "root");
220*5e7646d2SAndroid Build Coastguard Worker   set_if_undefined("VG_ARGS", NULL);
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker   cupsdSetEnvf("CUPS_MAX_MESSAGE", "%d", CUPSD_SB_BUFFER_SIZE - 1);
223*5e7646d2SAndroid Build Coastguard Worker }
224*5e7646d2SAndroid Build Coastguard Worker 
225*5e7646d2SAndroid Build Coastguard Worker 
226*5e7646d2SAndroid Build Coastguard Worker /*
227*5e7646d2SAndroid Build Coastguard Worker  * 'clear_env()' - Clear common environment variables.
228*5e7646d2SAndroid Build Coastguard Worker  */
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker static void
clear_env(void)231*5e7646d2SAndroid Build Coastguard Worker clear_env(void)
232*5e7646d2SAndroid Build Coastguard Worker {
233*5e7646d2SAndroid Build Coastguard Worker   int	i;				/* Looping var */
234*5e7646d2SAndroid Build Coastguard Worker 
235*5e7646d2SAndroid Build Coastguard Worker 
236*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < num_common_env; i ++)
237*5e7646d2SAndroid Build Coastguard Worker     cupsdClearString(common_env + i);
238*5e7646d2SAndroid Build Coastguard Worker 
239*5e7646d2SAndroid Build Coastguard Worker   num_common_env = 0;
240*5e7646d2SAndroid Build Coastguard Worker }
241*5e7646d2SAndroid Build Coastguard Worker 
242*5e7646d2SAndroid Build Coastguard Worker 
243*5e7646d2SAndroid Build Coastguard Worker /*
244*5e7646d2SAndroid Build Coastguard Worker  * 'find_env()' - Find a common environment variable.
245*5e7646d2SAndroid Build Coastguard Worker  */
246*5e7646d2SAndroid Build Coastguard Worker 
247*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Index or -1 if not found */
find_env(const char * name)248*5e7646d2SAndroid Build Coastguard Worker find_env(const char *name)		/* I - Variable name */
249*5e7646d2SAndroid Build Coastguard Worker {
250*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
251*5e7646d2SAndroid Build Coastguard Worker   size_t	namelen;		/* Length of name */
252*5e7646d2SAndroid Build Coastguard Worker 
253*5e7646d2SAndroid Build Coastguard Worker 
254*5e7646d2SAndroid Build Coastguard Worker   for (i = 0, namelen = strlen(name); i < num_common_env; i ++)
255*5e7646d2SAndroid Build Coastguard Worker     if (!strncmp(common_env[i], name, namelen) && common_env[i][namelen] == '=')
256*5e7646d2SAndroid Build Coastguard Worker       return (i);
257*5e7646d2SAndroid Build Coastguard Worker 
258*5e7646d2SAndroid Build Coastguard Worker   return (-1);
259*5e7646d2SAndroid Build Coastguard Worker }
260