usr/src/cmd/svc/startd/startd.c
author eschrock
Fri, 26 Oct 2007 13:47:19 -0700
changeset 5345 44060de1d838
parent 5040 ff6ebd8761a6
child 5405 f7a026c6d133
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
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 195
diff changeset
     5
 * Common Development and Distribution License (the "License").
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 195
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
 */
5040
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
5040
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
    23
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * startd.c - the master restarter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * svc.startd comprises two halves.  The graph engine is based in graph.c and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * maintains the service dependency graph based on the information in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * repository.  For each service it also tracks the current state and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * restarter responsible for the service.  Based on the graph, events from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * repository (mostly administrative requests from svcadm), and messages from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * the restarters, the graph engine makes decisions about how the services
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * should be manipulated and sends commands to the appropriate restarters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 * Communication between the graph engine and the restarters is embodied in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * protocol.c.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * The second half of svc.startd is the restarter for services managed by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * svc.startd and is primarily contained in restarter.c.  It responds to graph
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * engine commands by executing methods, updating the repository, and sending
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * feedback (mostly state updates) to the graph engine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * Error handling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * In general, when svc.startd runs out of memory it reattempts a few times,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * sleeping inbetween, before giving up and exiting (see startd_alloc_retry()).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * When a repository connection is broken (libscf calls fail with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * SCF_ERROR_CONNECTION_BROKEN, librestart and internal functions return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * ECONNABORTED), svc.startd calls libscf_rebind_handle(), which coordinates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * with the svc.configd-restarting thread, fork_configd_thread(), via
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * st->st_configd_live_cv, and rebinds the repository handle.  Doing so resets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * all libscf state associated with that handle, so functions which do this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 * should communicate the event to their callers (usually by returning
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 * ECONNRESET) so they may reset their state appropriately.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <stdio.h>
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 195
diff changeset
    62
#include <stdio_ext.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <sys/mnttab.h>		/* uses FILE * without including stdio.h */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <alloca.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#include <sys/mount.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <sys/wait.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#include <assert.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <ftw.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
#include <libintl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#include <libscf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#include <libscf_priv.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#include <libuutil.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#include <poll.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#include <pthread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#include <stdarg.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
#include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#include "startd.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
#include "protocol.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
ssize_t max_scf_name_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
ssize_t max_scf_fmri_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
ssize_t max_scf_value_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
mode_t fmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
mode_t dmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
graph_update_t *gu;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
restarter_update_t *ru;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
startd_state_t *st;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
boolean_t booting_to_single_user = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
const char * const admin_actions[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
    SCF_PROPERTY_DEGRADED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
    SCF_PROPERTY_MAINT_OFF,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
    SCF_PROPERTY_MAINT_ON,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
    SCF_PROPERTY_MAINT_ON_IMMEDIATE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
    SCF_PROPERTY_REFRESH,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
    SCF_PROPERTY_RESTART
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
const int admin_events[NACTIONS] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
    RESTARTER_EVENT_TYPE_ADMIN_DEGRADED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
    RESTARTER_EVENT_TYPE_ADMIN_MAINT_OFF,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
    RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
    RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON_IMMEDIATE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
    RESTARTER_EVENT_TYPE_ADMIN_REFRESH,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
    RESTARTER_EVENT_TYPE_ADMIN_RESTART
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
const char * const instance_state_str[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	"none",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	"uninitialized",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	"maintenance",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	"offline",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	"disabled",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	"online",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	"degraded"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
static int finished = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
static int opt_reconfig = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
static uint8_t prop_reconfig = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
#define	INITIAL_REBIND_ATTEMPTS	5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
#define	INITIAL_REBIND_DELAY	3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
pthread_mutexattr_t mutex_attrs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
_umem_debug_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	return ("default,verbose");	/* UMEM_DEBUG setting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
_umem_logging_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	return ("fail,contents");	/* UMEM_LOGGING setting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 * startd_alloc_retry()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 *   Wrapper for allocation functions.  Retries with a decaying time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 *   value on failure to allocate, and aborts startd if failure is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 *   persistent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
startd_alloc_retry(void *f(size_t, int), size_t sz)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	void *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	uint_t try, msecs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	p = f(sz, UMEM_DEFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	if (p != NULL || sz == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	msecs = ALLOC_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	for (try = 0; p == NULL && try < ALLOC_RETRY; ++try) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		(void) poll(NULL, 0, msecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		msecs *= ALLOC_DELAY_MULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		p = f(sz, UMEM_DEFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		if (p != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
			return (p);
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
	uu_die("Insufficient memory.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
safe_realloc(void *p, size_t sz)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	uint_t try, msecs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	p = realloc(p, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	if (p != NULL || sz == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	msecs = ALLOC_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	for (try = 0; errno == EAGAIN && try < ALLOC_RETRY; ++try) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		(void) poll(NULL, 0, msecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		p = realloc(p, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		if (p != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
			return (p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		msecs *= ALLOC_DELAY_MULT;
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
	uu_die("Insufficient memory.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
safe_strdup(const char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	uint_t try, msecs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	char *d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	d = strdup(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	if (d != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		return (d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	msecs = ALLOC_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	for (try = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	    (errno == EAGAIN || errno == ENOMEM) && try < ALLOC_RETRY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	    ++try) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		(void) poll(NULL, 0, msecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		d = strdup(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		if (d != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			return (d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		msecs *= ALLOC_DELAY_MULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	uu_die("Insufficient memory.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
startd_free(void *p, size_t sz)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	umem_free(p, sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 * Creates a uu_list_pool_t with the same retry policy as startd_alloc().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 * Only returns NULL for UU_ERROR_UNKNOWN_FLAG and UU_ERROR_NOT_SUPPORTED.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
uu_list_pool_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
startd_list_pool_create(const char *name, size_t e, size_t o,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
    uu_compare_fn_t *f, uint32_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	uu_list_pool_t *pool;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	uint_t try, msecs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	pool = uu_list_pool_create(name, e, o, f, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	if (pool != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		return (pool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	msecs = ALLOC_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	for (try = 0; uu_error() == UU_ERROR_NO_MEMORY && try < ALLOC_RETRY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	    ++try) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		(void) poll(NULL, 0, msecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		pool = uu_list_pool_create(name, e, o, f, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		if (pool != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
			return (pool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		msecs *= ALLOC_DELAY_MULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	if (try < ALLOC_RETRY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	uu_die("Insufficient memory.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 * Creates a uu_list_t with the same retry policy as startd_alloc().  Only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
 * returns NULL for UU_ERROR_UNKNOWN_FLAG and UU_ERROR_NOT_SUPPORTED.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
uu_list_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
startd_list_create(uu_list_pool_t *pool, void *parent, uint32_t flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	uu_list_t *list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	uint_t try, msecs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	list = uu_list_create(pool, parent, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	if (list != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		return (list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	msecs = ALLOC_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	for (try = 0; uu_error() == UU_ERROR_NO_MEMORY && try < ALLOC_RETRY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	    ++try) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		(void) poll(NULL, 0, msecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		list = uu_list_create(pool, parent, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		if (list != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
			return (list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		msecs *= ALLOC_DELAY_MULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	if (try < ALLOC_RETRY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	uu_die("Insufficient memory.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
pthread_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
startd_thread_create(void *(*func)(void *), void *ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	pthread_t tid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	err = pthread_create(&tid, NULL, func, ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	if (err != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		assert(err == EAGAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		uu_die("Could not create thread.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	err = pthread_detach(tid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	assert(err == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	return (tid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
static int
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   324
read_startd_config(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	scf_handle_t *hndl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	scf_instance_t *inst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	scf_propertygroup_t *pg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	scf_property_t *prop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	scf_value_t *val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	scf_iter_t *iter, *piter;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	instance_data_t idata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	char *buf, *vbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	char *startd_options_fmri = uu_msprintf("%s/:properties/options",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	    SCF_SERVICE_STARTD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	char *startd_reconfigure_fmri = uu_msprintf(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	    "%s/:properties/system/reconfigure", SCF_SERVICE_STARTD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
	char *env_opts, *lasts, *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	int bind_fails = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	int ret = 0, r;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	uint_t count = 0, msecs = ALLOC_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	size_t sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	ctid_t ctid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	uint64_t uint64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	buf = startd_alloc(max_scf_fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	if (startd_options_fmri == NULL || startd_reconfigure_fmri == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		uu_die("Allocation failure\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	st->st_log_prefix = LOG_PREFIX_EARLY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	if ((st->st_log_file = getenv("STARTD_DEFAULT_LOG")) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		st->st_log_file = startd_alloc(strlen(STARTD_DEFAULT_LOG) + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		(void) strcpy(st->st_log_file, STARTD_DEFAULT_LOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	st->st_door_path = getenv("STARTD_ALT_DOOR");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	 * Read "options" property group.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	for (hndl = libscf_handle_create_bound(SCF_VERSION); hndl == NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	    hndl = libscf_handle_create_bound(SCF_VERSION), bind_fails++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
		(void) sleep(INITIAL_REBIND_DELAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		if (bind_fails > INITIAL_REBIND_ATTEMPTS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
			 * In the case that we can't bind to the repository
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
			 * (which should have been started), we need to allow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			 * the user into maintenance mode to determine what's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			 * failed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			log_framework(LOG_INFO, "Couldn't fetch "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
			    "default settings: %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
			    scf_strerror(scf_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			ret = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
			goto noscfout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	idata.i_fmri = SCF_SERVICE_STARTD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	idata.i_state = RESTARTER_STATE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	idata.i_next_state = RESTARTER_STATE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
timestamp:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	switch (r = _restarter_commit_states(hndl, &idata,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	    RESTARTER_STATE_ONLINE, RESTARTER_STATE_NONE, NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	case ENOMEM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		++count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		if (count < ALLOC_RETRY) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
			(void) poll(NULL, 0, msecs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
			msecs *= ALLOC_DELAY_MULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
			goto timestamp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		uu_die("Insufficient memory.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	case ECONNABORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		libscf_handle_rebind(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		goto timestamp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	case ENOENT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	case EPERM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	case EACCES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	case EROFS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		log_error(LOG_INFO, "Could set state of %s: %s.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		    idata.i_fmri, strerror(r));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	case EINVAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
		bad_error("_restarter_commit_states", r);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	pg = safe_scf_pg_create(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	prop = safe_scf_property_create(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	val = safe_scf_value_create(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	inst = safe_scf_instance_create(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	/* set startd's restarter properties */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	if (scf_handle_decode_fmri(hndl, SCF_SERVICE_STARTD, NULL, NULL, inst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	    NULL, NULL, SCF_DECODE_FMRI_EXACT) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		(void) libscf_write_start_pid(inst, getpid());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
		ctid = proc_get_ctid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		if (ctid != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
			uint64 = (uint64_t)ctid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
			(void) libscf_inst_set_count_prop(inst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
			    SCF_PG_RESTARTER, SCF_PG_RESTARTER_TYPE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
			    SCF_PG_RESTARTER_FLAGS, SCF_PROPERTY_CONTRACT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
			    uint64);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		(void) libscf_note_method_log(inst, LOG_PREFIX_EARLY,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		    STARTD_DEFAULT_LOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		(void) libscf_note_method_log(inst, LOG_PREFIX_NORMAL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
		    STARTD_DEFAULT_LOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	/* Read reconfigure property for recovery. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	if (scf_handle_decode_fmri(hndl, startd_reconfigure_fmri, NULL, NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	    NULL, NULL, prop, NULL) != -1 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	    scf_property_get_value(prop, val) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		(void) scf_value_get_boolean(val, &prop_reconfig);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	if (scf_handle_decode_fmri(hndl, startd_options_fmri, NULL, NULL, NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	    pg, NULL, SCF_DECODE_FMRI_TRUNCATE) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		 * No configuration options defined.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
		if (scf_error() != SCF_ERROR_NOT_FOUND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
			uu_warn("Couldn't read configuration from 'options' "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
			    "group: %s\n", scf_strerror(scf_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		goto scfout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	 * If there is no "options" group defined, then our defaults are fine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	if (scf_pg_get_name(pg, NULL, 0) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		goto scfout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	/* Iterate through. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	iter = safe_scf_iter_create(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	(void) scf_iter_pg_properties(iter, pg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	piter = safe_scf_iter_create(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	vbuf = startd_alloc(max_scf_value_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	while ((scf_iter_next_property(iter, prop) == 1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		scf_type_t ty;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
		if (scf_property_get_name(prop, buf, max_scf_fmri_size) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		if (strcmp(buf, "logging") != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
		    strcmp(buf, "boot_messages") != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		if (scf_property_type(prop, &ty) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
			switch (scf_error()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
			case SCF_ERROR_CONNECTION_BROKEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
				libscf_handle_rebind(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
			case SCF_ERROR_DELETED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
			case SCF_ERROR_NOT_BOUND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
			case SCF_ERROR_NOT_SET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
				bad_error("scf_property_type", scf_error());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
		if (ty != SCF_TYPE_ASTRING) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
			uu_warn("property \"options/%s\" is not of type "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			    "astring; ignored.\n", buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		if (scf_property_get_value(prop, val) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
			switch (scf_error()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
			case SCF_ERROR_CONNECTION_BROKEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
				return (ECONNABORTED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
			case SCF_ERROR_DELETED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
			case SCF_ERROR_NOT_FOUND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
			case SCF_ERROR_CONSTRAINT_VIOLATED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
				uu_warn("property \"options/%s\" has multiple "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
				    "values; ignored.\n", buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
5040
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
   523
			case SCF_ERROR_PERMISSION_DENIED:
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
   524
				uu_warn("property \"options/%s\" cannot be "
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
   525
				    "read because startd has insufficient "
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
   526
				    "permission; ignored.\n", buf);
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
   527
				continue;
ff6ebd8761a6 PSARC 2007/177 SMF read-protected property storage
wesolows
parents: 2258
diff changeset
   528
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
			case SCF_ERROR_HANDLE_MISMATCH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
			case SCF_ERROR_NOT_BOUND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
			case SCF_ERROR_NOT_SET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
				bad_error("scf_property_get_value",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
				    scf_error());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		if (scf_value_get_astring(val, vbuf, max_scf_value_size) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
			bad_error("scf_value_get_astring", scf_error());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   540
		if (strcmp("logging", buf) == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
			if (strcmp("verbose", vbuf) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
				st->st_boot_flags = STARTD_BOOT_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
				st->st_log_level_min = LOG_INFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
			} else if (strcmp("debug", vbuf) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
				st->st_boot_flags = STARTD_BOOT_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
				st->st_log_level_min = LOG_DEBUG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
			} else if (strcmp("quiet", vbuf) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
				st->st_log_level_min = LOG_NOTICE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
				uu_warn("unknown options/logging "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
				    "value '%s' ignored\n", vbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
		} else if (strcmp("boot_messages", buf) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
			if (strcmp("quiet", vbuf) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
				st->st_boot_flags = STARTD_BOOT_QUIET;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
			} else if (strcmp("verbose", vbuf) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
				st->st_boot_flags = STARTD_BOOT_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
				log_framework(LOG_NOTICE, "unknown "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
				    "options/boot_messages value '%s' "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
				    "ignored\n", vbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	startd_free(vbuf, max_scf_value_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	scf_iter_destroy(piter);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
	scf_iter_destroy(iter);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
scfout:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	scf_value_destroy(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	scf_pg_destroy(pg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	scf_property_destroy(prop);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	scf_instance_destroy(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	(void) scf_handle_unbind(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	scf_handle_destroy(hndl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
noscfout:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	startd_free(buf, max_scf_fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	uu_free(startd_options_fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	uu_free(startd_reconfigure_fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	if (booting_to_single_user) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		st->st_subgraph = startd_alloc(max_scf_fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		sz = strlcpy(st->st_subgraph, "milestone/single-user:default",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		    max_scf_fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		assert(sz < max_scf_fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	 * Options passed in as boot arguments override repository defaults.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
	env_opts = getenv("SMF_OPTIONS");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	if (env_opts == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
195
1bf388d71529 6298507 kernel options -s and -m milestone don't play nice
dstaff
parents: 0
diff changeset
   600
	for (cp = strtok_r(env_opts, ",", &lasts); cp != NULL;
1bf388d71529 6298507 kernel options -s and -m milestone don't play nice
dstaff
parents: 0
diff changeset
   601
	    cp = strtok_r(NULL, ",", &lasts)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
		if (strcmp(cp, "debug") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
			st->st_boot_flags = STARTD_BOOT_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
			st->st_log_level_min = LOG_DEBUG;
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   605
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   606
			/* -m debug should send messages to console */
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   607
			st->st_log_flags =
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   608
			    st->st_log_flags | STARTD_LOG_TERMINAL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		} else if (strcmp(cp, "verbose") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
			st->st_boot_flags = STARTD_BOOT_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
			st->st_log_level_min = LOG_INFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
		} else if (strcmp(cp, "seed") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
			uu_warn("SMF option \"%s\" unimplemented.\n", cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		} else if (strcmp(cp, "quiet") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
			st->st_log_level_min = LOG_NOTICE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		} else if (strncmp(cp, "milestone=",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
		    sizeof ("milestone=") - 1) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
			char *mp = cp + sizeof ("milestone=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
			if (booting_to_single_user)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
			if (st->st_subgraph == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
				st->st_subgraph =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
				    startd_alloc(max_scf_fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
				st->st_subgraph[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
			if (mp[0] == '\0' || strcmp(mp, "all") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
				(void) strcpy(st->st_subgraph, "all");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			} else if (strcmp(mp, "su") == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
			    strcmp(mp, "single-user") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
				(void) strcpy(st->st_subgraph,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
				    "milestone/single-user:default");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			} else if (strcmp(mp, "mu") == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			    strcmp(mp, "multi-user") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
				(void) strcpy(st->st_subgraph,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
				    "milestone/multi-user:default");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
			} else if (strcmp(mp, "mus") == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			    strcmp(mp, "multi-user-server") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
				(void) strcpy(st->st_subgraph,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
				    "milestone/multi-user-server:default");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
			} else if (strcmp(mp, "none") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
				(void) strcpy(st->st_subgraph, "none");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
				log_framework(LOG_NOTICE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
				    "invalid milestone option value "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
				    "'%s' ignored\n", mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
			uu_warn("Unknown SMF option \"%s\".\n", cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
 * void set_boot_env()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
 * If -r was passed or /reconfigure exists, this is a reconfig
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
 * reboot.  We need to make sure that this information is given
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
 * to the appropriate services the first time they're started
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
 * by setting the system/reconfigure repository property,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
 * as well as pass the _INIT_RECONFIG variable on to the rcS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
 * start method so that legacy services can continue to use it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
 * This function must never be called before contract_init(), as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
 * it sets st_initial.  get_startd_config() sets prop_reconfig from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
 * pre-existing repository state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
set_boot_env()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	struct stat sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	int r;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	 * Check if property still is set -- indicates we didn't get
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	 * far enough previously to unset it.  Otherwise, if this isn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	 * the first startup, don't re-process /reconfigure or the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	 * boot flag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	if (prop_reconfig != 1 && st->st_initial != 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	/* If /reconfigure exists, also set opt_reconfig. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	if (stat("/reconfigure", &sb) != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
		opt_reconfig = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	/* Nothing to do.  Just return. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	if (opt_reconfig == 0 && prop_reconfig == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	 * Set startd's reconfigure property.  This property is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	 * then cleared by successful completion of the single-user
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
	 * milestone.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
	if (prop_reconfig != 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
		r = libscf_set_reconfig(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		switch (r) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
		case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		case ENOENT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		case EPERM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
		case EACCES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		case EROFS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
			log_error(LOG_WARNING, "Could not set reconfiguration "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
			    "property: %s\n", strerror(r));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
			bad_error("libscf_set_reconfig", r);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
static void
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   721
startup(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	ctid_t configd_ctid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
	int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
	 * Initialize data structures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	gu = startd_zalloc(sizeof (graph_update_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	ru = startd_zalloc(sizeof (restarter_update_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
	(void) pthread_cond_init(&st->st_load_cv, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	(void) pthread_cond_init(&st->st_configd_live_cv, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	(void) pthread_cond_init(&gu->gu_cv, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
	(void) pthread_cond_init(&gu->gu_freeze_cv, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
	(void) pthread_cond_init(&ru->restarter_update_cv, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	(void) pthread_mutex_init(&st->st_load_lock, &mutex_attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
	(void) pthread_mutex_init(&st->st_configd_live_lock, &mutex_attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	(void) pthread_mutex_init(&gu->gu_lock, &mutex_attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	(void) pthread_mutex_init(&gu->gu_freeze_lock, &mutex_attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	(void) pthread_mutex_init(&ru->restarter_update_lock, &mutex_attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	configd_ctid = contract_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	if (configd_ctid != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
		log_framework(LOG_DEBUG, "Existing configd contract %ld; not "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
		    "starting svc.configd\n", configd_ctid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	(void) startd_thread_create(fork_configd_thread, (void *)configd_ctid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	 * Await, if necessary, configd's initial arrival.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	MUTEX_LOCK(&st->st_configd_live_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	while (!st->st_configd_lives) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
		log_framework(LOG_DEBUG, "Awaiting cv signal on "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
		    "configd_live_cv\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
		err = pthread_cond_wait(&st->st_configd_live_cv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
		    &st->st_configd_live_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
		assert(err == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	MUTEX_UNLOCK(&st->st_configd_live_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	utmpx_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
	wait_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   767
	if (read_startd_config())
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
		log_framework(LOG_INFO, "svc.configd unable to provide startd "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
		    "optional settings\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
	log_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	dict_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
	timeout_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
	restarter_protocol_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	restarter_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	graph_protocol_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	graph_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	init_env();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	set_boot_env();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	restarter_start();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	graph_engine_start();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
usage(const char *name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
{
2258
fb20891389ee 6440415 *svc.startd* traces of obsolete flags should be removed from source code
rm88369
parents: 1958
diff changeset
   789
	uu_warn(gettext("usage: %s [-n]\n"), name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
	exit(UU_EXIT_USAGE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
daemonize_start(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	pid_t pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
	if ((pid = fork1()) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	if (pid != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
		exit(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	(void) close(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	if ((fd = open("/dev/null", O_RDONLY)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
		uu_warn(gettext("can't connect stdin to /dev/null"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	} else if (fd != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
		(void) dup2(fd, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
		startd_close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	closefrom(3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
	(void) dup2(2, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	(void) setsid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	(void) chdir("/");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	/* Use default umask that init handed us, but 022 to create files. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	dmask = umask(022);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	fmask = umask(dmask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
die_handler(int sig, siginfo_t *info, void *data)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	finished = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
main(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	int opt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	int daemonize = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	struct sigaction act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	sigset_t nullset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
	struct stat sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	(void) uu_setpname(argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	st = startd_zalloc(sizeof (startd_state_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	(void) pthread_mutexattr_init(&mutex_attrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
#ifndef	NDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
	(void) pthread_mutexattr_settype(&mutex_attrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	    PTHREAD_MUTEX_ERRORCHECK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	max_scf_name_size = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	max_scf_value_size = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	max_scf_fmri_size = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
	if (max_scf_name_size == -1 || max_scf_value_size == -1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	    max_scf_value_size == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		uu_die("Can't determine repository maximum lengths.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	max_scf_name_size++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	max_scf_value_size++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	max_scf_fmri_size++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   865
	st->st_log_flags = STARTD_LOG_FILE | STARTD_LOG_SYSLOG;
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   866
	st->st_log_level_min = LOG_NOTICE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   868
	while ((opt = getopt(argc, argv, "nrs")) != EOF) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
		switch (opt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
		case 'n':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
			daemonize = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		case 'r':			/* reconfiguration boot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
			opt_reconfig = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
		case 's':			/* single-user mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
			booting_to_single_user = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
			usage(argv[0]);		/* exits */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
	if (optind != argc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
		usage(argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 195
diff changeset
   887
	(void) enable_extended_FILE_stdio(-1, -1);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 195
diff changeset
   888
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	if (daemonize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
		if (daemonize_start() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
			uu_die("Can't daemonize\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	log_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
	if (stat("/etc/svc/volatile/resetting", &sb) != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
		log_framework(LOG_NOTICE, "Restarter quiesced.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		for (;;)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
			(void) pause();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
	act.sa_sigaction = &die_handler;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
	(void) sigfillset(&act.sa_mask);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	act.sa_flags = SA_SIGINFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
	(void) sigaction(SIGINT, &act, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	(void) sigaction(SIGTERM, &act, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
1958
886c8ac12ef1 6321540 service failures must go to syslog
lianep
parents: 1914
diff changeset
   908
	startup();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
	(void) sigemptyset(&nullset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
	while (!finished) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		log_framework(LOG_DEBUG, "Main thread paused\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		(void) sigsuspend(&nullset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
	(void) log_framework(LOG_DEBUG, "Restarter exiting.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
}