xref: /titanic_50/usr/src/cmd/svr4pkg/libinst/putparam.c (revision 5c51f1241dbbdf2656d0e10011981411ed0c9673)
1*5c51f124SMoriah Waterland /*
2*5c51f124SMoriah Waterland  * CDDL HEADER START
3*5c51f124SMoriah Waterland  *
4*5c51f124SMoriah Waterland  * The contents of this file are subject to the terms of the
5*5c51f124SMoriah Waterland  * Common Development and Distribution License (the "License").
6*5c51f124SMoriah Waterland  * You may not use this file except in compliance with the License.
7*5c51f124SMoriah Waterland  *
8*5c51f124SMoriah Waterland  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5c51f124SMoriah Waterland  * or http://www.opensolaris.org/os/licensing.
10*5c51f124SMoriah Waterland  * See the License for the specific language governing permissions
11*5c51f124SMoriah Waterland  * and limitations under the License.
12*5c51f124SMoriah Waterland  *
13*5c51f124SMoriah Waterland  * When distributing Covered Code, include this CDDL HEADER in each
14*5c51f124SMoriah Waterland  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5c51f124SMoriah Waterland  * If applicable, add the following below this CDDL HEADER, with the
16*5c51f124SMoriah Waterland  * fields enclosed by brackets "[]" replaced with your own identifying
17*5c51f124SMoriah Waterland  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5c51f124SMoriah Waterland  *
19*5c51f124SMoriah Waterland  * CDDL HEADER END
20*5c51f124SMoriah Waterland  */
21*5c51f124SMoriah Waterland 
22*5c51f124SMoriah Waterland /*
23*5c51f124SMoriah Waterland  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*5c51f124SMoriah Waterland  * Use is subject to license terms.
25*5c51f124SMoriah Waterland  */
26*5c51f124SMoriah Waterland 
27*5c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28*5c51f124SMoriah Waterland /* All Rights Reserved */
29*5c51f124SMoriah Waterland 
30*5c51f124SMoriah Waterland 
31*5c51f124SMoriah Waterland #include <stdio.h>
32*5c51f124SMoriah Waterland #include <limits.h>
33*5c51f124SMoriah Waterland #include <stdlib.h>
34*5c51f124SMoriah Waterland #include <unistd.h>
35*5c51f124SMoriah Waterland #include <string.h>
36*5c51f124SMoriah Waterland #include <fcntl.h>
37*5c51f124SMoriah Waterland #include <sys/types.h>
38*5c51f124SMoriah Waterland #include <sys/stat.h>
39*5c51f124SMoriah Waterland #include <signal.h>
40*5c51f124SMoriah Waterland #include <errno.h>
41*5c51f124SMoriah Waterland #include <assert.h>
42*5c51f124SMoriah Waterland #include <pkgdev.h>
43*5c51f124SMoriah Waterland #include <pkginfo.h>
44*5c51f124SMoriah Waterland #include <pkglocs.h>
45*5c51f124SMoriah Waterland #include <locale.h>
46*5c51f124SMoriah Waterland #include <libintl.h>
47*5c51f124SMoriah Waterland #include <instzones_api.h>
48*5c51f124SMoriah Waterland #include <pkglib.h>
49*5c51f124SMoriah Waterland #include <install.h>
50*5c51f124SMoriah Waterland #include <libinst.h>
51*5c51f124SMoriah Waterland #include <libadm.h>
52*5c51f124SMoriah Waterland #include <messages.h>
53*5c51f124SMoriah Waterland 
54*5c51f124SMoriah Waterland static char *localeNames[] = {
55*5c51f124SMoriah Waterland 	"LC_CTYPE",
56*5c51f124SMoriah Waterland 	"LC_NUMERIC",
57*5c51f124SMoriah Waterland 	"LC_TIME",
58*5c51f124SMoriah Waterland 	"LC_COLLATE",
59*5c51f124SMoriah Waterland 	"LC_MESSAGES",
60*5c51f124SMoriah Waterland 	"LC_MONETARY",
61*5c51f124SMoriah Waterland 	"LC_ALL",
62*5c51f124SMoriah Waterland 	"LANG",
63*5c51f124SMoriah Waterland 	"TZ",
64*5c51f124SMoriah Waterland 	NULL
65*5c51f124SMoriah Waterland };
66*5c51f124SMoriah Waterland 
67*5c51f124SMoriah Waterland #define	NUM_LOCALE_TYPES	100
68*5c51f124SMoriah Waterland 
69*5c51f124SMoriah Waterland static char	*envPtr[NUM_LOCALE_TYPES];
70*5c51f124SMoriah Waterland 
71*5c51f124SMoriah Waterland /*
72*5c51f124SMoriah Waterland  * extern declarations
73*5c51f124SMoriah Waterland  */
74*5c51f124SMoriah Waterland 
75*5c51f124SMoriah Waterland extern char	**environ;
76*5c51f124SMoriah Waterland 
77*5c51f124SMoriah Waterland /*
78*5c51f124SMoriah Waterland  * this is the initial and incremental allocation used to
79*5c51f124SMoriah Waterland  * populate the environment "environ"
80*5c51f124SMoriah Waterland  */
81*5c51f124SMoriah Waterland 
82*5c51f124SMoriah Waterland #define	MALSIZ	64
83*5c51f124SMoriah Waterland 
84*5c51f124SMoriah Waterland void
85*5c51f124SMoriah Waterland putparam(char *param, char *value)
86*5c51f124SMoriah Waterland {
87*5c51f124SMoriah Waterland 	char	*pt;
88*5c51f124SMoriah Waterland 	int	ptlen;
89*5c51f124SMoriah Waterland 	int	i, n;
90*5c51f124SMoriah Waterland 
91*5c51f124SMoriah Waterland 	/*
92*5c51f124SMoriah Waterland 	 * If the environment is NULL, allocate space for the
93*5c51f124SMoriah Waterland 	 * character pointers.
94*5c51f124SMoriah Waterland 	 */
95*5c51f124SMoriah Waterland 	if (environ == NULL) {
96*5c51f124SMoriah Waterland 		environ = (char **)calloc(MALSIZ, sizeof (char *));
97*5c51f124SMoriah Waterland 		if (environ == NULL) {
98*5c51f124SMoriah Waterland 			progerr(gettext(ERR_MEMORY), errno);
99*5c51f124SMoriah Waterland 			quit(99);
100*5c51f124SMoriah Waterland 		}
101*5c51f124SMoriah Waterland 	}
102*5c51f124SMoriah Waterland 
103*5c51f124SMoriah Waterland 	/*
104*5c51f124SMoriah Waterland 	 * If this parameter is already in place and it has a different
105*5c51f124SMoriah Waterland 	 * value, clear the old value by freeing the memory previously
106*5c51f124SMoriah Waterland 	 * allocated. Otherwise, we leave well-enough alone.
107*5c51f124SMoriah Waterland 	 */
108*5c51f124SMoriah Waterland 	n = strlen(param);
109*5c51f124SMoriah Waterland 	for (i = 0; environ[i]; i++) {
110*5c51f124SMoriah Waterland 		if (strncmp(environ[i], param, n) == 0 &&
111*5c51f124SMoriah Waterland 		    (environ[i][n] == '=')) {
112*5c51f124SMoriah Waterland 			if (strcmp((environ[i]) + n + 1, value) == 0)
113*5c51f124SMoriah Waterland 				return;
114*5c51f124SMoriah Waterland 			else {
115*5c51f124SMoriah Waterland 				free(environ[i]);
116*5c51f124SMoriah Waterland 				break;
117*5c51f124SMoriah Waterland 			}
118*5c51f124SMoriah Waterland 		}
119*5c51f124SMoriah Waterland 	}
120*5c51f124SMoriah Waterland 
121*5c51f124SMoriah Waterland 	/* Allocate space for the new environment entry. */
122*5c51f124SMoriah Waterland 	ptlen = (strlen(param)+strlen(value)+2)*(sizeof (char));
123*5c51f124SMoriah Waterland 	pt = (char *)calloc(strlen(param)+strlen(value)+2, sizeof (char));
124*5c51f124SMoriah Waterland 	if (pt == NULL) {
125*5c51f124SMoriah Waterland 		progerr(gettext(ERR_MEMORY), errno);
126*5c51f124SMoriah Waterland 		quit(99);
127*5c51f124SMoriah Waterland 	}
128*5c51f124SMoriah Waterland 
129*5c51f124SMoriah Waterland 	/*
130*5c51f124SMoriah Waterland 	 * Put the statement into the allocated space and point the
131*5c51f124SMoriah Waterland 	 * environment entry at it.
132*5c51f124SMoriah Waterland 	 */
133*5c51f124SMoriah Waterland 	(void) snprintf(pt, ptlen, "%s=%s", param, value);
134*5c51f124SMoriah Waterland 	if (environ[i]) {
135*5c51f124SMoriah Waterland 		environ[i] = pt;
136*5c51f124SMoriah Waterland 		return;
137*5c51f124SMoriah Waterland 	}
138*5c51f124SMoriah Waterland 
139*5c51f124SMoriah Waterland 	/*
140*5c51f124SMoriah Waterland 	 * With this parameter in place, if we're at the end of the
141*5c51f124SMoriah Waterland 	 * allocated environment then allocate more space.
142*5c51f124SMoriah Waterland 	 */
143*5c51f124SMoriah Waterland 	environ[i++] = pt;
144*5c51f124SMoriah Waterland 	if ((i % MALSIZ) == 0) {
145*5c51f124SMoriah Waterland 		environ = (char **)realloc((void *)environ,
146*5c51f124SMoriah Waterland 			(i+MALSIZ)*sizeof (char *));
147*5c51f124SMoriah Waterland 		if (environ == NULL) {
148*5c51f124SMoriah Waterland 			progerr(gettext(ERR_MEMORY), errno);
149*5c51f124SMoriah Waterland 			quit(1);
150*5c51f124SMoriah Waterland 		}
151*5c51f124SMoriah Waterland 	}
152*5c51f124SMoriah Waterland 
153*5c51f124SMoriah Waterland 	/* Terminate the environment properly. */
154*5c51f124SMoriah Waterland 	environ[i] = (char *)NULL;
155*5c51f124SMoriah Waterland }
156*5c51f124SMoriah Waterland 
157*5c51f124SMoriah Waterland /* bugid 4279039 */
158*5c51f124SMoriah Waterland void
159*5c51f124SMoriah Waterland getuserlocale(void)
160*5c51f124SMoriah Waterland {
161*5c51f124SMoriah Waterland 	int i;
162*5c51f124SMoriah Waterland 
163*5c51f124SMoriah Waterland 	for (i = 0; (localeNames[i] != NULL) && (i < NUM_LOCALE_TYPES); i++) {
164*5c51f124SMoriah Waterland 		envPtr[i] = getenv(localeNames[i]);
165*5c51f124SMoriah Waterland 		if (envPtr[i]) {
166*5c51f124SMoriah Waterland 			putparam(localeNames[i], envPtr[i]);
167*5c51f124SMoriah Waterland 		}
168*5c51f124SMoriah Waterland 	}
169*5c51f124SMoriah Waterland }
170*5c51f124SMoriah Waterland 
171*5c51f124SMoriah Waterland /* bugid 4279039 */
172*5c51f124SMoriah Waterland void
173*5c51f124SMoriah Waterland putuserlocale(void)
174*5c51f124SMoriah Waterland {
175*5c51f124SMoriah Waterland 	int i;
176*5c51f124SMoriah Waterland 
177*5c51f124SMoriah Waterland 	for (i = 0; (localeNames[i] != NULL) && (i < NUM_LOCALE_TYPES); i++) {
178*5c51f124SMoriah Waterland 		if (envPtr[i]) {
179*5c51f124SMoriah Waterland 			putparam(localeNames[i], envPtr[i]);
180*5c51f124SMoriah Waterland 		}
181*5c51f124SMoriah Waterland 	}
182*5c51f124SMoriah Waterland }
183*5c51f124SMoriah Waterland 
184*5c51f124SMoriah Waterland /*
185*5c51f124SMoriah Waterland  * Name:	putConditionInfo
186*5c51f124SMoriah Waterland  * Description:	put parent "condition" information to environment
187*5c51f124SMoriah Waterland  * Arguments:	a_parentZoneName - name of the parent zone
188*5c51f124SMoriah Waterland  *			== NULL - no name
189*5c51f124SMoriah Waterland  *		a_parentZoneType - parent zone "type"
190*5c51f124SMoriah Waterland  *			== NULL - no type
191*5c51f124SMoriah Waterland  * Returns:	void
192*5c51f124SMoriah Waterland  */
193*5c51f124SMoriah Waterland 
194*5c51f124SMoriah Waterland void
195*5c51f124SMoriah Waterland putConditionInfo(char *a_parentZoneName, char *a_parentZoneType)
196*5c51f124SMoriah Waterland {
197*5c51f124SMoriah Waterland 	char	**pp;
198*5c51f124SMoriah Waterland 	char	*p;
199*5c51f124SMoriah Waterland 	char	*pa;
200*5c51f124SMoriah Waterland 	SML_TAG	*tag = SML_TAG__NULL;
201*5c51f124SMoriah Waterland 	SML_TAG	*ntag;
202*5c51f124SMoriah Waterland 
203*5c51f124SMoriah Waterland 	/* entry debugging info */
204*5c51f124SMoriah Waterland 
205*5c51f124SMoriah Waterland 	echoDebug(DBG_PUTPARAM_PUTCONDINFO_ENTRY);
206*5c51f124SMoriah Waterland 
207*5c51f124SMoriah Waterland 	/*
208*5c51f124SMoriah Waterland 	 * create tag to hold condition information:
209*5c51f124SMoriah Waterland 	 * <environmentConditionInformation>
210*5c51f124SMoriah Waterland 	 * <parentZone zoneName=<?> zoneType=<?>/>
211*5c51f124SMoriah Waterland 	 * <currentZone zoneName=<?> zoneType=<?>/>
212*5c51f124SMoriah Waterland 	 * <inheritedFileSystem fileSystemName=<?>/>
213*5c51f124SMoriah Waterland 	 * </environmentConditionInformation>
214*5c51f124SMoriah Waterland 	 */
215*5c51f124SMoriah Waterland 
216*5c51f124SMoriah Waterland 	tag = smlNewTag(TAG_COND_TOPLEVEL);
217*5c51f124SMoriah Waterland 
218*5c51f124SMoriah Waterland 	/*
219*5c51f124SMoriah Waterland 	 * information about pkgadd or pkgrm environment
220*5c51f124SMoriah Waterland 	 * <parentZone zoneName=<?> zoneType=<?>/>
221*5c51f124SMoriah Waterland 	 */
222*5c51f124SMoriah Waterland 
223*5c51f124SMoriah Waterland 	/* allocate tag for parent info */
224*5c51f124SMoriah Waterland 
225*5c51f124SMoriah Waterland 	ntag = smlNewTag(TAG_COND_PARENT_ZONE);
226*5c51f124SMoriah Waterland 
227*5c51f124SMoriah Waterland 	/* parent zone name */
228*5c51f124SMoriah Waterland 
229*5c51f124SMoriah Waterland 	smlSetParam(ntag, TAG_COND_ZONE_NAME,
230*5c51f124SMoriah Waterland 		a_parentZoneName ? a_parentZoneName : "");
231*5c51f124SMoriah Waterland 
232*5c51f124SMoriah Waterland 	/* parent zone info */
233*5c51f124SMoriah Waterland 
234*5c51f124SMoriah Waterland 	smlSetParam(ntag, TAG_COND_ZONE_TYPE,
235*5c51f124SMoriah Waterland 		a_parentZoneType ? a_parentZoneType : "");
236*5c51f124SMoriah Waterland 
237*5c51f124SMoriah Waterland 	/* add to top level tag */
238*5c51f124SMoriah Waterland 
239*5c51f124SMoriah Waterland 	(void) smlAddTag(&tag, -1, ntag);
240*5c51f124SMoriah Waterland 	free(ntag);
241*5c51f124SMoriah Waterland 
242*5c51f124SMoriah Waterland 	/*
243*5c51f124SMoriah Waterland 	 * information about pkginstall or pkgremove environment
244*5c51f124SMoriah Waterland 	 * <currentZone zoneName=<?> zoneType=<?>/>
245*5c51f124SMoriah Waterland 	 */
246*5c51f124SMoriah Waterland 
247*5c51f124SMoriah Waterland 	/* allocate tag for parent info */
248*5c51f124SMoriah Waterland 
249*5c51f124SMoriah Waterland 	ntag = smlNewTag(TAG_COND_CURRENT_ZONE);
250*5c51f124SMoriah Waterland 
251*5c51f124SMoriah Waterland 	/* current zone name */
252*5c51f124SMoriah Waterland 
253*5c51f124SMoriah Waterland 	p = z_get_zonename();
254*5c51f124SMoriah Waterland 	if ((p != NULL) && (*p != '\0')) {
255*5c51f124SMoriah Waterland 		smlSetParam(ntag, TAG_COND_ZONE_NAME, p);
256*5c51f124SMoriah Waterland 		free(p);
257*5c51f124SMoriah Waterland 	}
258*5c51f124SMoriah Waterland 
259*5c51f124SMoriah Waterland 	/* current zone type */
260*5c51f124SMoriah Waterland 
261*5c51f124SMoriah Waterland 	smlSetParam(ntag, TAG_COND_ZONE_TYPE,
262*5c51f124SMoriah Waterland 		z_running_in_global_zone() == B_TRUE ?
263*5c51f124SMoriah Waterland 			TAG_VALUE_GLOBAL_ZONE : TAG_VALUE_NONGLOBAL_ZONE);
264*5c51f124SMoriah Waterland 
265*5c51f124SMoriah Waterland 	/* add to top level tag */
266*5c51f124SMoriah Waterland 
267*5c51f124SMoriah Waterland 	(void) smlAddTag(&tag, -1, ntag);
268*5c51f124SMoriah Waterland 	free(ntag);
269*5c51f124SMoriah Waterland 
270*5c51f124SMoriah Waterland 	/*
271*5c51f124SMoriah Waterland 	 * describe any inherited file systems:
272*5c51f124SMoriah Waterland 	 * <inheritedFileSystem fileSystemName=<?>/>
273*5c51f124SMoriah Waterland 	 */
274*5c51f124SMoriah Waterland 
275*5c51f124SMoriah Waterland 	pp = z_get_inherited_file_systems();
276*5c51f124SMoriah Waterland 	if (pp != (char **)NULL) {
277*5c51f124SMoriah Waterland 		int n;
278*5c51f124SMoriah Waterland 		for (n = 0; pp[n] != (char *)NULL; n++) {
279*5c51f124SMoriah Waterland 			/* allocate tag for inherited file system info */
280*5c51f124SMoriah Waterland 
281*5c51f124SMoriah Waterland 			ntag = smlNewTag(TAG_COND_INHERITED_FS);
282*5c51f124SMoriah Waterland 
283*5c51f124SMoriah Waterland 			/* inherited file system */
284*5c51f124SMoriah Waterland 
285*5c51f124SMoriah Waterland 			smlSetParam(ntag, TAG_COND_FS_NAME, pp[n]);
286*5c51f124SMoriah Waterland 
287*5c51f124SMoriah Waterland 			/* add to top level tag */
288*5c51f124SMoriah Waterland 
289*5c51f124SMoriah Waterland 			(void) smlAddTag(&tag, -1, ntag);
290*5c51f124SMoriah Waterland 			free(ntag);
291*5c51f124SMoriah Waterland 		}
292*5c51f124SMoriah Waterland 	}
293*5c51f124SMoriah Waterland 
294*5c51f124SMoriah Waterland 	/*
295*5c51f124SMoriah Waterland 	 * done filling in tag - convert to string and place in environment
296*5c51f124SMoriah Waterland 	 */
297*5c51f124SMoriah Waterland 
298*5c51f124SMoriah Waterland 	p = smlConvertTagToString(tag);
299*5c51f124SMoriah Waterland 
300*5c51f124SMoriah Waterland 	/* convert all new-line characters to space */
301*5c51f124SMoriah Waterland 
302*5c51f124SMoriah Waterland 	for (pa = p; *pa != '\0'; pa++) {
303*5c51f124SMoriah Waterland 		if (*pa == '\n') {
304*5c51f124SMoriah Waterland 			*pa = ' ';
305*5c51f124SMoriah Waterland 		}
306*5c51f124SMoriah Waterland 	}
307*5c51f124SMoriah Waterland 
308*5c51f124SMoriah Waterland 	echoDebug(DBG_PUTPARAM_PUTCONDINFO_EXIT, p);
309*5c51f124SMoriah Waterland 
310*5c51f124SMoriah Waterland 	putparam(PKGCOND_GLOBAL_VARIABLE, p);
311*5c51f124SMoriah Waterland }
312