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