#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>
#include <assert.h>
#include <pkgdev.h>
#include <pkginfo.h>
#include <pkglocs.h>
#include <locale.h>
#include <libintl.h>
#include <instzones_api.h>
#include <pkglib.h>
#include <install.h>
#include <libinst.h>
#include <libadm.h>
#include <messages.h>
static char *localeNames[] = {
"LC_CTYPE",
"LC_NUMERIC",
"LC_TIME",
"LC_COLLATE",
"LC_MESSAGES",
"LC_MONETARY",
"LC_ALL",
"LANG",
"TZ",
NULL
};
#define NUM_LOCALE_TYPES 100
static char *envPtr[NUM_LOCALE_TYPES];
extern char **environ;
#define MALSIZ 64
void
putparam(char *param, char *value)
{
char *pt;
int ptlen;
int i, n;
if (environ == NULL) {
environ = (char **)calloc(MALSIZ, sizeof (char *));
if (environ == NULL) {
progerr(gettext(ERR_MEMORY), errno);
quit(99);
}
}
n = strlen(param);
for (i = 0; environ[i]; i++) {
if (strncmp(environ[i], param, n) == 0 &&
(environ[i][n] == '=')) {
if (strcmp((environ[i]) + n + 1, value) == 0)
return;
else {
free(environ[i]);
break;
}
}
}
ptlen = (strlen(param)+strlen(value)+2)*(sizeof (char));
pt = (char *)calloc(strlen(param)+strlen(value)+2, sizeof (char));
if (pt == NULL) {
progerr(gettext(ERR_MEMORY), errno);
quit(99);
}
(void) snprintf(pt, ptlen, "%s=%s", param, value);
if (environ[i]) {
environ[i] = pt;
return;
}
environ[i++] = pt;
if ((i % MALSIZ) == 0) {
environ = (char **)realloc((void *)environ,
(i+MALSIZ)*sizeof (char *));
if (environ == NULL) {
progerr(gettext(ERR_MEMORY), errno);
quit(1);
}
}
environ[i] = (char *)NULL;
}
void
getuserlocale(void)
{
int i;
for (i = 0; (localeNames[i] != NULL) && (i < NUM_LOCALE_TYPES); i++) {
envPtr[i] = getenv(localeNames[i]);
if (envPtr[i]) {
putparam(localeNames[i], envPtr[i]);
}
}
}
void
putuserlocale(void)
{
int i;
for (i = 0; (localeNames[i] != NULL) && (i < NUM_LOCALE_TYPES); i++) {
if (envPtr[i]) {
putparam(localeNames[i], envPtr[i]);
}
}
}
void
putConditionInfo(char *a_parentZoneName, char *a_parentZoneType)
{
char *p;
char *pa;
SML_TAG *tag = SML_TAG__NULL;
SML_TAG *ntag;
echoDebug(DBG_PUTPARAM_PUTCONDINFO_ENTRY);
tag = smlNewTag(TAG_COND_TOPLEVEL);
ntag = smlNewTag(TAG_COND_PARENT_ZONE);
smlSetParam(ntag, TAG_COND_ZONE_NAME,
a_parentZoneName ? a_parentZoneName : "");
smlSetParam(ntag, TAG_COND_ZONE_TYPE,
a_parentZoneType ? a_parentZoneType : "");
(void) smlAddTag(&tag, -1, ntag);
free(ntag);
ntag = smlNewTag(TAG_COND_CURRENT_ZONE);
p = z_get_zonename();
if ((p != NULL) && (*p != '\0')) {
smlSetParam(ntag, TAG_COND_ZONE_NAME, p);
free(p);
}
smlSetParam(ntag, TAG_COND_ZONE_TYPE,
z_running_in_global_zone() == B_TRUE ?
TAG_VALUE_GLOBAL_ZONE : TAG_VALUE_NONGLOBAL_ZONE);
(void) smlAddTag(&tag, -1, ntag);
free(ntag);
p = smlConvertTagToString(tag);
for (pa = p; *pa != '\0'; pa++) {
if (*pa == '\n') {
*pa = ' ';
}
}
echoDebug(DBG_PUTPARAM_PUTCONDINFO_EXIT, p);
putparam(PKGCOND_GLOBAL_VARIABLE, p);
}