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