annotate usr/src/cmd/cmd-inet/usr.lib/inetd/inetd.c @ 12979:ab9ae749152f

PSARC/2009/617 Software Events Notification Parameters CLI PSARC/2009/618 snmp-notify: SNMP Notification Daemon for Software Events PSARC/2009/619 smtp-notify: Email Notification Daemon for Software Events PSARC/2010/225 fmd for non-global Solaris zones PSARC/2010/226 Solaris Instance UUID PSARC/2010/227 nvlist_nvflag(3NVPAIR) PSARC/2010/228 libfmevent additions PSARC/2010/257 sysevent_evc_setpropnvl and sysevent_evc_getpropnvl PSARC/2010/265 FMRI and FMA Event Stabilty, 'ireport' category 1 event class, and the 'sw' FMRI scheme PSARC/2010/278 FMA/SMF integration: instance state transitions PSARC/2010/279 Modelling panics within FMA PSARC/2010/290 logadm.conf upgrade 6392476 fmdump needs to pretty-print 6393375 userland ereport/ireport event generation interfaces 6445732 Add email notification agent for FMA and software events 6804168 RFE: Allow an efficient means to monitor SMF services status changes 6866661 scf_values_destroy(3SCF) will segfault if is passed NULL 6884709 Add snmp notification agent for FMA and software events 6884712 Add private interface to tap into libfmd_msg macro expansion capabilities 6897919 fmd to run in a non-global zone 6897937 fmd use of non-private doors is not safe 6900081 add a UUID to Solaris kernel image for use in crashdump identification 6914884 model panic events as a defect diagnosis in FMA 6944862 fmd_case_open_uuid, fmd_case_uuisresolved, fmd_nvl_create_defect 6944866 log legacy sysevents in fmd 6944867 enumerate svc scheme in topo 6944868 software-diagnosis and software-response fmd modules 6944870 model SMF maintenance state as a defect diagnosis in FMA 6944876 savecore runs in foreground for systems with zfs root and dedicated dump 6965796 Implement notification parameters for SMF state transitions and FMA events 6968287 SUN-FM-MIB.mib needs to be updated to reflect Oracle information 6972331 logadm.conf upgrade PSARC/2010/290
author Gavin Maltby <gavin.maltby@oracle.com>
date Fri, 30 Jul 2010 17:04:17 +1000
parents ce2b5201c4cb
children a9dfa4813bcd
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
1712
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
5 * Common Development and Distribution License (the "License").
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
21 /*
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11623
diff changeset
22 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
23 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26 * NOTES: To be expanded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 * The SMF inetd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 * Below are some high level notes of the operation of the SMF inetd. The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 * notes don't go into any real detail, and the viewer of this file is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 * encouraged to look at the code and its associated comments to better
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 * understand inetd's operation. This saves the potential for the code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 * and these notes diverging over time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 * Inetd's major work is done from the context of event_loop(). Within this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 * loop, inetd polls for events arriving from a number of different file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 * descriptors, representing the following event types, and initiates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 * any necessary event processing:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 * - incoming network connections/datagrams.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 * - notification of terminated processes (discovered via contract events).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42 * - instance specific events originating from the SMF master restarter.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 * - stop/refresh requests from the inetd method processes (coming in on a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 * Unix Domain socket).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 * There's also a timeout set for the poll, which is set to the nearest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 * scheduled timer in a timer queue that inetd uses to perform delayed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 * processing, such as bind retries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 * The SIGHUP and SIGINT signals can also interrupt the poll, and will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 * result in inetd being refreshed or stopped respectively, as was the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 * behavior with the old inetd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 * Inetd implements a state machine for each instance. The states within the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 * machine are: offline, online, disabled, maintenance, uninitialized and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 * specializations of the offline state for when an instance exceeds one of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 * its DOS limits. The state of an instance can be changed as a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 * result/side-effect of one of the above events occurring, or inetd being
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 * started up. The ongoing state of an instance is stored in the SMF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 * repository, as required of SMF restarters. This enables an administrator
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 * to view the state of each instance, and, if inetd was to terminate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 * unexpectedly, it could use the stored state to re-commence where it left off.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62 * Within the state machine a number of methods are run (if provided) as part
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 * of a state transition to aid/ effect a change in an instance's state. The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 * supported methods are: offline, online, disable, refresh and start. The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 * latter of these is the equivalent of the server program and its arguments
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 * in the old inetd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 * Events from the SMF master restarter come in on a number of threads
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69 * created in the registration routine of librestart, the delegated restarter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 * library. These threads call into the restart_event_proxy() function
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 * when an event arrives. To serialize the processing of instances, these events
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 * are then written down a pipe to the process's main thread, which listens
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73 * for these events via a poll call, with the file descriptor of the other
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 * end of the pipe in its read set, and processes the event appropriately.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 * When the event has been processed (which may be delayed if the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 * for which the event is for is in the process of executing one of its methods
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 * as part of a state transition) it writes an acknowledgement back down the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 * pipe the event was received on. The thread in restart_event_proxy() that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 * wrote the event will read the acknowledgement it was blocked upon, and will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 * then be able to return to its caller, thus implicitly acknowledging the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 * event, and allowing another event to be written down the pipe for the main
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82 * thread to process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 #include <netdb.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 #include <stdio.h>
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1712
diff changeset
88 #include <stdio_ext.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 #include <stdlib.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 #include <assert.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 #include <sys/socket.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 #include <netinet/in.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 #include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 #include <signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98 #include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99 #include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 #include <syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 #include <libintl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 #include <librestart.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103 #include <pthread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 #include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 #include <time.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 #include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 #include <libgen.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 #include <tcpd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 #include <libscf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110 #include <libuutil.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111 #include <stddef.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 #include <bsm/adt_event.h>
4357
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
113 #include <ucred.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 #include "inetd_impl.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 /* path to inetd's binary */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
117 #define INETD_PATH "/usr/lib/inet/inetd"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 * inetd's default configuration file paths. /etc/inetd/inetd.conf is set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 * be be the primary file, so it is checked before /etc/inetd.conf.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 #define PRIMARY_DEFAULT_CONF_FILE "/etc/inet/inetd.conf"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 #define SECONDARY_DEFAULT_CONF_FILE "/etc/inetd.conf"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 /* Arguments passed to this binary to request which method to execute. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 #define START_METHOD_ARG "start"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128 #define STOP_METHOD_ARG "stop"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 #define REFRESH_METHOD_ARG "refresh"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 /* connection backlog for unix domain socket */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 #define UDS_BACKLOG 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 /* number of retries to recv() a request on the UDS socket before giving up */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135 #define UDS_RECV_RETRIES 10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 /* enumeration of the different ends of a pipe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138 enum pipe_end {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 PE_CONSUMER,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 PE_PRODUCER
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141 };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143 typedef struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 internal_inst_state_t istate;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 const char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 restarter_instance_state_t smf_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 instance_method_t method_running;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 } state_info_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 * Collection of information for each state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 * NOTE: This table is indexed into using the internal_inst_state_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 * enumeration, so the ordering needs to be kept in synch.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156 static state_info_t states[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157 {IIS_UNINITIALIZED, "uninitialized", RESTARTER_STATE_UNINIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158 IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159 {IIS_ONLINE, "online", RESTARTER_STATE_ONLINE, IM_START},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160 {IIS_IN_ONLINE_METHOD, "online_method", RESTARTER_STATE_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161 IM_ONLINE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 {IIS_OFFLINE, "offline", RESTARTER_STATE_OFFLINE, IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163 {IIS_IN_OFFLINE_METHOD, "offline_method", RESTARTER_STATE_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 IM_OFFLINE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165 {IIS_DISABLED, "disabled", RESTARTER_STATE_DISABLED, IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 {IIS_IN_DISABLE_METHOD, "disabled_method", RESTARTER_STATE_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167 IM_DISABLE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 {IIS_IN_REFRESH_METHOD, "refresh_method", RESTARTER_STATE_ONLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 IM_REFRESH},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 {IIS_MAINTENANCE, "maintenance", RESTARTER_STATE_MAINT, IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 {IIS_OFFLINE_CONRATE, "cr_offline", RESTARTER_STATE_OFFLINE, IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 {IIS_OFFLINE_BIND, "bind_offline", RESTARTER_STATE_OFFLINE, IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 {IIS_OFFLINE_COPIES, "copies_offline", RESTARTER_STATE_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174 IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175 {IIS_DEGRADED, "degraded", RESTARTER_STATE_DEGRADED, IM_NONE},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176 {IIS_NONE, "none", RESTARTER_STATE_NONE, IM_NONE}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 * Pipe used to send events from the threads created by restarter_bind_handle()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 * to the main thread of control.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
182 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183 static int rst_event_pipe[] = {-1, -1};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185 * Used to protect the critical section of code in restarter_event_proxy() that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 * involves writing an event down the event pipe and reading an acknowledgement.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 static pthread_mutex_t rst_event_pipe_mtx = PTHREAD_MUTEX_INITIALIZER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190 /* handle used in communication with the master restarter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 static restarter_event_handle_t *rst_event_handle = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 /* set to indicate a refresh of inetd is requested */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 static boolean_t refresh_inetd_requested = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 /* set by the SIGTERM handler to flag we got a SIGTERM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 static boolean_t got_sigterm = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 * Timer queue used to store timers for delayed event processing, such as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 * bind retries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 iu_tq_t *timer_queue = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 * fd of Unix Domain socket used to communicate stop and refresh requests
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 * to the inetd start method process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 static int uds_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212 * List of inetd's currently managed instances; each containing its state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 * and in certain states its configuration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 static uu_list_pool_t *instance_pool = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 uu_list_t *instance_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218 /* set to indicate we're being stopped */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219 boolean_t inetd_stopping = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 /* TCP wrappers syslog globals. Consumed by libwrap. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 int allow_severity = LOG_INFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 int deny_severity = LOG_WARNING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 /* path of the configuration file being monitored by check_conf_file() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 static char *conf_file = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 /* Auditing session handle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229 static adt_session_data_t *audit_handle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230
8296
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
231 /* Number of pending connections */
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
232 static size_t tlx_pending_counter;
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
233
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 static void uds_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 static int uds_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 static int run_method(instance_t *, instance_method_t, const proto_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 static void create_bound_fds(instance_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 static void destroy_bound_fds(instance_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 static void destroy_instance(instance_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 static void inetd_stop(void);
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
241 static void
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
242 exec_method(instance_t *instance, instance_method_t method, method_info_t *mi,
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
243 struct method_context *mthd_ctxt, const proto_info_t *pi) __NORETURN;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 * The following two functions are callbacks that libumem uses to determine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 * inetd's desired debugging/logging levels. The interface they consume is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 * exported by FMA and is consolidation private. The comments in the two
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 * functions give the environment variable that will effectively be set to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 * their returned value, and thus whose behavior for this value, described in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251 * umem_debug(3MALLOC), will be followed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254 const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 _umem_debug_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 return ("default,verbose"); /* UMEM_DEBUG setting */
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 const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261 _umem_logging_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 return ("fail,contents"); /* UMEM_LOGGING setting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267 log_invalid_cfg(const char *fmri)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 "Invalid configuration for instance %s, placing in maintenance"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 * Returns B_TRUE if the instance is in a suitable state for inetd to stop.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 instance_stopped(const instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 return ((inst->cur_istate == IIS_OFFLINE) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 (inst->cur_istate == IIS_MAINTENANCE) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 (inst->cur_istate == IIS_DISABLED) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283 (inst->cur_istate == IIS_UNINITIALIZED));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 /*
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
287 * Given the instance fmri, obtain the corresonding scf_instance.
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
288 * Caller is responsible for freeing the returned scf_instance and
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
289 * its scf_handle.
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
290 */
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
291 static int
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
292 fmri_to_instance(char *fmri, scf_instance_t **scf_instp)
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
293 {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
294 int retries, ret = 1;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
295 scf_handle_t *h;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
296 scf_instance_t *scf_inst;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
297
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
298 if ((h = scf_handle_create(SCF_VERSION)) == NULL) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
299 error_msg(gettext("Failed to get instance for %s"), fmri);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
300 return (1);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
301 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
302
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
303 if ((scf_inst = scf_instance_create(h)) == NULL)
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
304 goto out;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
305
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
306 for (retries = 0; retries <= REP_OP_RETRIES; retries++) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
307 if (make_handle_bound(h) == -1)
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
308 break;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
309
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
310 if (scf_handle_decode_fmri(h, fmri, NULL, NULL, scf_inst,
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
311 NULL, NULL, SCF_DECODE_FMRI_EXACT) == 0) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
312 ret = 0;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
313 *scf_instp = scf_inst;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
314 break;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
315 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
316
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
317 if (scf_error() != SCF_ERROR_CONNECTION_BROKEN)
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
318 break;
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
319 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
320
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
321 out:
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
322 if (ret != 0) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
323 error_msg(gettext("Failed to get instance for %s"), fmri);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
324 scf_instance_destroy(scf_inst);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
325 scf_handle_destroy(h);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
326 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
327
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
328 return (ret);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
329 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
330
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
331 /*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 * Updates the current and next repository states of instance 'inst'. If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 * any errors occur an error message is output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 update_instance_states(instance_t *inst, internal_inst_state_t new_cur_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 internal_inst_state_t new_next_state, restarter_error_t err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339 internal_inst_state_t old_cur = inst->cur_istate;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 internal_inst_state_t old_next = inst->next_istate;
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
341 scf_instance_t *scf_inst = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 scf_error_t sret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 int ret;
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11623
diff changeset
344 restarter_str_t aux = restarter_str_none;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 /* update the repository/cached internal state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 inst->cur_istate = new_cur_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 inst->next_istate = new_next_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 (void) set_single_rep_val(inst->cur_istate_rep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 (int64_t)new_cur_state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 (void) set_single_rep_val(inst->next_istate_rep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352 (int64_t)new_next_state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 if (((sret = store_rep_vals(inst->cur_istate_rep, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
355 PR_NAME_CUR_INT_STATE)) != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 ((sret = store_rep_vals(inst->next_istate_rep, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 PR_NAME_NEXT_INT_STATE)) != 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 error_msg(gettext("Failed to update state of instance %s in "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359 "repository: %s"), inst->fmri, scf_strerror(sret));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
361 if (fmri_to_instance(inst->fmri, &scf_inst) == 0) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
362 /*
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
363 * If transitioning to maintenance, check auxiliary_tty set
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
364 * by svcadm and assign appropriate value to auxiliary_state.
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
365 * If the maintenance event comes from a service request,
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
366 * validate auxiliary_fmri and copy it to
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
367 * restarter/auxiliary_fmri.
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
368 */
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
369 if (new_cur_state == IIS_MAINTENANCE) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
370 if (restarter_inst_ractions_from_tty(scf_inst) == 0)
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11623
diff changeset
371 aux = restarter_str_service_request;
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
372 else
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11623
diff changeset
373 aux = restarter_str_administrative_request;
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
374 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
375
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11623
diff changeset
376 if (aux == restarter_str_service_request) {
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
377 if (restarter_inst_validate_ractions_aux_fmri(
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
378 scf_inst) == 0) {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
379 if (restarter_inst_set_aux_fmri(scf_inst))
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
380 error_msg(gettext("Could not set "
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
381 "auxiliary_fmri property for %s"),
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
382 inst->fmri);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
383 } else {
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
384 if (restarter_inst_reset_aux_fmri(scf_inst))
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
385 error_msg(gettext("Could not reset "
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
386 "auxiliary_fmri property for %s"),
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
387 inst->fmri);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
388 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
389 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
390 scf_handle_destroy(scf_instance_handle(scf_inst));
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
391 scf_instance_destroy(scf_inst);
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
392 }
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
393
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 /* update the repository SMF state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395 if ((ret = restarter_set_states(rst_event_handle, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 states[old_cur].smf_state, states[new_cur_state].smf_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 states[old_next].smf_state, states[new_next_state].smf_state,
8823
000507e9108d 6761070 PSARC 2008/580 Solaris host-based firewall
Truong Nguyen <Truong.Q.Nguyen@Sun.COM>
parents: 8296
diff changeset
398 err, aux)) != 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 error_msg(gettext("Failed to update state of instance %s in "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 "repository: %s"), inst->fmri, strerror(ret));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 update_state(instance_t *inst, internal_inst_state_t new_cur,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405 restarter_error_t err)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407 update_instance_states(inst, new_cur, IIS_NONE, err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411 * Sends a refresh event to the inetd start method process and returns
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412 * SMF_EXIT_OK if it managed to send it. If it fails to send the request for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 * some reason it returns SMF_EXIT_ERR_OTHER.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416 refresh_method(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 uds_request_t req = UR_REFRESH_INETD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421 if ((fd = connect_to_inetd()) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 error_msg(gettext("Failed to connect to inetd: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 /* write the request and return success */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 if (safe_write(fd, &req, sizeof (req)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 error_msg(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430 gettext("Failed to send refresh request to inetd: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 return (SMF_EXIT_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442 * Sends a stop event to the inetd start method process and wait till it goes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
443 * away. If inetd is determined to have stopped SMF_EXIT_OK is returned, else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
444 * SMF_EXIT_ERR_OTHER is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
446 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
447 stop_method(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449 uds_request_t req = UR_STOP_INETD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450 int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
451 char c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 ssize_t ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
454 if ((fd = connect_to_inetd()) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
455 debug_msg(gettext("Failed to connect to inetd: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
456 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
457 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
458 * Assume connect_to_inetd() failed because inetd was already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459 * stopped, and return success.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
460 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
461 return (SMF_EXIT_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
464 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
465 * This is safe to do since we're fired off in a separate process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
466 * than inetd and in the case we get wedged, the stop method timeout
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
467 * will occur and we'd be killed by our restarter.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
468 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
469 enable_blocking(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 /* write the stop request to inetd and wait till it goes away */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472 if (safe_write(fd, &req, sizeof (req)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473 error_msg(gettext("Failed to send stop request to inetd"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 /* wait until remote end of socket is closed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479 while (((ret = recv(fd, &c, sizeof (c), 0)) != 0) && (errno == EINTR))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484 if (ret != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485 error_msg(gettext("Failed to determine whether inetd stopped"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 return (SMF_EXIT_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
493 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
494 * This function is called to handle restarter events coming in from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
495 * master restarter. It is registered with the master restarter via
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
496 * restarter_bind_handle() and simply passes a pointer to the event down
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
497 * the event pipe, which will be discovered by the poll in the event loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
498 * and processed there. It waits for an acknowledgement to be written back down
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
499 * the pipe before returning.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
500 * Writing a pointer to the function's 'event' parameter down the pipe will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
501 * be safe, as the thread in restarter_event_proxy() doesn't return until
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
502 * the main thread has finished its processing of the passed event, thus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
503 * the referenced event will remain around until the function returns.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
504 * To impose the limit of only one event being in the pipe and processed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
505 * at once, a lock is taken on entry to this function and returned on exit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
506 * Always returns 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
507 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
508 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
509 restarter_event_proxy(restarter_event_t *event)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
510 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
511 boolean_t processed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
513 (void) pthread_mutex_lock(&rst_event_pipe_mtx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
515 /* write the event to the main worker thread down the pipe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
516 if (safe_write(rst_event_pipe[PE_PRODUCER], &event,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
517 sizeof (event)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
518 goto pipe_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
520 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
521 * Wait for an acknowledgement that the event has been processed from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
522 * the same pipe. In the case that inetd is stopping, any thread in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
523 * this function will simply block on this read until inetd eventually
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
524 * exits. This will result in this function not returning success to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
525 * its caller, and the event that was being processed when the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
526 * function exited will be re-sent when inetd is next started.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
527 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
528 if (safe_read(rst_event_pipe[PE_PRODUCER], &processed,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
529 sizeof (processed)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
530 goto pipe_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
532 (void) pthread_mutex_unlock(&rst_event_pipe_mtx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
534 return (processed ? 0 : EAGAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
536 pipe_error:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
537 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
538 * Something's seriously wrong with the event pipe. Notify the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
539 * worker thread by closing this end of the event pipe and pause till
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
540 * inetd exits.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
541 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
542 error_msg(gettext("Can't process restarter events: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
543 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
544 (void) close(rst_event_pipe[PE_PRODUCER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
545 for (;;)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
546 (void) pause();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
548 /* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
549 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
551 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
552 * Let restarter_event_proxy() know we're finished with the event it's blocked
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
553 * upon. The 'processed' argument denotes whether we successfully processed the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
554 * event.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
555 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
556 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
557 ack_restarter_event(boolean_t processed)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
558 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
559 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
560 * If safe_write returns -1 something's seriously wrong with the event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
561 * pipe, so start the shutdown proceedings.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
562 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
563 if (safe_write(rst_event_pipe[PE_CONSUMER], &processed,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
564 sizeof (processed)) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
565 inetd_stop();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
566 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
568 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
569 * Switch the syslog identification string to 'ident'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
570 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
571 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
572 change_syslog_ident(const char *ident)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
573 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
574 closelog();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
575 openlog(ident, LOG_PID|LOG_CONS, LOG_DAEMON);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
576 }
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 * Perform TCP wrappers checks on this instance. Due to the fact that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
580 * current wrappers code used in Solaris is taken untouched from the open
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
581 * source version, we're stuck with using the daemon name for the checks, as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
582 * opposed to making use of instance FMRIs. Sigh.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
583 * Returns B_TRUE if the check passed, else B_FALSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
584 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
585 static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
586 tcp_wrappers_ok(instance_t *instance)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
587 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
588 boolean_t rval = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
589 char *daemon_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
590 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
591 struct request_info req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
593 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
594 * Wrap the service using libwrap functions. The code below implements
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
595 * the functionality of tcpd. This is done only for stream,nowait
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
596 * services, following the convention of other vendors. udp/dgram and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
597 * stream/wait can NOT be wrapped with this libwrap, so be wary of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
598 * changing the test below.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
599 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
600 if (cfg->do_tcp_wrappers && !cfg->iswait && !cfg->istlx) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
602 daemon_name = instance->config->methods[
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
603 IM_START]->exec_args_we.we_wordv[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
604 if (*daemon_name == '/')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
605 daemon_name = strrchr(daemon_name, '/') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
607 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
608 * Change the syslog message identity to the name of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
609 * daemon being wrapped, as opposed to "inetd".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
610 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
611 change_syslog_ident(daemon_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
613 (void) request_init(&req, RQ_DAEMON, daemon_name, RQ_FILE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
614 instance->conn_fd, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
615 fromhost(&req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
617 if (strcasecmp(eval_hostname(req.client), paranoid) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
618 syslog(deny_severity,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
619 "refused connect from %s (name/address mismatch)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
620 eval_client(&req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
621 if (req.sink != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
622 req.sink(instance->conn_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
623 rval = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
624 } else if (!hosts_access(&req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
625 syslog(deny_severity,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
626 "refused connect from %s (access denied)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
627 eval_client(&req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
628 if (req.sink != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
629 req.sink(instance->conn_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
630 rval = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
631 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
632 syslog(allow_severity, "connect from %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
633 eval_client(&req));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
634 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
636 /* Revert syslog identity back to "inetd". */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
637 change_syslog_ident(SYSLOG_IDENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
638 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
639 return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
640 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
642 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
643 * Handler registered with the timer queue code to remove an instance from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
644 * the connection rate offline state when it has been there for its allotted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
645 * time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
646 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
647 /* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
648 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
649 conn_rate_online(iu_tq_t *tq, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
650 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
651 instance_t *instance = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
652
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
653 assert(instance->cur_istate == IIS_OFFLINE_CONRATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
654 instance->timer_id = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
655 update_state(instance, IIS_OFFLINE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
656 process_offline_inst(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
657 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
659 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
660 * Check whether this instance in the offline state is in transition to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
661 * another state and do the work to continue this transition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
662 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
663 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
664 process_offline_inst(instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
665 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
666 if (inst->disable_req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
667 inst->disable_req = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
668 (void) run_method(inst, IM_DISABLE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
669 } else if (inst->maintenance_req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
670 inst->maintenance_req = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
671 update_state(inst, IIS_MAINTENANCE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
672 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
673 * If inetd is in the process of stopping, we don't want to enter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
674 * any states but offline, disabled and maintenance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
675 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
676 } else if (!inetd_stopping) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
677 if (inst->conn_rate_exceeded) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
678 basic_cfg_t *cfg = inst->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
680 inst->conn_rate_exceeded = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
681 update_state(inst, IIS_OFFLINE_CONRATE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
682 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
683 * Schedule a timer to bring the instance out of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
684 * connection rate offline state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
685 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
686 inst->timer_id = iu_schedule_timer(timer_queue,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
687 cfg->conn_rate_offline, conn_rate_online,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
688 inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
689 if (inst->timer_id == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
690 error_msg(gettext("%s unable to set timer, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
691 "won't be brought on line after %d "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
692 "seconds."), inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
693 cfg->conn_rate_offline);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
694 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
696 } else if (copies_limit_exceeded(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
697 update_state(inst, IIS_OFFLINE_COPIES, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
698 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
699 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
700 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
702 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
703 * Create a socket bound to the instance's configured address. If the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
704 * bind fails, returns -1, else the fd of the bound socket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
705 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
706 static int
4754
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
707 create_bound_socket(const instance_t *inst, socket_info_t *sock_info)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
708 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
709 int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
710 int on = 1;
4754
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
711 const char *fmri = inst->fmri;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
712 rpc_info_t *rpc = sock_info->pr_info.ri;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
713 const char *proto = sock_info->pr_info.proto;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
715 fd = socket(sock_info->local_addr.ss_family, sock_info->type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
716 sock_info->protocol);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
717 if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
718 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
719 "Socket creation failure for instance %s, proto %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
720 fmri, proto, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
721 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
722 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
724 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
725 error_msg(gettext("setsockopt SO_REUSEADDR failed for service "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
726 "instance %s, proto %s: %s"), fmri, proto, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
727 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
728 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
729 }
10873
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
730 if (inst->config->basic->do_tcp_keepalive &&
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
731 !inst->config->basic->iswait && !inst->config->basic->istlx) {
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
732 /* set the keepalive option */
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
733 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on,
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
734 sizeof (on)) == -1) {
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
735 error_msg(gettext("setsockopt SO_KEEPALIVE failed for "
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
736 "service instance %s, proto %s: %s"), fmri,
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
737 proto, strerror(errno));
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
738 (void) close(fd);
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
739 return (-1);
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
740 }
4145146e1cfb 6263835 inetd could use option to set SO_KEEPALIVE
Gary Mills <mills@cc.umanitoba.ca>
parents: 9765
diff changeset
741 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
742 if (sock_info->pr_info.v6only) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
743 /* restrict socket to IPv6 communications only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
744 if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
745 sizeof (on)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
746 error_msg(gettext("setsockopt IPV6_V6ONLY failed for "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
747 "service instance %s, proto %s: %s"), fmri, proto,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
748 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
749 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
750 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
751 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
752 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
754 if (rpc != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
755 SS_SETPORT(sock_info->local_addr, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
757 if (bind(fd, (struct sockaddr *)&(sock_info->local_addr),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
758 SS_ADDRLEN(sock_info->local_addr)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
759 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
760 "Failed to bind to the port of service instance %s, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
761 "proto %s: %s"), fmri, proto, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
762 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
763 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
764 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
766 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
767 * Retrieve and store the address bound to for RPC services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
768 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
769 if (rpc != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
770 struct sockaddr_storage ss;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
771 int ss_size = sizeof (ss);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
773 if (getsockname(fd, (struct sockaddr *)&ss, &ss_size) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
774 error_msg(gettext("Failed getsockname for instance %s, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
775 "proto %s: %s"), fmri, proto, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
776 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
777 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
778 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
779 (void) memcpy(rpc->netbuf.buf, &ss,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
780 sizeof (struct sockaddr_storage));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
781 rpc->netbuf.len = SS_ADDRLEN(ss);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
782 rpc->netbuf.maxlen = SS_ADDRLEN(ss);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
783 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
784
4754
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
785 if (sock_info->type == SOCK_STREAM) {
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
786 int qlen = inst->config->basic->conn_backlog;
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
787
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
788 debug_msg("Listening for service %s with backlog queue"
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
789 " size %d", fmri, qlen);
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
790 (void) listen(fd, qlen);
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
791 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
793 return (fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
794 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
796 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
797 * Handler registered with the timer queue code to retry the creation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
798 * of a bound fd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
799 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
800 /* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
801 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
802 retry_bind(iu_tq_t *tq, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
803 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
804 instance_t *instance = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
805
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
806 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
807 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
808 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
809 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
810 case IIS_IN_ONLINE_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
811 case IIS_IN_REFRESH_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
812 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
813 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
814 #ifndef NDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
815 (void) fprintf(stderr, "%s:%d: Unknown instance state %d.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
816 __FILE__, __LINE__, instance->cur_istate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
817 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
818 abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
819 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
820
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
821 instance->bind_timer_id = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
822 create_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
823 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
825 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
826 * For each of the fds for the given instance that are bound, if 'listen' is
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
827 * set add them to the poll set, else remove them from it. If proto_name is
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
828 * not NULL then apply the change only to this specific protocol endpoint.
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
829 * If any additions fail, returns -1, else 0 on success.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
830 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
831 int
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
832 poll_bound_fds(instance_t *instance, boolean_t listen, char *proto_name)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
833 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
834 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
835 proto_info_t *pi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
836 int ret = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
837
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
838 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
839 pi = uu_list_next(cfg->proto_list, pi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
840 if (pi->listen_fd != -1) { /* fd bound */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
841 if (proto_name == NULL ||
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
842 strcmp(pi->proto, proto_name) == 0) {
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
843 if (listen == B_FALSE) {
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
844 clear_pollfd(pi->listen_fd);
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
845 } else if (set_pollfd(pi->listen_fd,
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
846 POLLIN) == -1) {
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
847 ret = -1;
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
848 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
849 }
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
853 return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
854 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
855
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
856 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
857 * Handle the case were we either fail to create a bound fd or we fail
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
858 * to add a bound fd to the poll set for the given instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
859 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
860 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
861 handle_bind_failure(instance_t *instance)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
862 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
863 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
865 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
866 * We must be being called as a result of a failed poll_bound_fds()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
867 * as a bind retry is already scheduled. Just return and let it do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
868 * the work.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
869 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
870 if (instance->bind_timer_id != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
871 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
872
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
873 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
874 * Check if the rebind retries limit is operative and if so,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
875 * if it has been reached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
876 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
877 if (((cfg->bind_fail_interval <= 0) || /* no retries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
878 ((cfg->bind_fail_max >= 0) && /* limit reached */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
879 (++instance->bind_fail_count > cfg->bind_fail_max))) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
880 ((instance->bind_timer_id = iu_schedule_timer(timer_queue,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
881 cfg->bind_fail_interval, retry_bind, instance)) == -1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
882 proto_info_t *pi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
884 instance->bind_fail_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
886 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
887 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
888 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
889 /* check if any of the fds are being poll'd upon */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
890 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
891 pi = uu_list_next(cfg->proto_list, pi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
892 if ((pi->listen_fd != -1) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
893 (find_pollfd(pi->listen_fd) != NULL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
894 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
895 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
896 if (pi != NULL) { /* polling on > 0 fds */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
897 warn_msg(gettext("Failed to bind on "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
898 "all protocols for instance %s, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
899 "transitioning to degraded"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
900 instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
901 update_state(instance, IIS_DEGRADED, RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
902 instance->bind_retries_exceeded = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
903 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
904 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
906 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
907 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
908 * In the case we failed the 'bind' because set_pollfd()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
909 * failed on all bound fds, use the offline handling.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
910 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
911 /* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
912 case IIS_OFFLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
913 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
914 error_msg(gettext("Too many bind failures for instance "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
915 "%s, transitioning to maintenance"), instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
916 update_state(instance, IIS_MAINTENANCE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
917 RERR_FAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
918 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
919 case IIS_IN_ONLINE_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
920 case IIS_IN_REFRESH_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
921 warn_msg(gettext("Failed to bind on all "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
922 "protocols for instance %s, instance will go to "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
923 "degraded"), instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
924 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
925 * Set the retries exceeded flag so when the method
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
926 * completes the instance goes to the degraded state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
927 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
928 instance->bind_retries_exceeded = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
929 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
930 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
931 #ifndef NDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
932 (void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
933 "%s:%d: Unknown instance state %d.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
934 __FILE__, __LINE__, instance->cur_istate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
935 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
936 abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
937 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
938 } else if (instance->cur_istate == IIS_OFFLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
939 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
940 * bind re-scheduled, so if we're offline reflect this in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
941 * state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
942 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
943 update_state(instance, IIS_OFFLINE_BIND, RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
944 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
945 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
946
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
947
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
948 /*
760
875a88a429b8 6311192 inetd does not handle multiple rpc services with the same rpc program # (fix cstyle)
dstaff
parents: 759
diff changeset
949 * Check if two transport protocols for RPC conflict.
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
950 */
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
951
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
952 boolean_t
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
953 is_rpc_proto_conflict(const char *proto0, const char *proto1) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
954 if (strcmp(proto0, "tcp") == 0) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
955 if (strcmp(proto1, "tcp") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
956 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
957 if (strcmp(proto1, "tcp6") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
958 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
959 return (B_FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
960 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
961
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
962 if (strcmp(proto0, "tcp6") == 0) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
963 if (strcmp(proto1, "tcp") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
964 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
965 if (strcmp(proto1, "tcp6only") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
966 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
967 if (strcmp(proto1, "tcp6") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
968 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
969 return (B_FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
970 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
971
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
972 if (strcmp(proto0, "tcp6only") == 0) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
973 if (strcmp(proto1, "tcp6only") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
974 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
975 if (strcmp(proto1, "tcp6") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
976 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
977 return (B_FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
978 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
979
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
980 if (strcmp(proto0, "udp") == 0) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
981 if (strcmp(proto1, "udp") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
982 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
983 if (strcmp(proto1, "udp6") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
984 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
985 return (B_FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
986 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
987
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
988 if (strcmp(proto0, "udp6") == 0) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
989
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
990 if (strcmp(proto1, "udp") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
991 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
992 if (strcmp(proto1, "udp6only") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
993 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
994 if (strcmp(proto1, "udp6") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
995 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
996 return (B_FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
997 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
998
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
999 if (strcmp(proto0, "udp6only") == 0) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1000
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1001 if (strcmp(proto1, "udp6only") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1002 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1003 if (strcmp(proto1, "udp6") == 0)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1004 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1005 return (0);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1006 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1007
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1008 /*
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1009 * If the protocol isn't TCP/IP or UDP/IP assume that it has its own
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1010 * port namepsace and that conflicts can be detected by literal string
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1011 * comparison.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1012 */
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1013
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1014 if (strcmp(proto0, proto1))
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1015 return (FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1016
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1017 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1018 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1019
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1020
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1021 /*
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1022 * Check if inetd thinks this RPC program number is already registered.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1023 *
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1024 * An RPC protocol conflict occurs if
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1025 * a) the program numbers are the same and,
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1026 * b) the version numbers overlap,
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1027 * c) the protocols (TCP vs UDP vs tic*) are the same.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1028 */
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1029
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1030 boolean_t
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1031 is_rpc_num_in_use(int rpc_n, char *proto, int lowver, int highver) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1032 instance_t *i;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1033 basic_cfg_t *cfg;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1034 proto_info_t *pi;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1035
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1036 for (i = uu_list_first(instance_list); i != NULL;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1037 i = uu_list_next(instance_list, i)) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1038
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1039 if (i->cur_istate != IIS_ONLINE)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1040 continue;
784
0b5569508ac8 6342780 fix for 6311192 causes inetd to segfault on bootup.
dstaff
parents: 760
diff changeset
1041 cfg = i->config->basic;
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1042
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1043 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1044 pi = uu_list_next(cfg->proto_list, pi)) {
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1045
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1046 if (pi->ri == NULL)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1047 continue;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1048 if (pi->ri->prognum != rpc_n)
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1049 continue;
760
875a88a429b8 6311192 inetd does not handle multiple rpc services with the same rpc program # (fix cstyle)
dstaff
parents: 759
diff changeset
1050 if (!is_rpc_proto_conflict(pi->proto, proto))
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1051 continue;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1052 if ((lowver < pi->ri->lowver &&
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1053 highver < pi->ri->lowver) ||
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1054 (lowver > pi->ri->highver &&
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1055 highver > pi->ri->highver))
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1056 continue;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1057 return (B_TRUE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1058 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1059 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1060 return (B_FALSE);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1061 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1062
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1063
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1064 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1065 * Independent of the transport, for each of the entries in the instance's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1066 * proto list this function first attempts to create an associated network fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1067 * for RPC services these are then bound to a kernel chosen port and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1068 * fd is registered with rpcbind; for non-RPC services the fds are bound
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1069 * to the port associated with the instance's service name. On any successful
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1070 * binds the instance is taken online. Failed binds are handled by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1071 * handle_bind_failure().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1072 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1073 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1074 create_bound_fds(instance_t *instance)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1075 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1076 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1077 boolean_t failure = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1078 boolean_t success = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1079 proto_info_t *pi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1081 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1082 * Loop through and try and bind any unbound protos.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1083 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1084 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1085 pi = uu_list_next(cfg->proto_list, pi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1086 if (pi->listen_fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1087 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1088 if (cfg->istlx) {
4754
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
1089 pi->listen_fd = create_bound_endpoint(instance,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1090 (tlx_info_t *)pi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1091 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1092 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1093 * We cast pi to a void so we can then go on to cast
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1094 * it to a socket_info_t without lint complaining
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1095 * about alignment. This is done because the x86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1096 * version of lint thinks a lint suppression directive
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1097 * is unnecessary and flags it as such, yet the sparc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1098 * version complains if it's absent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1099 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1100 void *p = pi;
4754
0586690ea7f0 PSARC/2007/399 inetd backlog SMF property: connection_backlog
vp157776
parents: 4752
diff changeset
1101 pi->listen_fd = create_bound_socket(instance,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1102 (socket_info_t *)p);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1103 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1104 if (pi->listen_fd == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1105 failure = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1106 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1107 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1109 if (pi->ri != NULL) {
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1110
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1111 /*
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1112 * Don't register the same RPC program number twice.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1113 * Doing so silently discards the old service
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1114 * without causing an error.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1115 */
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1116 if (is_rpc_num_in_use(pi->ri->prognum, pi->proto,
4357
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
1117 pi->ri->lowver, pi->ri->highver)) {
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1118 failure = B_TRUE;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1119 close_net_fd(instance, pi->listen_fd);
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1120 pi->listen_fd = -1;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1121 continue;
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1122 }
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
1123
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1124 unregister_rpc_service(instance->fmri, pi->ri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1125 if (register_rpc_service(instance->fmri, pi->ri) ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1126 -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1127 close_net_fd(instance, pi->listen_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1128 pi->listen_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1129 failure = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1130 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1131 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1132 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1134 success = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1135 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1137 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1138 case IIS_OFFLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1139 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1140 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1141 * If we've managed to bind at least one proto lets run the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1142 * online method, so we can start listening for it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1143 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1144 if (success && run_method(instance, IM_ONLINE, NULL) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1145 return; /* instance gone to maintenance */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1146 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1147 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1148 case IIS_IN_REFRESH_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1149 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1150 * We're 'online', so start polling on any bound fds we're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1151 * currently not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1152 */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
1153 if (poll_bound_fds(instance, B_TRUE, NULL) != 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1154 failure = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1155 } else if (!failure) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1156 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1157 * We've successfully bound and poll'd upon all protos,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1158 * so reset the failure count.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1159 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1160 instance->bind_fail_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1161 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1162 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1163 case IIS_IN_ONLINE_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1164 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1165 * Nothing to do here as the method completion code will start
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1166 * listening for any successfully bound fds.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1167 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1168 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1169 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1170 #ifndef NDEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1171 (void) fprintf(stderr, "%s:%d: Unknown instance state %d.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1172 __FILE__, __LINE__, instance->cur_istate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1173 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1174 abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1175 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1177 if (failure)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1178 handle_bind_failure(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1179 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1181 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1182 * Counter to create_bound_fds(), for each of the bound network fds this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1183 * function unregisters the instance from rpcbind if it's an RPC service,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1184 * stops listening for new connections for it and then closes the listening fd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1185 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1186 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1187 destroy_bound_fds(instance_t *instance)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1188 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1189 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1190 proto_info_t *pi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1192 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1193 pi = uu_list_next(cfg->proto_list, pi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1194 if (pi->listen_fd != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1195 if (pi->ri != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1196 unregister_rpc_service(instance->fmri, pi->ri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1197 clear_pollfd(pi->listen_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1198 close_net_fd(instance, pi->listen_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1199 pi->listen_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1200 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1201 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1203 /* cancel any bind retries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1204 if (instance->bind_timer_id != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1205 cancel_bind_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1207 instance->bind_retries_exceeded = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1208 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1210 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1211 * Perform %A address expansion and return a pointer to a static string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1212 * array containing crafted arguments. This expansion is provided for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1213 * compatibility with 4.2BSD daemons, and as such we've copied the logic of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1214 * the legacy inetd to maintain this compatibility as much as possible. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1215 * logic is a bit scatty, but it dates back at least as far as SunOS 4.x.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1216 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1217 static char **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1218 expand_address(instance_t *inst, const proto_info_t *pi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1219 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1220 static char addrbuf[sizeof ("ffffffff.65536")];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1221 static char *ret[3];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1222 instance_cfg_t *cfg = inst->config;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1223 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1224 * We cast pi to a void so we can then go on to cast it to a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1225 * socket_info_t without lint complaining about alignment. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1226 * is done because the x86 version of lint thinks a lint suppression
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1227 * directive is unnecessary and flags it as such, yet the sparc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1228 * version complains if it's absent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1229 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1230 const void *p = pi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1232 /* set ret[0] to the basename of exec path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1233 if ((ret[0] = strrchr(cfg->methods[IM_START]->exec_path, '/'))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1234 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1235 ret[0]++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1236 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1237 ret[0] = cfg->methods[IM_START]->exec_path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1238 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1240 if (!cfg->basic->istlx &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1241 (((socket_info_t *)p)->type == SOCK_DGRAM)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1242 ret[1] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1243 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1244 addrbuf[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1245 if (!cfg->basic->iswait &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1246 (inst->remote_addr.ss_family == AF_INET)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1247 struct sockaddr_in *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1249 sp = (struct sockaddr_in *)&(inst->remote_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1250 (void) snprintf(addrbuf, sizeof (addrbuf), "%x.%hu",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1251 ntohl(sp->sin_addr.s_addr), ntohs(sp->sin_port));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1252 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1253 ret[1] = addrbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1254 ret[2] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1255 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1257 return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1258 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1260 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1261 * Returns the state associated with the supplied method being run for an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1262 * instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1263 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1264 static internal_inst_state_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1265 get_method_state(instance_method_t method)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1266 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1267 state_info_t *sip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1269 for (sip = states; sip->istate != IIS_NONE; sip++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1270 if (sip->method_running == method)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1271 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1272 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1273 assert(sip->istate != IIS_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1275 return (sip->istate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1276 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1278 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1279 * Store the method's PID and CID in the repository. If the store fails
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1280 * we ignore it and just drive on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1281 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1282 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1283 add_method_ids(instance_t *ins, pid_t pid, ctid_t cid, instance_method_t mthd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1284 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1285 if (cid != -1)
3175
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
1286 (void) add_remove_contract(ins, B_TRUE, cid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1288 if (mthd == IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1289 if (add_rep_val(ins->start_pids, (int64_t)pid) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1290 (void) store_rep_vals(ins->start_pids, ins->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1291 PR_NAME_START_PIDS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1292 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1293 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1294 if (add_rep_val(ins->non_start_pid, (int64_t)pid) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1295 (void) store_rep_vals(ins->non_start_pid, ins->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1296 PR_NAME_NON_START_PID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1297 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1298 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1299 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1300
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1301 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1302 * Remove the method's PID and CID from the repository. If the removal
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1303 * fails we ignore it and drive on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1304 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1305 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1306 remove_method_ids(instance_t *inst, pid_t pid, ctid_t cid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1307 instance_method_t mthd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1308 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1309 if (cid != -1)
3175
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
1310 (void) add_remove_contract(inst, B_FALSE, cid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1312 if (mthd == IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1313 remove_rep_val(inst->start_pids, (int64_t)pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1314 (void) store_rep_vals(inst->start_pids, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1315 PR_NAME_START_PIDS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1316 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1317 remove_rep_val(inst->non_start_pid, (int64_t)pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1318 (void) store_rep_vals(inst->non_start_pid, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1319 PR_NAME_NON_START_PID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1320 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1321 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1323 static instance_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1324 create_instance(const char *fmri)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1325 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1326 instance_t *ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1328 if (((ret = calloc(1, sizeof (instance_t))) == NULL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1329 ((ret->fmri = strdup(fmri)) == NULL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1330 goto alloc_fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1332 ret->conn_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1334 ret->copies = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1336 ret->conn_rate_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1337 ret->fail_rate_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1338 ret->bind_fail_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1340 if (((ret->non_start_pid = create_rep_val_list()) == NULL) ||
3175
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
1341 ((ret->start_pids = create_rep_val_list()) == NULL) ||
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
1342 ((ret->start_ctids = create_rep_val_list()) == NULL))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1343 goto alloc_fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1345 ret->cur_istate = IIS_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1346 ret->next_istate = IIS_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1348 if (((ret->cur_istate_rep = create_rep_val_list()) == NULL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1349 ((ret->next_istate_rep = create_rep_val_list()) == NULL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1350 goto alloc_fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1352 ret->config = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1353 ret->new_config = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1354
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1355 ret->timer_id = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1356 ret->bind_timer_id = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1358 ret->disable_req = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1359 ret->maintenance_req = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1360 ret->conn_rate_exceeded = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1361 ret->bind_retries_exceeded = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1363 ret->pending_rst_event = RESTARTER_EVENT_TYPE_INVALID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1365 return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1367 alloc_fail:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1368 error_msg(strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1369 destroy_instance(ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1370 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1371 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1373 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1374 destroy_instance(instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1375 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1376 if (inst == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1377 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1379 destroy_instance_cfg(inst->config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1380 destroy_instance_cfg(inst->new_config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1382 destroy_rep_val_list(inst->cur_istate_rep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1383 destroy_rep_val_list(inst->next_istate_rep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1385 destroy_rep_val_list(inst->start_pids);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1386 destroy_rep_val_list(inst->non_start_pid);
3175
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
1387 destroy_rep_val_list(inst->start_ctids);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1389 free(inst->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1391 free(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1392 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1394 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1395 * Retrieves the current and next states internal states. Returns 0 on success,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1396 * else returns one of the following on error:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1397 * SCF_ERROR_NO_MEMORY if memory allocation failed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1398 * SCF_ERROR_CONNECTION_BROKEN if the connection to the repository was broken.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1399 * SCF_ERROR_TYPE_MISMATCH if the property was of an unexpected type.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1400 * SCF_ERROR_NO_RESOURCES if the server doesn't have adequate resources.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1401 * SCF_ERROR_NO_SERVER if the server isn't running.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1402 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1403 static scf_error_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1404 retrieve_instance_state(instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1405 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1406 scf_error_t ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1408 /* retrieve internal states */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1409 if (((ret = retrieve_rep_vals(inst->cur_istate_rep, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1410 PR_NAME_CUR_INT_STATE)) != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1411 ((ret = retrieve_rep_vals(inst->next_istate_rep, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1412 PR_NAME_NEXT_INT_STATE)) != 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1413 if (ret != SCF_ERROR_NOT_FOUND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1414 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1415 "Failed to read state of instance %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1416 inst->fmri, scf_strerror(scf_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1417 return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1418 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1420 debug_msg("instance with no previous int state - "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1421 "setting state to uninitialized");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1423 if ((set_single_rep_val(inst->cur_istate_rep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1424 (int64_t)IIS_UNINITIALIZED) == -1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1425 (set_single_rep_val(inst->next_istate_rep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1426 (int64_t)IIS_NONE) == -1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1427 return (SCF_ERROR_NO_MEMORY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1428 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1429 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1431 /* update convenience states */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1432 inst->cur_istate = get_single_rep_val(inst->cur_istate_rep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1433 inst->next_istate = get_single_rep_val(inst->next_istate_rep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1434 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1435 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1437 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1438 * Retrieve stored process ids and register each of them so we process their
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1439 * termination.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1440 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1441 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1442 retrieve_method_pids(instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1443 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1444 rep_val_t *rv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1446 switch (retrieve_rep_vals(inst->start_pids, inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1447 PR_NAME_START_PIDS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1448 case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1449 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1450 case SCF_ERROR_NOT_FOUND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1451 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1452 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1453 error_msg(gettext("Failed to retrieve the start pids of "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1454 "instance %s from repository: %s"), inst->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1455 scf_strerror(scf_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1456 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1457 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1459 rv = uu_list_first(inst->start_pids);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1460 while (rv != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1461 if (register_method(inst, (pid_t)rv->val, (ctid_t)-1,
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
1462 IM_START, NULL) == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1463 inst->copies++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1464 rv = uu_list_next(inst->start_pids, rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1465 } else if (errno == ENOENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1466 pid_t pid = (pid_t)rv->val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1468 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1469 * The process must have already terminated. Remove
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1470 * it from the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1471 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1472 rv = uu_list_next(inst->start_pids, rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1473 remove_rep_val(inst->start_pids, pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1474 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1475 error_msg(gettext("Failed to listen for the completion "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1476 "of %s method of instance %s"), START_METHOD_NAME,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1477 inst->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1478 rv = uu_list_next(inst->start_pids, rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1479 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1480 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1482 /* synch the repository pid list to remove any terminated pids */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1483 (void) store_rep_vals(inst->start_pids, inst->fmri, PR_NAME_START_PIDS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1485 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1486 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1488 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1489 * Remove the passed instance from inetd control.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1490 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1491 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1492 remove_instance(instance_t *instance)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1493 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1494 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1495 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1496 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1497 /* stop listening for network connections */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1498 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1499 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1500 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1501 cancel_bind_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1502 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1503 case IIS_OFFLINE_CONRATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1504 cancel_inst_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1505 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1506 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1508 /* stop listening for terminated methods */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1509 unregister_instance_methods(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1510
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1511 uu_list_remove(instance_list, instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1512 destroy_instance(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1513 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1515 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1516 * Refresh the configuration of instance 'inst'. This method gets called as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1517 * a result of a refresh event for the instance from the master restarter, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1518 * we can rely upon the instance's running snapshot having been updated from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1519 * its configuration snapshot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1520 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1521 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1522 refresh_instance(instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1523 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1524 instance_cfg_t *cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1526 switch (inst->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1527 case IIS_MAINTENANCE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1528 case IIS_DISABLED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1529 case IIS_UNINITIALIZED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1530 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1531 * Ignore any possible changes, we'll re-read the configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1532 * automatically when we exit these states.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1533 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1534 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1536 case IIS_OFFLINE_COPIES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1537 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1538 case IIS_OFFLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1539 case IIS_OFFLINE_CONRATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1540 destroy_instance_cfg(inst->config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1541 if ((inst->config = read_instance_cfg(inst->fmri)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1542 log_invalid_cfg(inst->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1543 if (inst->cur_istate == IIS_OFFLINE_BIND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1544 cancel_bind_timer(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1545 } else if (inst->cur_istate == IIS_OFFLINE_CONRATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1546 cancel_inst_timer(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1547 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1548 update_state(inst, IIS_MAINTENANCE, RERR_FAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1549 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1550 switch (inst->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1551 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1552 if (copies_limit_exceeded(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1553 /* Cancel scheduled bind retries. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1554 cancel_bind_timer(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1556 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1557 * Take the instance to the copies
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1558 * offline state, via the offline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1559 * state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1560 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1561 update_state(inst, IIS_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1562 RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1563 process_offline_inst(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1564 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1565 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1566
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1567 case IIS_OFFLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1568 process_offline_inst(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1569 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1571 case IIS_OFFLINE_CONRATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1572 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1573 * Since we're already in a DOS state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1574 * don't bother evaluating the copies
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1575 * limit. This will be evaluated when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1576 * we leave this state in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1577 * process_offline_inst().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1578 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1579 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1581 case IIS_OFFLINE_COPIES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1582 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1583 * Check if the copies limit has been increased
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1584 * above the current count.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1585 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1586 if (!copies_limit_exceeded(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1587 update_state(inst, IIS_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1588 RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1589 process_offline_inst(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1590 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1591 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1593 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1594 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1595 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1596 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1597 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1599 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1600 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1601 if ((cfg = read_instance_cfg(inst->fmri)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1602 instance_cfg_t *ocfg = inst->config;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1604 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1605 * Try to avoid the overhead of taking an instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1606 * offline and back on again. We do this by limiting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1607 * this behavior to two eventualities:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1608 * - there needs to be a re-bind to listen on behalf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1609 * of the instance with its new configuration. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1610 * could be because for example its service has been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1611 * associated with a different port, or because the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1612 * v6only protocol option has been newly applied to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1613 * the instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1614 * - one or both of the start or online methods of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1615 * instance have changed in the new configuration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1616 * Without taking the instance offline when the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1617 * start method changed the instance may be running
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1618 * with unwanted parameters (or event an unwanted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1619 * binary); and without taking the instance offline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1620 * if its online method was to change, some part of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1621 * its running environment may have changed and would
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1622 * not be picked up until the instance next goes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1623 * offline for another reason.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1624 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1625 if ((!bind_config_equal(ocfg->basic, cfg->basic)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1626 !method_info_equal(ocfg->methods[IM_ONLINE],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1627 cfg->methods[IM_ONLINE]) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1628 !method_info_equal(ocfg->methods[IM_START],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1629 cfg->methods[IM_START])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1630 destroy_bound_fds(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1632 assert(inst->new_config == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1633 inst->new_config = cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1635 (void) run_method(inst, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1636 } else { /* no bind config / method changes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1638 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1639 * swap the proto list over from the old
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1640 * configuration to the new, so we retain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1641 * our set of network fds.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1642 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1643 destroy_proto_list(cfg->basic);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1644 cfg->basic->proto_list =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1645 ocfg->basic->proto_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1646 ocfg->basic->proto_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1647 destroy_instance_cfg(ocfg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1648 inst->config = cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1650 /* re-evaluate copies limits based on new cfg */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1651 if (copies_limit_exceeded(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1652 destroy_bound_fds(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1653 (void) run_method(inst, IM_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1654 NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1655 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1656 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1657 * Since the instance isn't being
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1658 * taken offline, where we assume it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1659 * would pick-up any configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1660 * changes automatically when it goes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1661 * back online, run its refresh method
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1662 * to allow it to pick-up any changes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1663 * whilst still online.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1664 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1665 (void) run_method(inst, IM_REFRESH,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1666 NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1667 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1668 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1669 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1670 log_invalid_cfg(inst->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1672 destroy_bound_fds(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1674 inst->maintenance_req = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1675 (void) run_method(inst, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1676 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1677 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1679 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1680 debug_msg("Unhandled current state %d for instance in "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1681 "refresh_instance", inst->cur_istate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1682 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1683 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1684 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1686 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1687 * Called by process_restarter_event() to handle a restarter event for an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1688 * instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1689 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1690 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1691 handle_restarter_event(instance_t *instance, restarter_event_type_t event,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1692 boolean_t send_ack)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1693 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1694 switch (event) {
4752
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1695 case RESTARTER_EVENT_TYPE_ADD_INSTANCE:
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1696 /*
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1697 * When startd restarts, it sends _ADD_INSTANCE to delegated
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1698 * restarters for all those services managed by them. We should
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1699 * acknowledge this event, as startd's graph needs to be updated
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1700 * about the current state of the service, when startd is
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1701 * restarting.
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1702 * update_state() is ok to be called here, as commands for
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1703 * instances in transition are deferred by
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1704 * process_restarter_event().
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1705 */
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1706 update_state(instance, instance->cur_istate, RERR_NONE);
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1707 goto done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1708 case RESTARTER_EVENT_TYPE_ADMIN_REFRESH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1709 refresh_instance(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1710 goto done;
4752
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1711 case RESTARTER_EVENT_TYPE_ADMIN_RESTART:
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1712 /*
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1713 * We've got a restart event, so if the instance is online
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1714 * in any way initiate taking it offline, and rely upon
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1715 * our restarter to send us an online event to bring
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1716 * it back online.
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1717 */
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1718 switch (instance->cur_istate) {
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1719 case IIS_ONLINE:
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1720 case IIS_DEGRADED:
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1721 destroy_bound_fds(instance);
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1722 (void) run_method(instance, IM_OFFLINE, NULL);
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1723 }
19cfcd43280f 6566235 disabling and re-enabling put nfs/server service in offline state after restarting svc.startd
vp157776
parents: 4357
diff changeset
1724 goto done;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1725 case RESTARTER_EVENT_TYPE_REMOVE_INSTANCE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1726 remove_instance(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1727 goto done;
11482
7315713fb22c 6311392 The Quick and the Dead: rapid-fire svcadm restart leads to maintenance
Sean Wilcox <Sean.Wilcox@Sun.COM>
parents: 10873
diff changeset
1728 case RESTARTER_EVENT_TYPE_STOP_RESET:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1729 case RESTARTER_EVENT_TYPE_STOP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1730 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1731 case IIS_OFFLINE_CONRATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1732 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1733 case IIS_OFFLINE_COPIES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1734 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1735 * inetd must be closing down as we wouldn't get this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1736 * event in one of these states from the master
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1737 * restarter. Take the instance to the offline resting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1738 * state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1739 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1740 if (instance->cur_istate == IIS_OFFLINE_BIND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1741 cancel_bind_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1742 } else if (instance->cur_istate ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1743 IIS_OFFLINE_CONRATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1744 cancel_inst_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1745 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1746 update_state(instance, IIS_OFFLINE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1747 goto done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1748 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1749 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1750 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1751
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1752 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1753 case IIS_OFFLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1754 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1755 case RESTARTER_EVENT_TYPE_START:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1756 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1757 * Dependencies are met, let's take the service online.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1758 * Only try and bind for a wait type service if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1759 * no process is running on its behalf. Otherwise, just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1760 * mark the service online and binding will be attempted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1761 * when the process exits.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1762 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1763 if (!(instance->config->basic->iswait &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1764 (uu_list_first(instance->start_pids) != NULL))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1765 create_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1766 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1767 update_state(instance, IIS_ONLINE, RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1768 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1769 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1770 case RESTARTER_EVENT_TYPE_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1771 case RESTARTER_EVENT_TYPE_ADMIN_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1772 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1773 * The instance should be disabled, so run the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1774 * instance's disabled method that will do the work
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1775 * to take it there.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1776 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1777 (void) run_method(instance, IM_DISABLE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1778 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1779 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1780 case RESTARTER_EVENT_TYPE_DEPENDENCY_CYCLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1781 case RESTARTER_EVENT_TYPE_INVALID_DEPENDENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1782 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1783 * The master restarter has requested the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1784 * go to maintenance; since we're already offline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1785 * just update the state to the maintenance state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1786 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1787 update_state(instance, IIS_MAINTENANCE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1788 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1789 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1790 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1792 case IIS_OFFLINE_BIND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1793 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1794 case RESTARTER_EVENT_TYPE_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1795 case RESTARTER_EVENT_TYPE_ADMIN_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1796 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1797 * The instance should be disabled. Firstly, as for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1798 * the above dependencies unmet comment, cancel
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1799 * the bind retry timer and update the state to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1800 * offline. Then, run the disable method to do the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1801 * work to take the instance from offline to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1802 * disabled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1803 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1804 cancel_bind_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1805 update_state(instance, IIS_OFFLINE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1806 (void) run_method(instance, IM_DISABLE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1807 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1808 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1809 case RESTARTER_EVENT_TYPE_DEPENDENCY_CYCLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1810 case RESTARTER_EVENT_TYPE_INVALID_DEPENDENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1811 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1812 * The master restarter has requested the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1813 * be placed in the maintenance state. Cancel the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1814 * outstanding retry timer, and since we're already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1815 * offline, update the state to maintenance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1816 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1817 cancel_bind_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1818 update_state(instance, IIS_MAINTENANCE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1819 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1820 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1821 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1822
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1823 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1824 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1825 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1826 case RESTARTER_EVENT_TYPE_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1827 case RESTARTER_EVENT_TYPE_ADMIN_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1828 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1829 * The instance needs to be disabled. Do the same work
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1830 * as for the dependencies unmet event below to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1831 * take the instance offline.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1832 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1833 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1834 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1835 * Indicate that the offline method is being run
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1836 * as part of going to the disabled state, and to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1837 * carry on this transition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1838 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1839 instance->disable_req = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1840 (void) run_method(instance, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1841 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1842 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1843 case RESTARTER_EVENT_TYPE_DEPENDENCY_CYCLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1844 case RESTARTER_EVENT_TYPE_INVALID_DEPENDENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1845 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1846 * The master restarter has requested the instance be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1847 * placed in the maintenance state. This involves
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1848 * firstly taking the service offline, so do the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1849 * same work as for the dependencies unmet event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1850 * below. We set the maintenance_req flag to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1851 * indicate that when we get to the offline state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1852 * we should be placed directly into the maintenance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1853 * state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1854 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1855 instance->maintenance_req = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1856 /* FALLTHROUGH */
11623
ce2b5201c4cb 6919271 wait services are not getting timers reset on a clean exit
Sean Wilcox <Sean.Wilcox@Sun.COM>
parents: 11482
diff changeset
1857 case RESTARTER_EVENT_TYPE_STOP_RESET:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1858 case RESTARTER_EVENT_TYPE_STOP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1859 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1860 * Dependencies have become unmet. Close and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1861 * stop listening on the instance's network file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1862 * descriptor, and run the offline method to do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1863 * any work required to take us to the offline state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1864 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1865 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1866 (void) run_method(instance, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1867 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1868 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1869
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1870 case IIS_UNINITIALIZED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1871 if (event == RESTARTER_EVENT_TYPE_DISABLE ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1872 event == RESTARTER_EVENT_TYPE_ADMIN_DISABLE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1873 update_state(instance, IIS_DISABLED, RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1874 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1875 } else if (event != RESTARTER_EVENT_TYPE_ENABLE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1876 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1877 * Ignore other events until we know whether we're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1878 * enabled or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1879 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1880 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1881 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1883 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1884 * We've got an enabled event; make use of the handling in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1885 * disable case.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1886 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1887 /* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1889 case IIS_DISABLED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1890 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1891 case RESTARTER_EVENT_TYPE_ENABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1892 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1893 * The instance needs enabling. Commence reading its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1894 * configuration and if successful place the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1895 * in the offline state and let process_offline_inst()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1896 * take it from there.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1897 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1898 destroy_instance_cfg(instance->config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1899 instance->config = read_instance_cfg(instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1900 if (instance->config != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1901 update_state(instance, IIS_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1902 RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1903 process_offline_inst(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1904 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1905 log_invalid_cfg(instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1906 update_state(instance, IIS_MAINTENANCE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1907 RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1908 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1909
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1910 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1911 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1912 case RESTARTER_EVENT_TYPE_DEPENDENCY_CYCLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1913 case RESTARTER_EVENT_TYPE_INVALID_DEPENDENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1914 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1915 * The master restarter has requested the instance be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1916 * placed in the maintenance state, so just update its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1917 * state to maintenance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1918 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1919 update_state(instance, IIS_MAINTENANCE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1920 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1921 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1922 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1923
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1924 case IIS_MAINTENANCE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1925 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1926 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_OFF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1927 case RESTARTER_EVENT_TYPE_ADMIN_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1928 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1929 * The master restarter has requested that the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1930 * be taken out of maintenance. Read its configuration,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1931 * and if successful place the instance in the offline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1932 * state and call process_offline_inst() to take it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1933 * from there.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1934 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1935 destroy_instance_cfg(instance->config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1936 instance->config = read_instance_cfg(instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1937 if (instance->config != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1938 update_state(instance, IIS_OFFLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1939 RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1940 process_offline_inst(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1941 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1942 boolean_t enabled;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1943
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1944 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1945 * The configuration was invalid. If the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1946 * service has disabled requested, let's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1947 * just place the instance in disabled even
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1948 * though we haven't been able to run its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1949 * disable method, as the slightly incorrect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1950 * state is likely to be less of an issue to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1951 * an administrator than refusing to move an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1952 * instance to disabled. If disable isn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1953 * requested, re-mark the service's state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1954 * as maintenance, so the administrator can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1955 * see the request was processed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1956 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1957 if ((read_enable_merged(instance->fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1958 &enabled) == 0) && !enabled) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1959 update_state(instance, IIS_DISABLED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1960 RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1961 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1962 log_invalid_cfg(instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1963 update_state(instance, IIS_MAINTENANCE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1964 RERR_FAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1965 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1966 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1967 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1968 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1969 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1970
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1971 case IIS_OFFLINE_CONRATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1972 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1973 case RESTARTER_EVENT_TYPE_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1974 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1975 * The instance wants disabling. Take the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1976 * offline as for the dependencies unmet event above,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1977 * and then from there run the disable method to do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1978 * the work to take the instance to the disabled state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1979 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1980 cancel_inst_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1981 update_state(instance, IIS_OFFLINE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1982 (void) run_method(instance, IM_DISABLE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1983 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1984 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1985 case RESTARTER_EVENT_TYPE_DEPENDENCY_CYCLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1986 case RESTARTER_EVENT_TYPE_INVALID_DEPENDENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1987 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1988 * The master restarter has requested the instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1989 * be taken to maintenance. Cancel the timer setup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1990 * when we entered this state, and go directly to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1991 * maintenance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1992 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1993 cancel_inst_timer(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1994 update_state(instance, IIS_MAINTENANCE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1995 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1996 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1997 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1998
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1999 case IIS_OFFLINE_COPIES:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2000 switch (event) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2001 case RESTARTER_EVENT_TYPE_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2002 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2003 * The instance wants disabling. Update the state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2004 * to offline, and run the disable method to do the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2005 * work to take it to the disabled state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2006 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2007 update_state(instance, IIS_OFFLINE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2008 (void) run_method(instance, IM_DISABLE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2009 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2010 case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2011 case RESTARTER_EVENT_TYPE_DEPENDENCY_CYCLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2012 case RESTARTER_EVENT_TYPE_INVALID_DEPENDENCY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2013 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2014 * The master restarter has requested the instance be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2015 * placed in maintenance. Since it's already offline
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2016 * simply update the state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2017 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2018 update_state(instance, IIS_MAINTENANCE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2019 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2020 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2021 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2023 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2024 debug_msg("handle_restarter_event: instance in an "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2025 "unexpected state");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2026 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2027 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2029 done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2030 if (send_ack)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2031 ack_restarter_event(B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2032 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2033
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2034 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2035 * Tries to read and process an event from the event pipe. If there isn't one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2036 * or an error occurred processing the event it returns -1. Else, if the event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2037 * is for an instance we're not already managing we read its state, add it to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2038 * our list to manage, and if appropriate read its configuration. Whether it's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2039 * new to us or not, we then handle the specific event.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2040 * Returns 0 if an event was read and processed successfully, else -1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2041 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2042 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2043 process_restarter_event(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2044 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2045 char *fmri;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2046 size_t fmri_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2047 restarter_event_type_t event_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2048 instance_t *instance;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2049 restarter_event_t *event;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2050 ssize_t sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2052 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2053 * Try to read an event pointer from the event pipe.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2054 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2055 errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2056 switch (safe_read(rst_event_pipe[PE_CONSUMER], &event,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2057 sizeof (event))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2058 case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2059 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2060 case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2061 if (errno == EAGAIN) /* no event to read */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2062 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2064 /* other end of pipe closed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2066 /* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2067 default: /* unexpected read error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2068 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2069 * There's something wrong with the event pipe. Let's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2070 * shutdown and be restarted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2071 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2072 inetd_stop();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2073 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2074 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2075
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2076 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2077 * Check if we're currently managing the instance which the event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2078 * pertains to. If not, read its complete state and add it to our
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2079 * list to manage.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2080 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2082 fmri_size = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2083 if ((fmri = malloc(fmri_size)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2084 error_msg(strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2085 goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2086 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2087 sz = restarter_event_get_instance(event, fmri, fmri_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2088 if (sz >= fmri_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2089 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2091 for (instance = uu_list_first(instance_list); instance != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2092 instance = uu_list_next(instance_list, instance)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2093 if (strcmp(instance->fmri, fmri) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2094 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2095 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2096
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2097 if (instance == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2098 int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2099
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2100 debug_msg("New instance to manage: %s", fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2102 if (((instance = create_instance(fmri)) == NULL) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2103 (retrieve_instance_state(instance) != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2104 (retrieve_method_pids(instance) != 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2105 destroy_instance(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2106 free(fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2107 goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2108 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2109
3175
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
2110 if (((err = iterate_repository_contracts(instance, 0))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2111 != 0) && (err != ENOENT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2112 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2113 "Failed to adopt contracts of instance %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2114 instance->fmri, strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2115 destroy_instance(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2116 free(fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2117 goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2118 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2120 uu_list_node_init(instance, &instance->link, instance_pool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2121 (void) uu_list_insert_after(instance_list, NULL, instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2123 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2124 * Only read configuration for instances that aren't in any of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2125 * the disabled, maintenance or uninitialized states, since
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2126 * they'll read it on state exit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2127 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2128 if ((instance->cur_istate != IIS_DISABLED) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2129 (instance->cur_istate != IIS_MAINTENANCE) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2130 (instance->cur_istate != IIS_UNINITIALIZED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2131 instance->config = read_instance_cfg(instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2132 if (instance->config == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2133 log_invalid_cfg(instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2134 update_state(instance, IIS_MAINTENANCE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2135 RERR_FAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2136 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2137 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2138 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2140 free(fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2142 event_type = restarter_event_get_type(event);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2143 debug_msg("Event type: %d for instance: %s", event_type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2144 instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2146 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2147 * If the instance is currently running a method, don't process the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2148 * event now, but attach it to the instance for processing when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2149 * the instance finishes its transition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2150 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2151 if (INST_IN_TRANSITION(instance)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2152 debug_msg("storing event %d for instance %s", event_type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2153 instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2154 instance->pending_rst_event = event_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2155 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2156 handle_restarter_event(instance, event_type, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2157 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2159 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2161 fail:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2162 ack_restarter_event(B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2163 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2164 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2166 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2167 * Do the state machine processing associated with the termination of instance
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2168 * 'inst''s start method for the 'proto_name' protocol if this parameter is not
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2169 * NULL.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2170 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2171 void
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2172 process_start_term(instance_t *inst, char *proto_name)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2173 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2174 basic_cfg_t *cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2176 inst->copies--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2178 if ((inst->cur_istate == IIS_MAINTENANCE) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2179 (inst->cur_istate == IIS_DISABLED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2180 /* do any further processing/checks when we exit these states */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2181 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2182 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2184 cfg = inst->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2186 if (cfg->iswait) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2187 proto_info_t *pi;
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2188 boolean_t listen;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2190 switch (inst->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2191 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2192 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2193 case IIS_IN_REFRESH_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2194 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2195 * A wait type service's start method has exited.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2196 * Check if the method was fired off in this inetd's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2197 * lifetime, or a previous one; if the former,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2198 * re-commence listening on the service's behalf; if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2199 * the latter, mark the service offline and let bind
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2200 * attempts commence.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2201 */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2202 listen = B_FALSE;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2203 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2204 pi = uu_list_next(cfg->proto_list, pi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2205 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2206 * If a bound fd exists, the method was fired
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2207 * off during this inetd's lifetime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2208 */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2209 if (pi->listen_fd != -1) {
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2210 listen = B_TRUE;
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2211 if (proto_name == NULL ||
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2212 strcmp(pi->proto, proto_name) == 0)
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2213 break;
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2214 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2215 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2216 if (pi != NULL) {
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2217 if (poll_bound_fds(inst, B_TRUE, proto_name) !=
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2218 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2219 handle_bind_failure(inst);
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2220 } else if (listen == B_FALSE) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2221 update_state(inst, IIS_OFFLINE, RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2222 create_bound_fds(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2223 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2224 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2225 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2226 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2227 * Check if a nowait service should be brought back online
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2228 * after exceeding its copies limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2229 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2230 if ((inst->cur_istate == IIS_OFFLINE_COPIES) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2231 !copies_limit_exceeded(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2232 update_state(inst, IIS_OFFLINE, RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2233 process_offline_inst(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2234 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2235 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2236 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2238 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2239 * If the instance has a pending event process it and initiate the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2240 * acknowledgement.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2241 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2242 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2243 process_pending_rst_event(instance_t *inst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2244 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2245 if (inst->pending_rst_event != RESTARTER_EVENT_TYPE_INVALID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2246 restarter_event_type_t re;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2248 debug_msg("Injecting pending event %d for instance %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2249 inst->pending_rst_event, inst->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2250 re = inst->pending_rst_event;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2251 inst->pending_rst_event = RESTARTER_EVENT_TYPE_INVALID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2252 handle_restarter_event(inst, re, B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2253 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2254 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2256 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2257 * Do the state machine processing associated with the termination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2258 * of the specified instance's non-start method with the specified status.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2259 * Once the processing of the termination is done, the function also picks up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2260 * any processing that was blocked on the method running.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2261 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2262 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2263 process_non_start_term(instance_t *inst, int status)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2264 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2265 boolean_t ran_online_method = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2267 if (status == IMRET_FAILURE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2268 error_msg(gettext("The %s method of instance %s failed, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2269 "transitioning to maintenance"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2270 methods[states[inst->cur_istate].method_running].name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2271 inst->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2273 if ((inst->cur_istate == IIS_IN_ONLINE_METHOD) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2274 (inst->cur_istate == IIS_IN_REFRESH_METHOD))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2275 destroy_bound_fds(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2277 update_state(inst, IIS_MAINTENANCE, RERR_FAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2279 inst->maintenance_req = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2280 inst->conn_rate_exceeded = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2282 if (inst->new_config != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2283 destroy_instance_cfg(inst->new_config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2284 inst->new_config = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2285 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2287 if (!inetd_stopping)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2288 process_pending_rst_event(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2290 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2291 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2293 /* non-failure method return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2295 if (status != IMRET_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2296 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2297 * An instance method never returned a supported return code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2298 * We'll assume this means the method succeeded for now whilst
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2299 * non-GL-cognizant methods are used - eg. pkill.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2300 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2301 debug_msg("The %s method of instance %s returned "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2302 "non-compliant exit code: %d, assuming success",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2303 methods[states[inst->cur_istate].method_running].name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2304 inst->fmri, status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2305 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2307 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2308 * Update the state from the in-transition state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2309 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2310 switch (inst->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2311 case IIS_IN_ONLINE_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2312 ran_online_method = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2313 /* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2314 case IIS_IN_REFRESH_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2315 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2316 * If we've exhausted the bind retries, flag that by setting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2317 * the instance's state to degraded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2318 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2319 if (inst->bind_retries_exceeded) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2320 update_state(inst, IIS_DEGRADED, RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2321 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2322 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2323 /* FALLTHROUGH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2324 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2325 update_state(inst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2326 methods[states[inst->cur_istate].method_running].dst_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2327 RERR_NONE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2328 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2330 if (inst->cur_istate == IIS_OFFLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2331 if (inst->new_config != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2332 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2333 * This instance was found during refresh to need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2334 * taking offline because its newly read configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2335 * was sufficiently different. Now we're offline,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2336 * activate this new configuration.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2337 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2338 destroy_instance_cfg(inst->config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2339 inst->config = inst->new_config;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2340 inst->new_config = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2341 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2343 /* continue/complete any transitions that are in progress */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2344 process_offline_inst(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2346 } else if (ran_online_method) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2347 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2348 * We've just successfully executed the online method. We have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2349 * a set of bound network fds that were created before running
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2350 * this method, so now we're online start listening for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2351 * connections on them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2352 */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
2353 if (poll_bound_fds(inst, B_TRUE, NULL) != 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2354 handle_bind_failure(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2355 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2357 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2358 * If we're now out of transition (process_offline_inst() could have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2359 * fired off another method), carry out any jobs that were blocked by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2360 * us being in transition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2361 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2362 if (!INST_IN_TRANSITION(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2363 if (inetd_stopping) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2364 if (!instance_stopped(inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2365 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2366 * inetd is stopping, and this instance hasn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2367 * been stopped. Inject a stop event.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2368 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2369 handle_restarter_event(inst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2370 RESTARTER_EVENT_TYPE_STOP, B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2371 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2372 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2373 process_pending_rst_event(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2374 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2375 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2376 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2378 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2379 * Check if configuration file specified is readable. If not return B_FALSE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2380 * else return B_TRUE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2381 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2382 static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2383 can_read_file(const char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2384 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2385 int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2386 int serrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2388 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2389 ret = access(path, R_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2390 } while ((ret < 0) && (errno == EINTR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2391 if (ret < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2392 if (errno != ENOENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2393 serrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2394 error_msg(gettext("Failed to access configuration "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2395 "file %s for performing modification checks: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2396 path, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2397 errno = serrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2398 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2399 return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2400 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2401 return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2402 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2404 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2405 * Check whether the configuration file has changed contents since inetd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2406 * was last started/refreshed, and if so, log a message indicating that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2407 * inetconv needs to be run.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2408 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2409 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2410 check_conf_file(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2411 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2412 char *new_hash;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2413 char *old_hash = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2414 scf_error_t ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2415 const char *file;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2417 if (conf_file == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2418 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2419 * No explicit config file specified, so see if one of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2420 * default two are readable, checking the primary one first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2421 * followed by the secondary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2422 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2423 if (can_read_file(PRIMARY_DEFAULT_CONF_FILE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2424 file = PRIMARY_DEFAULT_CONF_FILE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2425 } else if ((errno == ENOENT) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2426 can_read_file(SECONDARY_DEFAULT_CONF_FILE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2427 file = SECONDARY_DEFAULT_CONF_FILE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2428 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2429 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2430 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2431 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2432 file = conf_file;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2433 if (!can_read_file(file))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2434 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2435 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2437 if (calculate_hash(file, &new_hash) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2438 ret = retrieve_inetd_hash(&old_hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2439 if (((ret == SCF_ERROR_NONE) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2440 (strcmp(old_hash, new_hash) != 0))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2441 /* modified config file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2442 warn_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2443 "Configuration file %s has been modified since "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2444 "inetconv was last run. \"inetconv -i %s\" must be "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2445 "run to apply any changes to the SMF"), file, file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2446 } else if ((ret != SCF_ERROR_NOT_FOUND) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2447 (ret != SCF_ERROR_NONE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2448 /* No message if hash not yet computed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2449 error_msg(gettext("Failed to check whether "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2450 "configuration file %s has been modified: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2451 file, scf_strerror(ret));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2452 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2453 free(old_hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2454 free(new_hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2455 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2456 error_msg(gettext("Failed to check whether configuration file "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2457 "%s has been modified: %s"), file, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2458 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2459 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2461 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2462 * Refresh all inetd's managed instances and check the configuration file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2463 * for any updates since inetconv was last run, logging a message if there
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2464 * are. We call the SMF refresh function to refresh each instance so that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2465 * the refresh request goes through the framework, and thus results in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2466 * running snapshot of each instance being updated from the configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2467 * snapshot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2468 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2469 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2470 inetd_refresh(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2471 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2472 instance_t *inst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2473
6435
e526311db503 6657786 Inetd logging can result in denial of service or worse
gm209912
parents: 6073
diff changeset
2474 refresh_debug_flag();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2476 /* call libscf to send refresh requests for all managed instances */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2477 for (inst = uu_list_first(instance_list); inst != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2478 inst = uu_list_next(instance_list, inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2479 if (smf_refresh_instance(inst->fmri) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2480 error_msg(gettext("Failed to refresh instance %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2481 inst->fmri, scf_strerror(scf_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2482 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2483 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2485 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2486 * Log a message if the configuration file has changed since inetconv
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2487 * was last run.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2488 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2489 check_conf_file();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2490 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2492 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2493 * Initiate inetd's shutdown.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2494 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2495 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2496 inetd_stop(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2497 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2498 instance_t *inst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2500 /* Block handling signals for stop and refresh */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2501 (void) sighold(SIGHUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2502 (void) sighold(SIGTERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2504 /* Indicate inetd is coming down */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2505 inetd_stopping = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2507 /* Stop polling on restarter events. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2508 clear_pollfd(rst_event_pipe[PE_CONSUMER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2510 /* Stop polling for any more stop/refresh requests. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2511 clear_pollfd(uds_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2513 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2514 * Send a stop event to all currently unstopped instances that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2515 * aren't in transition. For those that are in transition, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2516 * event will get sent when the transition completes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2517 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2518 for (inst = uu_list_first(instance_list); inst != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2519 inst = uu_list_next(instance_list, inst)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2520 if (!instance_stopped(inst) && !INST_IN_TRANSITION(inst))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2521 handle_restarter_event(inst,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2522 RESTARTER_EVENT_TYPE_STOP, B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2523 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2524 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2526 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2527 * Sets up the intra-inetd-process Unix Domain Socket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2528 * Returns -1 on error, else 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2529 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2530 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2531 uds_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2532 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2533 struct sockaddr_un addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2535 if ((uds_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2536 error_msg("socket: %s", strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2537 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2538 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2540 disable_blocking(uds_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2542 (void) unlink(INETD_UDS_PATH); /* clean-up any stale files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2544 (void) memset(&addr, 0, sizeof (addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2545 addr.sun_family = AF_UNIX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2546 /* CONSTCOND */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2547 assert(sizeof (INETD_UDS_PATH) <= sizeof (addr.sun_path));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2548 (void) strlcpy(addr.sun_path, INETD_UDS_PATH, sizeof (addr.sun_path));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2550 if (bind(uds_fd, (struct sockaddr *)(&addr), sizeof (addr)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2551 error_msg(gettext("Failed to bind socket to %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2552 INETD_UDS_PATH, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2553 (void) close(uds_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2554 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2555 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2557 (void) listen(uds_fd, UDS_BACKLOG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2558
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2559 if ((set_pollfd(uds_fd, POLLIN)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2560 (void) close(uds_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2561 (void) unlink(INETD_UDS_PATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2562 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2563 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2565 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2566 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2568 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2569 uds_fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2570 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2571 if (uds_fd != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2572 (void) close(uds_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2573 (void) unlink(INETD_UDS_PATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2574 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2576 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2577 * Handle an incoming request on the Unix Domain Socket. Returns -1 if there
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2578 * was an error handling the event, else 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2579 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2580 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2581 process_uds_event(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2582 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2583 uds_request_t req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2584 int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2585 struct sockaddr_un addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2586 socklen_t len = sizeof (addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2587 int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2588 uint_t retries = 0;
4357
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2589 ucred_t *ucred = NULL;
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2590 uid_t euid;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2592 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2593 fd = accept(uds_fd, (struct sockaddr *)&addr, &len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2594 } while ((fd < 0) && (errno == EINTR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2595 if (fd < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2596 if (errno != EWOULDBLOCK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2597 error_msg("accept failed: %s", strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2598 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2599 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2600
4357
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2601 if (getpeerucred(fd, &ucred) == -1) {
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2602 error_msg("getpeerucred failed: %s", strerror(errno));
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2603 (void) close(fd);
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2604 return (-1);
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2605 }
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2606
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2607 /* Check peer credentials before acting on the request */
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2608 euid = ucred_geteuid(ucred);
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2609 ucred_free(ucred);
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2610 if (euid != 0 && getuid() != euid) {
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2611 debug_msg("peer euid %u != uid %u",
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2612 (uint_t)euid, (uint_t)getuid());
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2613 (void) close(fd);
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2614 return (-1);
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2615 }
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2616
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2617 for (retries = 0; retries < UDS_RECV_RETRIES; retries++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2618 if (((ret = safe_read(fd, &req, sizeof (req))) != 1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2619 (errno != EAGAIN))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2620 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2621
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2622 (void) poll(NULL, 0, 100); /* 100ms pause */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2623 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2625 if (ret != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2626 error_msg(gettext("Failed read: %s"), strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2627 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2628 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2629 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2631 switch (req) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2632 case UR_REFRESH_INETD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2633 /* flag the request for event_loop() to process */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2634 refresh_inetd_requested = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2635 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2636 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2637 case UR_STOP_INETD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2638 inetd_stop();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2639 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2640 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2641 error_msg("unexpected UDS request");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2642 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2643 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2644 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2645
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2646 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2647 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2649 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2650 * Perform checks for common exec string errors. We limit the checks to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2651 * whether the file exists, is a regular file, and has at least one execute
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2652 * bit set. We leave the core security checks to exec() so as not to duplicate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2653 * and thus incur the associated drawbacks, but hope to catch the common
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2654 * errors here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2655 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2656 static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2657 passes_basic_exec_checks(const char *instance, const char *method,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2658 const char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2659 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2660 struct stat sbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2662 /* check the file exists */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2663 while (stat(path, &sbuf) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2664 if (errno != EINTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2665 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2666 "Can't stat the %s method of instance %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2667 method, instance, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2668 return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2669 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2670 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2672 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2673 * Check if the file is a regular file and has at least one execute
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2674 * bit set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2675 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2676 if ((sbuf.st_mode & S_IFMT) != S_IFREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2677 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2678 "The %s method of instance %s isn't a regular file"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2679 method, instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2680 return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2681 } else if ((sbuf.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2682 error_msg(gettext("The %s method instance %s doesn't have "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2683 "any execute permissions set"), method, instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2684 return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2685 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2687 return (B_TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2688 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2690 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2691 exec_method(instance_t *instance, instance_method_t method, method_info_t *mi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2692 struct method_context *mthd_ctxt, const proto_info_t *pi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2693 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2694 char **args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2695 char **env;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2696 const char *errf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2697 int serrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2698 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2700 if (method == IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2701 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2702 * If wrappers checks fail, pretend the method was exec'd and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2703 * failed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2704 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2705 if (!tcp_wrappers_ok(instance))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2706 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2707 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2709 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2710 * Revert the disposition of handled signals and ignored signals to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2711 * their defaults, unblocking any blocked ones as a side effect.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2712 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2713 (void) sigset(SIGHUP, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2714 (void) sigset(SIGTERM, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2715 (void) sigset(SIGINT, SIG_DFL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2717 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2718 * Setup exec arguments. Do this before the fd setup below, so our
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2719 * logging related file fd doesn't get taken over before we call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2720 * expand_address().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2721 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2722 if ((method == IM_START) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2723 (strcmp(mi->exec_args_we.we_wordv[0], "%A") == 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2724 args = expand_address(instance, pi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2725 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2726 args = mi->exec_args_we.we_wordv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2727 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2729 /* Generate audit trail for start operations */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2730 if (method == IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2731 adt_event_data_t *ae;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2732 struct sockaddr_storage ss;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2733 priv_set_t *privset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2734 socklen_t sslen = sizeof (ss);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2736 if ((ae = adt_alloc_event(audit_handle, ADT_inetd_connect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2737 == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2738 error_msg(gettext("Unable to allocate audit event for "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2739 "the %s method of instance %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2740 methods[method].name, instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2741 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2742 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2744 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2745 * The inetd_connect audit record consists of:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2746 * Service name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2747 * Execution path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2748 * Remote address and port
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2749 * Local port
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2750 * Process privileges
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2751 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2752 ae->adt_inetd_connect.service_name = cfg->svc_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2753 ae->adt_inetd_connect.cmd = mi->exec_path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2755 if (instance->remote_addr.ss_family == AF_INET) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2756 struct in_addr *in = SS_SINADDR(instance->remote_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2757 ae->adt_inetd_connect.ip_adr[0] = in->s_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2758 ae->adt_inetd_connect.ip_type = ADT_IPv4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2759 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2760 uint32_t *addr6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2761 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2763 ae->adt_inetd_connect.ip_type = ADT_IPv6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2764 addr6 = (uint32_t *)SS_SINADDR(instance->remote_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2765 for (i = 0; i < 4; ++i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2766 ae->adt_inetd_connect.ip_adr[i] = addr6[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2767 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2769 ae->adt_inetd_connect.ip_remote_port =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2770 ntohs(SS_PORT(instance->remote_addr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2772 if (getsockname(instance->conn_fd, (struct sockaddr *)&ss,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2773 &sslen) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2774 ae->adt_inetd_connect.ip_local_port =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2775 ntohs(SS_PORT(ss));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2776
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2777 privset = mthd_ctxt->priv_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2778 if (privset == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2779 privset = priv_allocset();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2780 if (privset != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2781 getppriv(PRIV_EFFECTIVE, privset) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2782 priv_freeset(privset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2783 privset = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2784 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2785 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2786
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2787 ae->adt_inetd_connect.privileges = privset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2789 (void) adt_put_event(ae, ADT_SUCCESS, ADT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2790 adt_free_event(ae);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2792 if (privset != NULL && mthd_ctxt->priv_set == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2793 priv_freeset(privset);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2794 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2796 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2797 * Set method context before the fd setup below so we can output an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2798 * error message if it fails.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2799 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2800 if ((errno = restarter_set_method_context(mthd_ctxt, &errf)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2801 const char *msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2802
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2803 if (errno == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2804 if (strcmp(errf, "core_set_process_path") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2805 msg = gettext("Failed to set the corefile path "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2806 "for the %s method of instance %s");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2807 } else if (strcmp(errf, "setproject") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2808 msg = gettext("Failed to assign a resource "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2809 "control for the %s method of instance %s");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2810 } else if (strcmp(errf, "pool_set_binding") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2811 msg = gettext("Failed to bind the %s method of "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2812 "instance %s to a pool due to a system "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2813 "error");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2814 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2815 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2816 abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2817 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2819 error_msg(msg, methods[method].name, instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2820
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2821 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2822 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2824 if (errf != NULL && strcmp(errf, "pool_set_binding") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2825 switch (errno) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2826 case ENOENT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2827 msg = gettext("Failed to find resource pool "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2828 "for the %s method of instance %s");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2829 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2830
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2831 case EBADF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2832 msg = gettext("Failed to bind the %s method of "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2833 "instance %s to a pool due to invalid "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2834 "configuration");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2835 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2836
1712
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
2837 case EINVAL:
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
2838 msg = gettext("Failed to bind the %s method of "
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
2839 "instance %s to a pool due to invalid "
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
2840 "pool name");
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
2841 break;
c5243b0fd703 6266365 svc.startd tried to use deadbeef
rm88369
parents: 784
diff changeset
2842
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2843 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2844 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2845 abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2846 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2847
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2848 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2849 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2850
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2851 if (errf != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2852 error_msg(gettext("Failed to set credentials for the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2853 "%s method of instance %s (%s: %s)"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2854 methods[method].name, instance->fmri, errf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2855 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2856 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2857 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2859 switch (errno) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2860 case ENOMEM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2861 msg = gettext("Failed to set credentials for the %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2862 "method of instance %s (out of memory)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2863 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2865 case ENOENT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2866 msg = gettext("Failed to set credentials for the %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2867 "method of instance %s (no passwd or shadow "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2868 "entry for user)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2869 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2871 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2872 assert(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2873 abort();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2874 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2876 error_msg(msg, methods[method].name, instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2877 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2878 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2880 /* let exec() free mthd_ctxt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2881
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2882 /* setup standard fds */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2883 if (method == IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2884 (void) dup2(instance->conn_fd, STDIN_FILENO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2885 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2886 (void) close(STDIN_FILENO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2887 (void) open("/dev/null", O_RDONLY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2888 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2889 (void) dup2(STDIN_FILENO, STDOUT_FILENO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2890 (void) dup2(STDIN_FILENO, STDERR_FILENO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2892 closefrom(STDERR_FILENO + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2893
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2894 method_preexec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2896 env = set_smf_env(mthd_ctxt, instance, methods[method].name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2898 if (env != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2899 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2900 (void) execve(mi->exec_path, args, env);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2901 } while (errno == EINTR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2902 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2904 serrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2905 /* start up logging again to report the error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2906 msg_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2907 errno = serrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2908
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2909 error_msg(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2910 gettext("Failed to exec %s method of instance %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2911 methods[method].name, instance->fmri, strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2913 if ((method == IM_START) && (instance->config->basic->iswait)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2914 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2915 * We couldn't exec the start method for a wait type service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2916 * Eat up data from the endpoint, so that hopefully the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2917 * service's fd won't wake poll up on the next time round
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2918 * event_loop(). This behavior is carried over from the old
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2919 * inetd, and it seems somewhat arbitrary that it isn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2920 * also done in the case of fork failures; but I guess
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2921 * it assumes an exec failure is less likely to be the result
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2922 * of a resource shortage, and is thus not worth retrying.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2923 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2924 consume_wait_data(instance, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2925 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2927 exit(IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2928 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2929
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2930 static restarter_error_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2931 get_method_error_success(instance_method_t method)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2932 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2933 switch (method) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2934 case IM_OFFLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2935 return (RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2936 case IM_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2937 return (RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2938 case IM_DISABLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2939 return (RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2940 case IM_REFRESH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2941 return (RERR_REFRESH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2942 case IM_START:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2943 return (RERR_RESTART);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2944 }
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
2945 (void) fprintf(stderr, gettext("Internal fatal error in inetd.\n"));
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
2946
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
2947 abort();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2948 /* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2949 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2950
3837
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2951 static int
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2952 smf_kill_process(instance_t *instance, int sig)
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2953 {
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2954 rep_val_t *rv;
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2955 int ret = IMRET_SUCCESS;
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2956
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2957 /* Carry out process assassination */
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2958 for (rv = uu_list_first(instance->start_pids);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2959 rv != NULL;
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2960 rv = uu_list_next(instance->start_pids, rv)) {
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2961 if ((kill((pid_t)rv->val, sig) != 0) &&
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2962 (errno != ESRCH)) {
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2963 ret = IMRET_FAILURE;
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2964 error_msg(gettext("Unable to kill "
4357
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2965 "start process (%ld) of instance %s: %s"),
294855851bcb 6553649 inetd brakes for... pretty much everyone
rs200217
parents: 3837
diff changeset
2966 rv->val, instance->fmri, strerror(errno));
3837
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2967 }
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2968 }
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2969 return (ret);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2970 }
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2971
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2972 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2973 * Runs the specified method of the specified service instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2974 * If the method was never specified, we handle it the same as if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2975 * method was called and returned success, carrying on any transition the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2976 * instance may be in the midst of.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2977 * If the method isn't executable in its specified profile or an error occurs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2978 * forking a process to run the method in the function returns -1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2979 * If a method binary is successfully executed, the function switches the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2980 * instance's cur state to the method's associated 'run' state and the next
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2981 * state to the methods associated next state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2982 * Returns -1 if there's an error before forking, else 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2983 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2984 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2985 run_method(instance_t *instance, instance_method_t method,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2986 const proto_info_t *start_info)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2987 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2988 pid_t child_pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2989 method_info_t *mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2990 struct method_context *mthd_ctxt = NULL;
3837
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
2991 int sig = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2992 int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2993 instance_cfg_t *cfg = instance->config;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2994 ctid_t cid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2995 boolean_t trans_failure = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2996 int serrno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2998 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2999 * Don't bother updating the instance's state for the start method
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3000 * as there isn't a separate start method state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3001 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3002 if (method != IM_START)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3003 update_instance_states(instance, get_method_state(method),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3004 methods[method].dst_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3005 get_method_error_success(method));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3007 if ((mi = cfg->methods[method]) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3008 /*
3837
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3009 * If the absent method is IM_OFFLINE, default action needs
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3010 * to be taken to avoid lingering processes which can prevent
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3011 * the upcoming rebinding from happening.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3012 */
3837
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3013 if ((method == IM_OFFLINE) && instance->config->basic->iswait) {
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3014 warn_msg(gettext("inetd_offline method for instance %s "
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3015 "is unspecified. Taking default action: kill."),
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3016 instance->fmri);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3017 (void) str2sig("TERM", &sig);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3018 ret = smf_kill_process(instance, sig);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3019 process_non_start_term(instance, ret);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3020 return (0);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3021 } else {
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3022 process_non_start_term(instance, IMRET_SUCCESS);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3023 return (0);
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3024 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3025 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3026
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3027 /* Handle special method tokens, not allowed on start */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3028 if (method != IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3029 if (restarter_is_null_method(mi->exec_path)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3030 /* :true means nothing should be done */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3031 process_non_start_term(instance, IMRET_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3032 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3033 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3035 if ((sig = restarter_is_kill_method(mi->exec_path)) >= 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3036 /* Carry out contract assassination */
3175
5903f61aa150 6335025 telnet or rsh processing 5-15 times slower in S10 (6-330 times slower on T2000)
skamm
parents: 1914
diff changeset
3037 ret = iterate_repository_contracts(instance, sig);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3038 /* ENOENT means we didn't find any contracts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3039 if (ret != 0 && ret != ENOENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3040 error_msg(gettext("Failed to send signal %d "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3041 "to contracts of instance %s: %s"), sig,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3042 instance->fmri, strerror(ret));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3043 goto prefork_failure;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3044 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3045 process_non_start_term(instance, IMRET_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3046 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3047 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3048 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3050 if ((sig = restarter_is_kill_proc_method(mi->exec_path)) >= 0) {
3837
d56296cc60c2 6276770 Refresh of inetd service causes RPC access to fail to SVM daemons.
stevep
parents: 3175
diff changeset
3051 ret = smf_kill_process(instance, sig);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3052 process_non_start_term(instance, ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3053 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3054 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3055 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3057 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3058 * Get the associated method context before the fork so we can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3059 * modify the instances state if things go wrong.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3060 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3061 if ((mthd_ctxt = read_method_context(instance->fmri,
9765
2522fef20c5f 6215238 svc.startd could provide better log messages for faulty method_context contents
Sean Wilcox <Sean.Wilcox@Sun.COM>
parents: 9272
diff changeset
3062 methods[method].name, mi->exec_path)) == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3063 goto prefork_failure;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3064
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3065 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3066 * Perform some basic checks before we fork to limit the possibility
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3067 * of exec failures, so we can modify the instance state if necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3068 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3069 if (!passes_basic_exec_checks(instance->fmri, methods[method].name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3070 mi->exec_path)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3071 trans_failure = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3072 goto prefork_failure;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3073 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3074
6073
47f6aa7a8077 PSARC 2008/046 Process Contract Decorations
acruz
parents: 4754
diff changeset
3075 if (contract_prefork(instance->fmri, method) == -1)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3076 goto prefork_failure;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3077 child_pid = fork();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3078 serrno = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3079 contract_postfork();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3081 switch (child_pid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3082 case -1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3083 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3084 "Unable to fork %s method of instance %s: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3085 methods[method].name, instance->fmri, strerror(serrno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3086 if ((serrno != EAGAIN) && (serrno != ENOMEM))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3087 trans_failure = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3088 goto prefork_failure;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3089 case 0: /* child */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3090 exec_method(instance, method, mi, mthd_ctxt, start_info);
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3091 /* NOTREACHED */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3092 default: /* parent */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3093 restarter_free_method_context(mthd_ctxt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3094 mthd_ctxt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3096 if (get_latest_contract(&cid) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3097 cid = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3099 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3100 * Register this method so its termination is noticed and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3101 * the state transition this method participates in is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3102 * continued.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3103 */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
3104 if (register_method(instance, child_pid, cid, method,
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
3105 start_info->proto) != 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3106 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3107 * Since we will never find out about the termination
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3108 * of this method, if it's a non-start method treat
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3109 * is as a failure so we don't block restarter event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3110 * processing on it whilst it languishes in a method
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3111 * running state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3112 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3113 error_msg(gettext("Failed to monitor status of "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3114 "%s method of instance %s"), methods[method].name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3115 instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3116 if (method != IM_START)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3117 process_non_start_term(instance, IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3118 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3120 add_method_ids(instance, child_pid, cid, method);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3122 /* do tcp tracing for those nowait instances that request it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3123 if ((method == IM_START) && cfg->basic->do_tcp_trace &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3124 !cfg->basic->iswait) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3125 char buf[INET6_ADDRSTRLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3127 syslog(LOG_NOTICE, "%s[%d] from %s %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3128 cfg->basic->svc_name, child_pid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3129 inet_ntop_native(instance->remote_addr.ss_family,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3130 SS_SINADDR(instance->remote_addr), buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3131 sizeof (buf)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3132 ntohs(SS_PORT(instance->remote_addr)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3133 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3134 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3136 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3138 prefork_failure:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3139 if (mthd_ctxt != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3140 restarter_free_method_context(mthd_ctxt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3141 mthd_ctxt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3142 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3144 if (method == IM_START) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3145 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3146 * Only place a start method in maintenance if we're sure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3147 * that the failure was non-transient.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3148 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3149 if (!trans_failure) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3150 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3151 update_state(instance, IIS_MAINTENANCE, RERR_FAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3152 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3153 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3154 /* treat the failure as if the method ran and failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3155 process_non_start_term(instance, IMRET_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3156 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3158 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3159 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3161 static int
8296
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3162 pending_connections(instance_t *instance, proto_info_t *pi)
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3163 {
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3164 if (instance->config->basic->istlx) {
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3165 tlx_info_t *tl = (tlx_info_t *)pi;
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3166
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3167 return (uu_list_numnodes(tl->conn_ind_queue) != 0);
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3168 } else {
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3169 return (0);
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3170 }
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3171 }
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3172
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3173 static int
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3174 accept_connection(instance_t *instance, proto_info_t *pi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3175 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3176 int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3177 socklen_t size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3179 if (instance->config->basic->istlx) {
8296
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3180 tlx_info_t *tl = (tlx_info_t *)pi;
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3181 tlx_pending_counter = \
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3182 tlx_pending_counter - uu_list_numnodes(tl->conn_ind_queue);
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3183
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3184 fd = tlx_accept(instance->fmri, (tlx_info_t *)pi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3185 &(instance->remote_addr));
8296
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3186
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3187 tlx_pending_counter = \
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3188 tlx_pending_counter + uu_list_numnodes(tl->conn_ind_queue);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3189 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3190 size = sizeof (instance->remote_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3191 fd = accept(pi->listen_fd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3192 (struct sockaddr *)&(instance->remote_addr), &size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3193 if (fd < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3194 error_msg("accept: %s", strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3195 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3196
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3197 return (fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3198 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3200 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3201 * Handle an incoming connection request for a nowait service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3202 * This involves accepting the incoming connection on a new fd. Connection
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3203 * rate checks are then performed, transitioning the service to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3204 * conrate offline state if these fail. Otherwise, the service's start method
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3205 * is run (performing TCP wrappers checks if applicable as we do), and on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3206 * success concurrent copies checking is done, transitioning the service to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3207 * copies offline state if this fails.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3208 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3209 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3210 process_nowait_request(instance_t *instance, proto_info_t *pi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3211 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3212 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3213 int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3214 adt_event_data_t *ae;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3215 char buf[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3217 /* accept nowait service connections on a new fd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3218 if ((instance->conn_fd = accept_connection(instance, pi)) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3219 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3220 * Failed accept. Return and allow the event loop to initiate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3221 * another attempt later if the request is still present.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3222 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3223 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3224 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3226 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3227 * Limit connection rate of nowait services. If either conn_rate_max
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3228 * or conn_rate_offline are <= 0, no connection rate limit checking
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3229 * is done. If the configured rate is exceeded, the instance is taken
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3230 * to the connrate_offline state and a timer scheduled to try and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3231 * bring the instance back online after the configured offline time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3232 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3233 if ((cfg->conn_rate_max > 0) && (cfg->conn_rate_offline > 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3234 if (instance->conn_rate_count++ == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3235 instance->conn_rate_start = time(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3236 } else if (instance->conn_rate_count >
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3237 cfg->conn_rate_max) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3238 time_t now = time(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3240 if ((now - instance->conn_rate_start) > 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3241 instance->conn_rate_start = now;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3242 instance->conn_rate_count = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3243 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3244 /* Generate audit record */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3245 if ((ae = adt_alloc_event(audit_handle,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3246 ADT_inetd_ratelimit)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3247 error_msg(gettext("Unable to allocate "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3248 "rate limit audit event"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3249 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3250 adt_inetd_ratelimit_t *rl =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3251 &ae->adt_inetd_ratelimit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3252 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3253 * The inetd_ratelimit audit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3254 * record consists of:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3255 * Service name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3256 * Connection rate limit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3257 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3258 rl->service_name = cfg->svc_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3259 (void) snprintf(buf, sizeof (buf),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3260 "limit=%lld", cfg->conn_rate_max);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3261 rl->limit = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3262 (void) adt_put_event(ae, ADT_SUCCESS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3263 ADT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3264 adt_free_event(ae);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3265 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3267 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3268 "Instance %s has exceeded its configured "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3269 "connection rate, additional connections "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3270 "will not be accepted for %d seconds"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3271 instance->fmri, cfg->conn_rate_offline);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3273 close_net_fd(instance, instance->conn_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3274 instance->conn_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3276 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3277
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3278 instance->conn_rate_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3280 instance->conn_rate_exceeded = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3281 (void) run_method(instance, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3283 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3284 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3285 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3286 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3288 ret = run_method(instance, IM_START, pi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3290 close_net_fd(instance, instance->conn_fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3291 instance->conn_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3293 if (ret == -1) /* the method wasn't forked */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3294 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3295
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3296 instance->copies++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3298 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3299 * Limit concurrent connections of nowait services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3300 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3301 if (copies_limit_exceeded(instance)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3302 /* Generate audit record */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3303 if ((ae = adt_alloc_event(audit_handle, ADT_inetd_copylimit))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3304 == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3305 error_msg(gettext("Unable to allocate copy limit "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3306 "audit event"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3307 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3308 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3309 * The inetd_copylimit audit record consists of:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3310 * Service name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3311 * Copy limit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3312 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3313 ae->adt_inetd_copylimit.service_name = cfg->svc_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3314 (void) snprintf(buf, sizeof (buf), "limit=%lld",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3315 cfg->max_copies);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3316 ae->adt_inetd_copylimit.limit = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3317 (void) adt_put_event(ae, ADT_SUCCESS, ADT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3318 adt_free_event(ae);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3319 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3321 warn_msg(gettext("Instance %s has reached its maximum "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3322 "configured copies, no new connections will be accepted"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3323 instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3324 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3325 (void) run_method(instance, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3326 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3327 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3329 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3330 * Handle an incoming request for a wait type service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3331 * Failure rate checking is done first, taking the service to the maintenance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3332 * state if the checks fail. Following this, the service's start method is run,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3333 * and on success, we stop listening for new requests for this service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3334 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3335 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3336 process_wait_request(instance_t *instance, const proto_info_t *pi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3337 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3338 basic_cfg_t *cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3339 int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3340 adt_event_data_t *ae;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3341 char buf[BUFSIZ];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3343 instance->conn_fd = pi->listen_fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3345 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3346 * Detect broken servers and transition them to maintenance. If a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3347 * wait type service exits without accepting the connection or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3348 * consuming (reading) the datagram, that service's descriptor will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3349 * select readable again, and inetd will fork another instance of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3350 * the server. If either wait_fail_cnt or wait_fail_interval are <= 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3351 * no failure rate detection is done.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3352 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3353 if ((cfg->wait_fail_cnt > 0) && (cfg->wait_fail_interval > 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3354 if (instance->fail_rate_count++ == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3355 instance->fail_rate_start = time(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3356 } else if (instance->fail_rate_count > cfg->wait_fail_cnt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3357 time_t now = time(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3359 if ((now - instance->fail_rate_start) >
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3360 cfg->wait_fail_interval) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3361 instance->fail_rate_start = now;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3362 instance->fail_rate_count = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3363 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3364 /* Generate audit record */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3365 if ((ae = adt_alloc_event(audit_handle,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3366 ADT_inetd_failrate)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3367 error_msg(gettext("Unable to allocate "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3368 "failure rate audit event"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3369 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3370 adt_inetd_failrate_t *fr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3371 &ae->adt_inetd_failrate;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3372 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3373 * The inetd_failrate audit record
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3374 * consists of:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3375 * Service name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3376 * Failure rate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3377 * Interval
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3378 * Last two are expressed as k=v pairs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3379 * in the values field.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3380 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3381 fr->service_name = cfg->svc_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3382 (void) snprintf(buf, sizeof (buf),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3383 "limit=%lld,interval=%d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3384 cfg->wait_fail_cnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3385 cfg->wait_fail_interval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3386 fr->values = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3387 (void) adt_put_event(ae, ADT_SUCCESS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3388 ADT_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3389 adt_free_event(ae);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3390 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3392 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3393 "Instance %s has exceeded its configured "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3394 "failure rate, transitioning to "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3395 "maintenance"), instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3396 instance->fail_rate_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3398 destroy_bound_fds(instance);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3400 instance->maintenance_req = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3401 (void) run_method(instance, IM_OFFLINE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3402 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3403 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3404 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3405 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3407 ret = run_method(instance, IM_START, pi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3409 instance->conn_fd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3411 if (ret == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3412 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3413 * Stop listening for connections now we've fired off the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3414 * server for a wait type instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3415 */
9272
032beff8ca31 6386177 Post-SMF inetd does not handle multiple wait transports
Renaud Manus <Renaud.Manus@Sun.COM>
parents: 8823
diff changeset
3416 (void) poll_bound_fds(instance, B_FALSE, pi->proto);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3417 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3418 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3420 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3421 * Process any networks requests for each proto for each instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3422 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3423 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3424 process_network_events(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3425 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3426 instance_t *instance;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3428 for (instance = uu_list_first(instance_list); instance != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3429 instance = uu_list_next(instance_list, instance)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3430 basic_cfg_t *cfg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3431 proto_info_t *pi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3433 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3434 * Ignore instances in states that definitely don't have any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3435 * listening fds.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3436 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3437 switch (instance->cur_istate) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3438 case IIS_ONLINE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3439 case IIS_DEGRADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3440 case IIS_IN_REFRESH_METHOD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3441 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3442 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3443 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3444 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3446 cfg = instance->config->basic;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3448 for (pi = uu_list_first(cfg->proto_list); pi != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3449 pi = uu_list_next(cfg->proto_list, pi)) {
8296
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3450 if (((pi->listen_fd != -1) &&
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3451 isset_pollfd(pi->listen_fd)) ||
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3452 pending_connections(instance, pi)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3453 if (cfg->iswait) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3454 process_wait_request(instance, pi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3455 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3456 process_nowait_request(instance, pi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3457 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3458 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3459 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3460 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3461 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3463 /* ARGSUSED0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3464 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3465 sigterm_handler(int sig)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3466 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3467 got_sigterm = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3468 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3470 /* ARGSUSED0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3471 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3472 sighup_handler(int sig)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3473 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3474 refresh_inetd_requested = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3475 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3477 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3478 * inetd's major work loop. This function sits in poll waiting for events
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3479 * to occur, processing them when they do. The possible events are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3480 * master restarter requests, expired timer queue timers, stop/refresh signal
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3481 * requests, contract events indicating process termination, stop/refresh
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3482 * requests originating from one of the stop/refresh inetd processes and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3483 * network events.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3484 * The loop is exited when a stop request is received and processed, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3485 * all the instances have reached a suitable 'stopping' state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3486 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3487 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3488 event_loop(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3489 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3490 instance_t *instance;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3491 int timeout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3493 for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3494 int pret = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3495
8296
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3496 if (tlx_pending_counter != 0)
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3497 timeout = 0;
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3498 else
02e9524900b5 6556855 inetd stops forking child process, after t_accept() has once failed with TLOOK event T_LISTEN
Yateesh Kumar Vusirika - Sun Microsystems - Bangalore India <Yateeshkumar.Vusirika@Sun.COM>
parents: 6435
diff changeset
3499 timeout = iu_earliest_timer(timer_queue);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3501 if (!got_sigterm && !refresh_inetd_requested) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3502 pret = poll(poll_fds, num_pollfds, timeout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3503 if ((pret == -1) && (errno != EINTR)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3504 error_msg(gettext("poll failure: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3505 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3506 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3507 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3508 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3510 if (got_sigterm) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3511 msg_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3512 inetd_stop();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3513 got_sigterm = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3514 goto check_if_stopped;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3515 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3517 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3518 * Process any stop/refresh requests from the Unix Domain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3519 * Socket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3520 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3521 if ((pret != -1) && isset_pollfd(uds_fd)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3522 while (process_uds_event() == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3523 ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3524 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3526 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3527 * Process refresh request. We do this check after the UDS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3528 * event check above, as it would be wasted processing if we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3529 * started refreshing inetd based on a SIGHUP, and then were
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3530 * told to shut-down via a UDS event.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3531 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3532 if (refresh_inetd_requested) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3533 refresh_inetd_requested = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3534 if (!inetd_stopping)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3535 inetd_refresh();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3536 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3538 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3539 * We were interrupted by a signal. Don't waste any more
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3540 * time processing a potentially inaccurate poll return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3541 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3542 if (pret == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3543 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3545 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3546 * Process any instance restarter events.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3547 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3548 if (isset_pollfd(rst_event_pipe[PE_CONSUMER])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3549 while (process_restarter_event() == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3550 ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3551 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3553 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3554 * Process any expired timers (bind retry, con-rate offline,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3555 * method timeouts).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3556 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3557 (void) iu_expire_timers(timer_queue);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3558
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3559 process_terminated_methods();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3560
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3561 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3562 * If inetd is stopping, check whether all our managed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3563 * instances have been stopped and we can return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3564 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3565 if (inetd_stopping) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3566 check_if_stopped:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3567 for (instance = uu_list_first(instance_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3568 instance != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3569 instance = uu_list_next(instance_list, instance)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3570 if (!instance_stopped(instance)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3571 debug_msg("%s not yet stopped",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3572 instance->fmri);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3573 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3574 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3575 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3576 /* if all instances are stopped, return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3577 if (instance == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3578 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3579 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3581 process_network_events();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3582 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3583 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3585 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3586 fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3587 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3588 method_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3589 uds_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3590 if (timer_queue != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3591 iu_tq_destroy(timer_queue);
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3592
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3594 /*
759
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3595 * We don't bother to undo the restarter interface at all.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3596 * Because of quirks in the interface, there is no way to
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3597 * disconnect from the channel and cause any new events to be
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3598 * queued. However, any events which are received and not
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3599 * acknowledged will be re-sent when inetd restarts as long as inetd
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3600 * uses the same subscriber ID, which it does.
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3601 *
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3602 * By keeping the event pipe open but ignoring it, any events which
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3603 * occur will cause restarter_event_proxy to hang without breaking
3ca039a1de60 6240909 inetd crashed on shutdown
dstaff
parents: 0
diff changeset
3604 * anything.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3605 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3607 if (instance_list != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3608 void *cookie = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3609 instance_t *inst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3611 while ((inst = uu_list_teardown(instance_list, &cookie)) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3612 NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3613 destroy_instance(inst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3614 uu_list_destroy(instance_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3615 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3616 if (instance_pool != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3617 uu_list_pool_destroy(instance_pool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3618 tlx_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3619 config_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3620 repval_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3621 poll_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3623 /* Close audit session */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3624 (void) adt_end_session(audit_handle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3625 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3627 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3628 init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3629 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3630 int err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3632 if (repval_init() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3633 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3635 if (config_init() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3636 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3637
6435
e526311db503 6657786 Inetd logging can result in denial of service or worse
gm209912
parents: 6073
diff changeset
3638 refresh_debug_flag();
e526311db503 6657786 Inetd logging can result in denial of service or worse
gm209912
parents: 6073
diff changeset
3639
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3640 if (tlx_init() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3641 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3643 /* Setup instance list. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3644 if ((instance_pool = uu_list_pool_create("instance_pool",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3645 sizeof (instance_t), offsetof(instance_t, link), NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3646 UU_LIST_POOL_DEBUG)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3647 error_msg("%s: %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3648 gettext("Failed to create instance pool"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3649 uu_strerror(uu_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3650 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3651 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3652 if ((instance_list = uu_list_create(instance_pool, NULL, 0)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3653 error_msg("%s: %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3654 gettext("Failed to create instance list"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3655 uu_strerror(uu_error()));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3656 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3657 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3659 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3660 * Create event pipe to communicate events with the main event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3661 * loop and add it to the event loop's fdset.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3662 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3663 if (pipe(rst_event_pipe) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3664 error_msg("pipe: %s", strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3665 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3666 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3667 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3668 * We only leave the producer end to block on reads/writes as we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3669 * can't afford to block in the main thread, yet need to in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3670 * the restarter event thread, so it can sit and wait for an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3671 * acknowledgement to be written to the pipe.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3672 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3673 disable_blocking(rst_event_pipe[PE_CONSUMER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3674 if ((set_pollfd(rst_event_pipe[PE_CONSUMER], POLLIN)) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3675 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3677 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3678 * Register with master restarter for managed service events. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3679 * will fail, amongst other reasons, if inetd is already running.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3680 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3681 if ((err = restarter_bind_handle(RESTARTER_EVENT_VERSION,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3682 INETD_INSTANCE_FMRI, restarter_event_proxy, 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3683 &rst_event_handle)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3684 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3685 "Failed to register for restarter events: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3686 strerror(err));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3687 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3688 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3690 if (contract_init() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3691 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3693 if ((timer_queue = iu_tq_create()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3694 error_msg(gettext("Failed to create timer queue."));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3695 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3696 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3697
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3698 if (uds_init() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3699 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3701 if (method_init() < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3702 goto failed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3704 /* Initialize auditing session */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3705 if (adt_start_session(&audit_handle, NULL, ADT_USE_PROC_DATA) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3706 error_msg(gettext("Unable to start audit session"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3707 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3709 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3710 * Initialize signal dispositions/masks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3711 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3712 (void) sigset(SIGHUP, sighup_handler);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3713 (void) sigset(SIGTERM, sigterm_handler);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3714 (void) sigignore(SIGINT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3715
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3716 return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3718 failed:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3719 fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3720 return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3721 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3723 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3724 start_method(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3725 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3726 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3727 int pipe_fds[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3728 int child;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3730 /* Create pipe for child to notify parent of initialization success. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3731 if (pipe(pipe_fds) < 0) {
6435
e526311db503 6657786 Inetd logging can result in denial of service or worse
gm209912
parents: 6073
diff changeset
3732 error_msg("pipe: %s", strerror(errno));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3733 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3734 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3736 if ((child = fork()) == -1) {
6435
e526311db503 6657786 Inetd logging can result in denial of service or worse
gm209912
parents: 6073
diff changeset
3737 error_msg("fork: %s", strerror(errno));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3738 (void) close(pipe_fds[PE_CONSUMER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3739 (void) close(pipe_fds[PE_PRODUCER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3740 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3741 } else if (child > 0) { /* parent */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3743 /* Wait on child to return success of initialization. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3744 (void) close(pipe_fds[PE_PRODUCER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3745 if ((safe_read(pipe_fds[PE_CONSUMER], &i, sizeof (i)) != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3746 (i < 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3747 error_msg(gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3748 "Initialization failed, unable to start"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3749 (void) close(pipe_fds[PE_CONSUMER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3750 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3751 * Batch all initialization errors as 'other' errors,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3752 * resulting in retries being attempted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3753 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3754 return (SMF_EXIT_ERR_OTHER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3755 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3756 (void) close(pipe_fds[PE_CONSUMER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3757 return (SMF_EXIT_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3758 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3759 } else { /* child */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3760 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3761 * Perform initialization and return success code down
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3762 * the pipe.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3763 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3764 (void) close(pipe_fds[PE_CONSUMER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3765 i = init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3766 if ((safe_write(pipe_fds[PE_PRODUCER], &i, sizeof (i)) < 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3767 (i < 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3768 error_msg(gettext("pipe write failure: %s"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3769 strerror(errno));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3770 exit(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3771 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3772 (void) close(pipe_fds[PE_PRODUCER]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3773
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3774 (void) setsid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3776 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3777 * Log a message if the configuration file has changed since
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3778 * inetconv was last run.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3779 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3780 check_conf_file();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3782 event_loop();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3784 fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3785 debug_msg("inetd stopped");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3786 msg_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3787 exit(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3788 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3789 /* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3790 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3792 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3793 * When inetd is run from outside the SMF, this message is output to provide
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3794 * the person invoking inetd with further information that will help them
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3795 * understand how to start and stop inetd, and to achieve the other
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3796 * behaviors achievable with the legacy inetd command line interface, if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3797 * it is possible.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3798 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3799 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3800 legacy_usage(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3801 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3802 (void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3803 "inetd is now an smf(5) managed service and can no longer be run "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3804 "from the\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3805 "command line. To enable or disable inetd refer to svcadm(1M) on\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3806 "how to enable \"%s\", the inetd instance.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3807 "\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3808 "The traditional inetd command line option mappings are:\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3809 "\t-d : there is no supported debug output\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3810 "\t-s : inetd is only runnable from within the SMF\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3811 "\t-t : See inetadm(1M) on how to enable TCP tracing\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3812 "\t-r : See inetadm(1M) on how to set a failure rate\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3813 "\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3814 "To specify an alternative configuration file see svccfg(1M)\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3815 "for how to modify the \"%s/%s\" string type property of\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3816 "the inetd instance, and modify it according to the syntax:\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3817 "\"%s [alt_config_file] %%m\".\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3818 "\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3819 "For further information on inetd see inetd(1M).\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3820 INETD_INSTANCE_FMRI, START_METHOD_ARG, SCF_PROPERTY_EXEC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3821 INETD_PATH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3822 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3823
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3824 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3825 * Usage message printed out for usage errors when running under the SMF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3826 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3827 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3828 smf_usage(const char *arg0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3829 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3830 error_msg("Usage: %s [alt_conf_file] %s|%s|%s", arg0, START_METHOD_ARG,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3831 STOP_METHOD_ARG, REFRESH_METHOD_ARG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3832 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3834 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3835 * Returns B_TRUE if we're being run from within the SMF, else B_FALSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3836 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3837 static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3838 run_through_smf(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3839 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3840 char *fmri;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3842 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3843 * check if the instance fmri environment variable has been set by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3844 * our restarter.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3845 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3846 return (((fmri = getenv("SMF_FMRI")) != NULL) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3847 (strcmp(fmri, INETD_INSTANCE_FMRI) == 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3848 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3850 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3851 main(int argc, char *argv[])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3852 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3853 char *method;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3854 int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3855
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3856 #if !defined(TEXT_DOMAIN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3857 #define TEXT_DOMAIN "SYS_TEST"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3858 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3859 (void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3860 (void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3862 if (!run_through_smf()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3863 legacy_usage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3864 return (SMF_EXIT_ERR_NOSMF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3865 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3866
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3867 msg_init(); /* setup logging */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3868
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1712
diff changeset
3869 (void) enable_extended_FILE_stdio(-1, -1);
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1712
diff changeset
3870
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3871 /* inetd invocation syntax is inetd [alt_conf_file] method_name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3872
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3873 switch (argc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3874 case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3875 method = argv[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3876 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3877 case 3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3878 conf_file = argv[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3879 method = argv[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3880 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3881 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3882 smf_usage(argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3883 return (SMF_EXIT_ERR_CONFIG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3885 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3886
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3887 if (strcmp(method, START_METHOD_ARG) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3888 ret = start_method();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3889 } else if (strcmp(method, STOP_METHOD_ARG) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3890 ret = stop_method();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3891 } else if (strcmp(method, REFRESH_METHOD_ARG) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3892 ret = refresh_method();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3893 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3894 smf_usage(argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3895 return (SMF_EXIT_ERR_CONFIG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3896 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3898 return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3899 }