annotate usr/src/cmd/svc/startd/startd.c @ 14129:790945ad7848

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