usr/src/cmd/rad/rad.c
author David Powell <David.Powell@sun.com>
Wed, 16 Dec 2009 19:06:12 -0800
changeset 401 fc1223edbd8d
parent 391 71abce159a62
child 436 c28d8d667ea1
permissions -rw-r--r--
13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave 13426 TLS transport auto-generates readable private keys 13429 file browsing API hard codes incorrect attributes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     1
/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     2
 * CDDL HEADER START
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     3
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     7
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    11
 * and limitations under the License.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    12
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    18
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    19
 * CDDL HEADER END
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    20
 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    21
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    22
/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    24
 * Use is subject to license terms.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    25
 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    26
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    27
#include <sys/wait.h>
401
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
    28
#include <sys/stat.h>
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    29
#include <stdio.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    30
#include <stdlib.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    31
#include <signal.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    32
#include <unistd.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    33
#include <locale.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    34
#include <libscf.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    35
#include <errno.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    36
#include <string.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    37
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    38
#include <libxml/parser.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    39
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    40
#include "rad_object.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    41
#include "rad_module.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    42
#include "rad_xport.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    43
#include "rad_pam.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    44
#include "rad_ticket.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    45
#include "rad_control.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    46
#include "rad_log.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    47
#include "rad_smf.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    48
#include "rad_util.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    49
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    50
#include "api_config.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    51
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    52
#if !defined(TEXT_DOMAIN)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    53
#define	TEXT_DOMAIN	"SYS_TEST"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    54
#endif
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    55
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    56
container_t rad_container = CONTAINER_INITIALIZER;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    57
container_t rad_container_unauth = CONTAINER_INITIALIZER;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    58
container_t rad_container_control = CONTAINER_INITIALIZER;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    59
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    60
int rad_exit_failure = 1;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    61
int rad_exit_config = 1;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    62
boolean_t rad_isproxy = B_FALSE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    63
data_t *moduledirs;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    64
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    65
const char *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    66
_umem_debug_init()
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    67
{
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    68
	return ("default");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    69
}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    70
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    71
/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    72
 * rad(1M) Configuration
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    73
 * ---------------------
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    74
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    75
 * rad(1M) configuration can be obtained from two sources.  Firstly, if
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    76
 * rad is started from SMF and the -s option is specified, it will obtain
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    77
 * configuration from the corresponding service instance.  Secondly,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    78
 * command line arguments can be provided to specify a particular
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    79
 * configuration.  If configuration is available from both sources,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    80
 * command line configuration is processed before SMF configuration.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    81
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    82
 * There are two things that are configurable in rad(1M).
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    83
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    84
 * 1) The set of directories to scan for modules:
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    85
 *    SMF: config/moduledir astring[]
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    86
 *    Command line: '-m <moduledir>' option
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    87
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    88
 * 2) The set of endpoints to listen on
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    89
 *    SMF: <pgname>:xport_<xport type> / *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    90
 *    Command line: '-t <transport>[:opt1[=val1][,opt2[=val2]...]]'
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    91
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    92
 *    Available transports are 'stdin', 'tcp', 'tls', and 'uds'.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    93
 *    All transports take a 'proto' option, which defaults to 'rad'.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    94
 *    'tcp' and 'tls' require a 'port' option.  'uds' requires a
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    95
 *    'path' option.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    96
 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    97
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    98
static int
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    99
rad_service_wait()
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   100
{
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   101
	int status;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   102
	pid_t pid;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   103
	int fds[2];
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   104
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   105
	if (pipe(fds) == -1)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   106
		rad_log(RL_FATAL, "unable to create pipe: %s", strerror(errno));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   107
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   108
	if ((pid = fork()) == -1)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   109
		rad_log(RL_FATAL, "unable to fork daemon: %s", strerror(errno));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   110
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   111
	if (pid > 0) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   112
		pid_t wpid;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   113
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   114
		(void) close(fds[1]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   115
		if (read(fds[0], &status, sizeof (status)) == sizeof (status))
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   116
			_exit(status);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   117
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   118
		do {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   119
			wpid = waitpid(pid, &status, 0);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   120
		} while (wpid != pid && errno == EINTR);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   121
		if (WIFEXITED(status))
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   122
			_exit(WEXITSTATUS(status));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   123
		_exit(SMF_EXIT_ERR_FATAL);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   124
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   125
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   126
	(void) close(fds[0]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   127
	return (fds[1]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   128
}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   129
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   130
static void
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   131
rad_service_done(int fd)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   132
{
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   133
	int status = SMF_EXIT_OK;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   134
	(void) write(fd, &status, sizeof (status));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   135
}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   136
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   137
/* -s is for SMF consumption only; not documented */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   138
static const char *usage =
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   139
    "Usage: rad [ -d ] [ -S fmri ] [ -m moduledir ] [ -t transport ]\n";
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   140
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   141
int
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   142
main(int argc, char **argv)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   143
{
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   144
	int opt, i;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   145
	int nxport = 0, nmoddir = 0;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   146
	const char *xports[argc], *moddirs[argc];
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   147
	boolean_t smf_startup = B_FALSE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   148
	boolean_t smf_config = B_FALSE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   149
	const char *smf_fmri = NULL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   150
	sigset_t hupset;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   151
	int svc_fd = -1;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   152
401
fc1223edbd8d 13421 apache: o.o.o.rad.ContainerException: system error: error talking to slave
David Powell <David.Powell@sun.com>
parents: 391
diff changeset
   153
	(void) umask(077);
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   154
	(void) setlocale(LC_ALL, "");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   155
	(void) textdomain(TEXT_DOMAIN);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   156
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   157
	(void) sigemptyset(&hupset);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   158
	(void) sigaddset(&hupset, SIGHUP);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   159
	(void) sigprocmask(SIG_BLOCK, &hupset, NULL);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   160
	(void) sigignore(SIGPIPE);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   161
	(void) sigignore(SIGCHLD);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   162
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   163
	while ((opt = getopt(argc, argv, "dpsS:t:m:")) != EOF) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   164
		switch (opt) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   165
		case 't':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   166
			xports[nxport++] = optarg;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   167
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   168
		case 'm':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   169
			moddirs[nmoddir++] = optarg;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   170
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   171
		case 'p':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   172
			rad_isproxy = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   173
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   174
		case 's':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   175
			smf_startup = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   176
			smf_config = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   177
			rad_exit_failure = SMF_EXIT_ERR_FATAL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   178
			rad_exit_config = SMF_EXIT_ERR_CONFIG;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   179
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   180
		case 'S':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   181
			/* Read config from specified FMRI */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   182
			smf_config = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   183
			smf_fmri = optarg;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   184
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   185
		case 'd':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   186
			rad_loglevel = RL_ALL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   187
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   188
		default:
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   189
			(void) fprintf(stderr, usage);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   190
			exit(2);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   191
		}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   192
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   193
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   194
	moduledirs = rad_strarray(moddirs, nmoddir, lt_copy);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   195
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   196
	if (smf_config) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   197
		data_t *config = rad_smf_read_pg_byname(smf_fmri, "config",
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   198
		    &t__radconfig);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   199
		if (config == NULL)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   200
			rad_log(RL_CONFIG,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   201
			    "unable to read configuration from service\n");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   202
		data_t *modules = struct_get(config, "moduledir");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   203
		data_t *debug = struct_get(config, "debug");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   204
		if (debug != NULL && debug->d_data.boolean)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   205
			rad_loglevel = RL_ALL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   206
		moduledirs = array_combine(moduledirs, data_ref(modules));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   207
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   208
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   209
	/* parent exits, child returns */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   210
	if (smf_startup)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   211
		svc_fd = rad_service_wait();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   212
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   213
	xmlInitParser();	/* So libxml consumers are MT safe */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   214
	rad_ticket_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   215
	rad_pam_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   216
	rad_module_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   217
	rad_control_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   218
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   219
	if (moduledirs->d_rsize == 0)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   220
		rad_log(RL_CONFIG, "No module directories specified.\n");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   221
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   222
	for (i = 0; i < moduledirs->d_rsize; i++)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   223
		rad_module_scan(moduledirs->d_data.array[i]->d_data.string);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   224
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   225
	for (i = 0; i < nxport; i++)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   226
		rad_xport_parse(xports[i]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   227
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   228
	if (smf_startup) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   229
		/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   230
		 * Only process SMF-configured transports when really
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   231
		 * run as a service.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   232
		 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   233
		rad_xport_smf();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   234
		rad_service_done(svc_fd);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   235
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   236
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   237
	(void) sigprocmask(SIG_UNBLOCK, &hupset, NULL);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   238
	for (;;)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   239
		pause();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   240
}