usr/src/cmd/svc/startd/env.c
author eschrock
Fri, 26 Oct 2007 13:47:19 -0700
changeset 5345 44060de1d838
parent 1573 7338e65f2666
child 9263 48d14e1f550f
permissions -rw-r--r--
PSARC 2007/606 nvlist extensions 6608068 typo in ipmi_sdr_refresh() can cause segfault on allocation failure 6608069 libipmi should have support for user management 6608070 nvlist_lookup_nvpair() would be useful 6608094 nvlist_exists() would be useful 6608096 zprop_parse_value() should accept boolean values for boolean types 6608098 startd's fsminimal filesystem checks could be a little more explicit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <assert.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <libuutil.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <string.h>
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
    33
#include <zone.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include "startd.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * This file contains functions for setting the environment for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * processes started by svc.startd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#define	MAXCMDL		512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#define	DEF_PATH	"PATH=/usr/sbin:/usr/bin"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
static char *ENVFILE	= "/etc/default/init"; /* Default env. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
static char **glob_envp;	/* Array of environment strings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
static int glob_env_n;		/* Number of environment slots allocated. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
    52
static char zonename[ZONENAME_MAX];
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
    53
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * init_env()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 *   A clone of the work init.c does to provide as much compatibility
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *   for startup scripts as possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
init_env()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	int	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	char	line[MAXCMDL];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	FILE	*fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	int	inquotes, length, wslength;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	char	*tokp, *cp1, *cp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	char	**newp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	glob_env_n = 16;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	glob_envp = startd_alloc(sizeof (*glob_envp) * glob_env_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	glob_envp[0] = startd_alloc((unsigned)(strlen(DEF_PATH)+2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	(void) strcpy(glob_envp[0], DEF_PATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	if ((fp = fopen(ENVFILE, "r")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
		uu_warn("Cannot open %s. Environment not initialized.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
		    ENVFILE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
		glob_envp[1] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	i = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	while (fgets(line, MAXCMDL - 1, fp) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
		 * Toss newline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		length = strlen(line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
		if (line[length - 1] == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
			line[length - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		 * Ignore blank or comment lines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		if (line[0] == '#' || line[0] == '\0' ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		    (wslength = strspn(line, " \t\n")) == strlen(line) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		    strchr(line, '#') == line + wslength)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		 * First make a pass through the line and change
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		 * any non-quoted semi-colons to blanks so they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		 * will be treated as token separators below.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		inquotes = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		for (cp1 = line; *cp1 != '\0'; cp1++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
			if (*cp1 == '"') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
				if (inquotes == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
					inquotes = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
				else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
					inquotes = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
			} else if (*cp1 == ';') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
				if (inquotes == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
					*cp1 = ' ';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		 * Tokens within the line are separated by blanks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		 *  and tabs.  For each token in the line which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
		 * contains a '=' we strip out any quotes and then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		 * stick the token in the environment array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
		if ((tokp = strtok(line, " \t")) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
			cp1 = strchr(tokp, '=');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
			if (cp1 == NULL || cp1 == tokp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
			length = strlen(tokp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
			while ((cp1 = strpbrk(tokp, "\"\'")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
				for (cp2 = cp1; cp2 < &tokp[length]; cp2++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
					*cp2 = *(cp2 + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
				length--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			 * init already started us with this umask, and we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
			 * handled it in startd.c, so just skip it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			if (strncmp(tokp, "CMASK=", 6) == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			    strncmp(tokp, "SMF_", 4) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
			glob_envp[i] = startd_alloc((unsigned)(length + 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
			(void) strcpy(glob_envp[i], tokp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
			 * Double the environment size whenever it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
			 * full.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			if (++i == glob_env_n) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
				glob_env_n *= 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
				newp = startd_alloc(sizeof (*glob_envp) *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
				    glob_env_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
				(void) memcpy(newp, glob_envp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
				    sizeof (*glob_envp) * glob_env_n / 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
				startd_free(glob_envp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
				    sizeof (*glob_envp) * glob_env_n / 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
				glob_envp = newp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		} while ((tokp = strtok(NULL, " \t")) != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	startd_fclose(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	/* Append a null pointer to the environment array to mark its end. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	glob_envp[i] = NULL;
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   171
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   172
	/*
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   173
	 * Get the zonename once; it is used to set SMF_ZONENAME for methods.
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   174
	 */
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   175
	(void) getzonenamebyid(getzoneid(), zonename, sizeof (zonename));
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   176
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
valid_env_var(const char *var, const restarter_inst_t *inst, const char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	char *cp = strchr(var, '=');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	if (cp == NULL || cp == var) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		if (inst != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
			log_instance(inst, B_FALSE, "Invalid environment "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
			    "variable \"%s\".", var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	} else if (strncmp(var, "SMF_", 4) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		if (inst != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
			log_instance(inst, B_FALSE, "Invalid environment "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
			    "variable \"%s\"; \"SMF_\" prefix is reserved.",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
			    var);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	} else if (path != NULL && strncmp(var, "PATH=", 5) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
static char **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
find_dup(const char *var, char **env, const restarter_inst_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	char **p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	char *tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	for (p = env; *p != NULL; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
		assert((tmp = strchr(*p, '=')) != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		tmp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		if (strncmp(*p, var, tmp - *p) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	if (*p == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	if (inst != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		log_instance(inst, B_FALSE, "Ignoring duplicate "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		    "environment variable \"%s\".", *p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
 * Create an environment which is appropriate for spawning an SMF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
 * aware process. The new environment will consist of the values from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
 * the global environment as modified by the supplied (local) environment.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
 * In order to preserve the correctness of the new environment,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
 * various checks are performed on the local environment (init_env()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
 * is relied upon to ensure the global environment is correct):
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
 * - All SMF_ entries are ignored. All SMF_ entries should be provided
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
 *   by this function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
 * - Duplicates in the entry are eliminated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
 * - Malformed entries are eliminated.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 * Detected errors are logged as warnings to the appropriate instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 * logfile, since a single bad entry should not be enough to prevent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 * an SMF_ functional environment from being created. The faulty entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 * is then ignored when building the environment.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
 * If env is NULL, then the return is an environment which contains
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
 * all default values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
 * If "path" is non-NULL, it will silently over-ride any previous
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
 * PATH environment variable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
 * NB: The returned env and strings are allocated using startd_alloc().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
char **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
set_smf_env(char **env, size_t env_sz, const char *path,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
    const restarter_inst_t *inst, const char *method)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	char **nenv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	char **p, **np;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	size_t nenv_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	size_t sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	/*
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   261
	 * Max. of glob_env, env, four SMF_ variables,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	 * path, and terminating NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	 */
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   264
	nenv_size = glob_env_n + env_sz + 4 + 1 + 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	nenv = startd_zalloc(sizeof (char *) * nenv_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	np = nenv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	if (path != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		sz = strlen(path) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		*np = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		(void) strlcpy(*np, path, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		np++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	if (inst) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		sz = sizeof ("SMF_FMRI=") + strlen(inst->ri_i.i_fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		*np = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		(void) strlcpy(*np, "SMF_FMRI=", sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		(void) strlcat(*np, inst->ri_i.i_fmri, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		np++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	if (method) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		sz = sizeof ("SMF_METHOD=") + strlen(method);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		*np = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		(void) strlcpy(*np, "SMF_METHOD=", sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
		(void) strlcat(*np, method, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		np++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	sz = sizeof ("SMF_RESTARTER=") + strlen(SCF_SERVICE_STARTD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	*np = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	(void) strlcpy(*np, "SMF_RESTARTER=", sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	(void) strlcat(*np, SCF_SERVICE_STARTD, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	np++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
1573
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   299
	sz = sizeof ("SMF_ZONENAME=") + strlen(zonename);
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   300
	*np = startd_alloc(sz);
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   301
	(void) strlcpy(*np, "SMF_ZONENAME=", sz);
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   302
	(void) strlcat(*np, zonename, sz);
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   303
	np++;
7338e65f2666 PSARC/2006/163 SMF_ZONENAME variable for smf_method(5)
dp
parents: 0
diff changeset
   304
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	for (p = glob_envp; *p != NULL; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		if (valid_env_var(*p, inst, path)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
			sz = strlen(*p) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			*np = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
			(void) strlcpy(*np, *p, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
			np++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	if (env) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		for (p = env; *p != NULL; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
			char **dup_pos;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
			if (!valid_env_var(*p, inst, path))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			if ((dup_pos = find_dup(*p, nenv, inst)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
				startd_free(*dup_pos, strlen(*dup_pos) + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
				sz = strlen(*p) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
				*dup_pos = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
				(void) strlcpy(*dup_pos, *p, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
				sz = strlen(*p) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
				*np = startd_alloc(sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
				(void) strlcpy(*np, *p, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
				np++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	*np = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	return (nenv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
}