15c51f124SMoriah Waterland /* 25c51f124SMoriah Waterland * CDDL HEADER START 35c51f124SMoriah Waterland * 45c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 55c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 65c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 75c51f124SMoriah Waterland * 85c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 105c51f124SMoriah Waterland * See the License for the specific language governing permissions 115c51f124SMoriah Waterland * and limitations under the License. 125c51f124SMoriah Waterland * 135c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 145c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 165c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 175c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 185c51f124SMoriah Waterland * 195c51f124SMoriah Waterland * CDDL HEADER END 205c51f124SMoriah Waterland */ 215c51f124SMoriah Waterland 225c51f124SMoriah Waterland /* 23*6e1ae2a3SGary Pennington * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 245c51f124SMoriah Waterland */ 255c51f124SMoriah Waterland 265c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 275c51f124SMoriah Waterland /* All Rights Reserved */ 285c51f124SMoriah Waterland 295c51f124SMoriah Waterland 305c51f124SMoriah Waterland #include <stdio.h> 315c51f124SMoriah Waterland #include <limits.h> 325c51f124SMoriah Waterland #include <stdlib.h> 335c51f124SMoriah Waterland #include <unistd.h> 345c51f124SMoriah Waterland #include <string.h> 355c51f124SMoriah Waterland #include <fcntl.h> 365c51f124SMoriah Waterland #include <sys/types.h> 375c51f124SMoriah Waterland #include <sys/stat.h> 385c51f124SMoriah Waterland #include <signal.h> 395c51f124SMoriah Waterland #include <errno.h> 405c51f124SMoriah Waterland #include <assert.h> 415c51f124SMoriah Waterland #include <pkgdev.h> 425c51f124SMoriah Waterland #include <pkginfo.h> 435c51f124SMoriah Waterland #include <pkglocs.h> 445c51f124SMoriah Waterland #include <locale.h> 455c51f124SMoriah Waterland #include <libintl.h> 465c51f124SMoriah Waterland #include <instzones_api.h> 475c51f124SMoriah Waterland #include <pkglib.h> 485c51f124SMoriah Waterland #include <install.h> 495c51f124SMoriah Waterland #include <libinst.h> 505c51f124SMoriah Waterland #include <libadm.h> 515c51f124SMoriah Waterland #include <messages.h> 525c51f124SMoriah Waterland 535c51f124SMoriah Waterland static char *localeNames[] = { 545c51f124SMoriah Waterland "LC_CTYPE", 555c51f124SMoriah Waterland "LC_NUMERIC", 565c51f124SMoriah Waterland "LC_TIME", 575c51f124SMoriah Waterland "LC_COLLATE", 585c51f124SMoriah Waterland "LC_MESSAGES", 595c51f124SMoriah Waterland "LC_MONETARY", 605c51f124SMoriah Waterland "LC_ALL", 615c51f124SMoriah Waterland "LANG", 625c51f124SMoriah Waterland "TZ", 635c51f124SMoriah Waterland NULL 645c51f124SMoriah Waterland }; 655c51f124SMoriah Waterland 665c51f124SMoriah Waterland #define NUM_LOCALE_TYPES 100 675c51f124SMoriah Waterland 685c51f124SMoriah Waterland static char *envPtr[NUM_LOCALE_TYPES]; 695c51f124SMoriah Waterland 705c51f124SMoriah Waterland /* 715c51f124SMoriah Waterland * extern declarations 725c51f124SMoriah Waterland */ 735c51f124SMoriah Waterland 745c51f124SMoriah Waterland extern char **environ; 755c51f124SMoriah Waterland 765c51f124SMoriah Waterland /* 775c51f124SMoriah Waterland * this is the initial and incremental allocation used to 785c51f124SMoriah Waterland * populate the environment "environ" 795c51f124SMoriah Waterland */ 805c51f124SMoriah Waterland 815c51f124SMoriah Waterland #define MALSIZ 64 825c51f124SMoriah Waterland 835c51f124SMoriah Waterland void 845c51f124SMoriah Waterland putparam(char *param, char *value) 855c51f124SMoriah Waterland { 865c51f124SMoriah Waterland char *pt; 875c51f124SMoriah Waterland int ptlen; 885c51f124SMoriah Waterland int i, n; 895c51f124SMoriah Waterland 905c51f124SMoriah Waterland /* 915c51f124SMoriah Waterland * If the environment is NULL, allocate space for the 925c51f124SMoriah Waterland * character pointers. 935c51f124SMoriah Waterland */ 945c51f124SMoriah Waterland if (environ == NULL) { 955c51f124SMoriah Waterland environ = (char **)calloc(MALSIZ, sizeof (char *)); 965c51f124SMoriah Waterland if (environ == NULL) { 975c51f124SMoriah Waterland progerr(gettext(ERR_MEMORY), errno); 985c51f124SMoriah Waterland quit(99); 995c51f124SMoriah Waterland } 1005c51f124SMoriah Waterland } 1015c51f124SMoriah Waterland 1025c51f124SMoriah Waterland /* 1035c51f124SMoriah Waterland * If this parameter is already in place and it has a different 1045c51f124SMoriah Waterland * value, clear the old value by freeing the memory previously 1055c51f124SMoriah Waterland * allocated. Otherwise, we leave well-enough alone. 1065c51f124SMoriah Waterland */ 1075c51f124SMoriah Waterland n = strlen(param); 1085c51f124SMoriah Waterland for (i = 0; environ[i]; i++) { 1095c51f124SMoriah Waterland if (strncmp(environ[i], param, n) == 0 && 1105c51f124SMoriah Waterland (environ[i][n] == '=')) { 1115c51f124SMoriah Waterland if (strcmp((environ[i]) + n + 1, value) == 0) 1125c51f124SMoriah Waterland return; 1135c51f124SMoriah Waterland else { 1145c51f124SMoriah Waterland free(environ[i]); 1155c51f124SMoriah Waterland break; 1165c51f124SMoriah Waterland } 1175c51f124SMoriah Waterland } 1185c51f124SMoriah Waterland } 1195c51f124SMoriah Waterland 1205c51f124SMoriah Waterland /* Allocate space for the new environment entry. */ 1215c51f124SMoriah Waterland ptlen = (strlen(param)+strlen(value)+2)*(sizeof (char)); 1225c51f124SMoriah Waterland pt = (char *)calloc(strlen(param)+strlen(value)+2, sizeof (char)); 1235c51f124SMoriah Waterland if (pt == NULL) { 1245c51f124SMoriah Waterland progerr(gettext(ERR_MEMORY), errno); 1255c51f124SMoriah Waterland quit(99); 1265c51f124SMoriah Waterland } 1275c51f124SMoriah Waterland 1285c51f124SMoriah Waterland /* 1295c51f124SMoriah Waterland * Put the statement into the allocated space and point the 1305c51f124SMoriah Waterland * environment entry at it. 1315c51f124SMoriah Waterland */ 1325c51f124SMoriah Waterland (void) snprintf(pt, ptlen, "%s=%s", param, value); 1335c51f124SMoriah Waterland if (environ[i]) { 1345c51f124SMoriah Waterland environ[i] = pt; 1355c51f124SMoriah Waterland return; 1365c51f124SMoriah Waterland } 1375c51f124SMoriah Waterland 1385c51f124SMoriah Waterland /* 1395c51f124SMoriah Waterland * With this parameter in place, if we're at the end of the 1405c51f124SMoriah Waterland * allocated environment then allocate more space. 1415c51f124SMoriah Waterland */ 1425c51f124SMoriah Waterland environ[i++] = pt; 1435c51f124SMoriah Waterland if ((i % MALSIZ) == 0) { 1445c51f124SMoriah Waterland environ = (char **)realloc((void *)environ, 1455c51f124SMoriah Waterland (i+MALSIZ)*sizeof (char *)); 1465c51f124SMoriah Waterland if (environ == NULL) { 1475c51f124SMoriah Waterland progerr(gettext(ERR_MEMORY), errno); 1485c51f124SMoriah Waterland quit(1); 1495c51f124SMoriah Waterland } 1505c51f124SMoriah Waterland } 1515c51f124SMoriah Waterland 1525c51f124SMoriah Waterland /* Terminate the environment properly. */ 1535c51f124SMoriah Waterland environ[i] = (char *)NULL; 1545c51f124SMoriah Waterland } 1555c51f124SMoriah Waterland 1565c51f124SMoriah Waterland /* bugid 4279039 */ 1575c51f124SMoriah Waterland void 1585c51f124SMoriah Waterland getuserlocale(void) 1595c51f124SMoriah Waterland { 1605c51f124SMoriah Waterland int i; 1615c51f124SMoriah Waterland 1625c51f124SMoriah Waterland for (i = 0; (localeNames[i] != NULL) && (i < NUM_LOCALE_TYPES); i++) { 1635c51f124SMoriah Waterland envPtr[i] = getenv(localeNames[i]); 1645c51f124SMoriah Waterland if (envPtr[i]) { 1655c51f124SMoriah Waterland putparam(localeNames[i], envPtr[i]); 1665c51f124SMoriah Waterland } 1675c51f124SMoriah Waterland } 1685c51f124SMoriah Waterland } 1695c51f124SMoriah Waterland 1705c51f124SMoriah Waterland /* bugid 4279039 */ 1715c51f124SMoriah Waterland void 1725c51f124SMoriah Waterland putuserlocale(void) 1735c51f124SMoriah Waterland { 1745c51f124SMoriah Waterland int i; 1755c51f124SMoriah Waterland 1765c51f124SMoriah Waterland for (i = 0; (localeNames[i] != NULL) && (i < NUM_LOCALE_TYPES); i++) { 1775c51f124SMoriah Waterland if (envPtr[i]) { 1785c51f124SMoriah Waterland putparam(localeNames[i], envPtr[i]); 1795c51f124SMoriah Waterland } 1805c51f124SMoriah Waterland } 1815c51f124SMoriah Waterland } 1825c51f124SMoriah Waterland 1835c51f124SMoriah Waterland /* 1845c51f124SMoriah Waterland * Name: putConditionInfo 1855c51f124SMoriah Waterland * Description: put parent "condition" information to environment 1865c51f124SMoriah Waterland * Arguments: a_parentZoneName - name of the parent zone 1875c51f124SMoriah Waterland * == NULL - no name 1885c51f124SMoriah Waterland * a_parentZoneType - parent zone "type" 1895c51f124SMoriah Waterland * == NULL - no type 1905c51f124SMoriah Waterland * Returns: void 1915c51f124SMoriah Waterland */ 1925c51f124SMoriah Waterland 1935c51f124SMoriah Waterland void 1945c51f124SMoriah Waterland putConditionInfo(char *a_parentZoneName, char *a_parentZoneType) 1955c51f124SMoriah Waterland { 1965c51f124SMoriah Waterland char *p; 1975c51f124SMoriah Waterland char *pa; 1985c51f124SMoriah Waterland SML_TAG *tag = SML_TAG__NULL; 1995c51f124SMoriah Waterland SML_TAG *ntag; 2005c51f124SMoriah Waterland 2015c51f124SMoriah Waterland /* entry debugging info */ 2025c51f124SMoriah Waterland 2035c51f124SMoriah Waterland echoDebug(DBG_PUTPARAM_PUTCONDINFO_ENTRY); 2045c51f124SMoriah Waterland 2055c51f124SMoriah Waterland /* 2065c51f124SMoriah Waterland * create tag to hold condition information: 2075c51f124SMoriah Waterland * <environmentConditionInformation> 2085c51f124SMoriah Waterland * <parentZone zoneName=<?> zoneType=<?>/> 2095c51f124SMoriah Waterland * <currentZone zoneName=<?> zoneType=<?>/> 2105c51f124SMoriah Waterland * </environmentConditionInformation> 2115c51f124SMoriah Waterland */ 2125c51f124SMoriah Waterland 2135c51f124SMoriah Waterland tag = smlNewTag(TAG_COND_TOPLEVEL); 2145c51f124SMoriah Waterland 2155c51f124SMoriah Waterland /* 2165c51f124SMoriah Waterland * information about pkgadd or pkgrm environment 2175c51f124SMoriah Waterland * <parentZone zoneName=<?> zoneType=<?>/> 2185c51f124SMoriah Waterland */ 2195c51f124SMoriah Waterland 2205c51f124SMoriah Waterland /* allocate tag for parent info */ 2215c51f124SMoriah Waterland 2225c51f124SMoriah Waterland ntag = smlNewTag(TAG_COND_PARENT_ZONE); 2235c51f124SMoriah Waterland 2245c51f124SMoriah Waterland /* parent zone name */ 2255c51f124SMoriah Waterland 2265c51f124SMoriah Waterland smlSetParam(ntag, TAG_COND_ZONE_NAME, 2275c51f124SMoriah Waterland a_parentZoneName ? a_parentZoneName : ""); 2285c51f124SMoriah Waterland 2295c51f124SMoriah Waterland /* parent zone info */ 2305c51f124SMoriah Waterland 2315c51f124SMoriah Waterland smlSetParam(ntag, TAG_COND_ZONE_TYPE, 2325c51f124SMoriah Waterland a_parentZoneType ? a_parentZoneType : ""); 2335c51f124SMoriah Waterland 2345c51f124SMoriah Waterland /* add to top level tag */ 2355c51f124SMoriah Waterland 2365c51f124SMoriah Waterland (void) smlAddTag(&tag, -1, ntag); 2375c51f124SMoriah Waterland free(ntag); 2385c51f124SMoriah Waterland 2395c51f124SMoriah Waterland /* 2405c51f124SMoriah Waterland * information about pkginstall or pkgremove environment 2415c51f124SMoriah Waterland * <currentZone zoneName=<?> zoneType=<?>/> 2425c51f124SMoriah Waterland */ 2435c51f124SMoriah Waterland 2445c51f124SMoriah Waterland /* allocate tag for parent info */ 2455c51f124SMoriah Waterland 2465c51f124SMoriah Waterland ntag = smlNewTag(TAG_COND_CURRENT_ZONE); 2475c51f124SMoriah Waterland 2485c51f124SMoriah Waterland /* current zone name */ 2495c51f124SMoriah Waterland 2505c51f124SMoriah Waterland p = z_get_zonename(); 2515c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) { 2525c51f124SMoriah Waterland smlSetParam(ntag, TAG_COND_ZONE_NAME, p); 2535c51f124SMoriah Waterland free(p); 2545c51f124SMoriah Waterland } 2555c51f124SMoriah Waterland 2565c51f124SMoriah Waterland /* current zone type */ 2575c51f124SMoriah Waterland 2585c51f124SMoriah Waterland smlSetParam(ntag, TAG_COND_ZONE_TYPE, 2595c51f124SMoriah Waterland z_running_in_global_zone() == B_TRUE ? 2605c51f124SMoriah Waterland TAG_VALUE_GLOBAL_ZONE : TAG_VALUE_NONGLOBAL_ZONE); 2615c51f124SMoriah Waterland 2625c51f124SMoriah Waterland /* add to top level tag */ 2635c51f124SMoriah Waterland 2645c51f124SMoriah Waterland (void) smlAddTag(&tag, -1, ntag); 2655c51f124SMoriah Waterland free(ntag); 2665c51f124SMoriah Waterland 2675c51f124SMoriah Waterland /* 2685c51f124SMoriah Waterland * done filling in tag - convert to string and place in environment 2695c51f124SMoriah Waterland */ 2705c51f124SMoriah Waterland 2715c51f124SMoriah Waterland p = smlConvertTagToString(tag); 2725c51f124SMoriah Waterland 2735c51f124SMoriah Waterland /* convert all new-line characters to space */ 2745c51f124SMoriah Waterland 2755c51f124SMoriah Waterland for (pa = p; *pa != '\0'; pa++) { 2765c51f124SMoriah Waterland if (*pa == '\n') { 2775c51f124SMoriah Waterland *pa = ' '; 2785c51f124SMoriah Waterland } 2795c51f124SMoriah Waterland } 2805c51f124SMoriah Waterland 2815c51f124SMoriah Waterland echoDebug(DBG_PUTPARAM_PUTCONDINFO_EXIT, p); 2825c51f124SMoriah Waterland 2835c51f124SMoriah Waterland putparam(PKGCOND_GLOBAL_VARIABLE, p); 2845c51f124SMoriah Waterland } 285