usr/src/cmd/rad/rad.c
author David Powell <david.e.powell@oracle.com>
Tue, 23 Nov 2010 15:54:20 -0800
changeset 604 20d9acfeb7fb
parent 595 725a82f60b1c
child 664 bf20f6a9e353
permissions -rw-r--r--
17421 name key order preservation 17422 rad dynamic namespace support 17423 rad kstat module
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
/*
500
d134d555588f 15908 create accessors for all ADR data
David Powell <david.e.powell@oracle.com>
parents: 472
diff changeset
    23
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    24
 */
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
#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
    27
#include <sys/stat.h>
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    28
#include <stdio.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    29
#include <stdlib.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    30
#include <signal.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    31
#include <unistd.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    32
#include <locale.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    33
#include <libscf.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    34
#include <errno.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    35
#include <string.h>
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    36
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    37
#include <libxml/parser.h>
555
399f1dff49b2 16728 rad uses openssl naively
David Powell <david.e.powell@oracle.com>
parents: 540
diff changeset
    38
#include <rad/adr_stream.h>
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    39
540
2a0d274b1469 16571 move all content module interfaces into rad_modapi.h
David Powell <david.e.powell@oracle.com>
parents: 500
diff changeset
    40
#include "rad.h"
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    41
#include "rad_object.h"
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents: 555
diff changeset
    42
#include "rad_container.h"
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    43
#include "rad_module.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    44
#include "rad_xport.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    45
#include "rad_pam.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    46
#include "rad_ticket.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    47
#include "rad_control.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    48
#include "rad_smf.h"
540
2a0d274b1469 16571 move all content module interfaces into rad_modapi.h
David Powell <david.e.powell@oracle.com>
parents: 500
diff changeset
    49
#include "rad_modapi.h"
436
c28d8d667ea1 14688 slave daemons should be placed in own contracts
David Powell <David.Powell@sun.com>
parents: 401
diff changeset
    50
#include "rad_slave.h"
391
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
#include "api_config.h"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    53
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    54
#if !defined(TEXT_DOMAIN)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    55
#define	TEXT_DOMAIN	"SYS_TEST"
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    56
#endif
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    57
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
    58
rad_container_t rad_container_auth;
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
    59
rad_container_t rad_container_unauth;
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
    60
rad_container_t rad_container_control;
575
e5ca78dfe938 17085 add component prefixes to adr's method/attribute
David Powell <david.e.powell@oracle.com>
parents: 573
diff changeset
    61
rad_container_t *rad_container = &rad_container_auth;
540
2a0d274b1469 16571 move all content module interfaces into rad_modapi.h
David Powell <david.e.powell@oracle.com>
parents: 500
diff changeset
    62
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    63
int rad_exit_failure = 1;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    64
int rad_exit_config = 1;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    65
boolean_t rad_isproxy = B_FALSE;
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    66
data_t *rad_moduledirs;
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
    67
data_t *rad_modules;
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    68
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    69
const char *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    70
_umem_debug_init()
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
	return ("default");
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
/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    76
 * rad(1M) Configuration
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    77
 * ---------------------
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    78
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    79
 * rad(1M) configuration can be obtained from two sources.  Firstly, if
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    80
 * 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
    81
 * configuration from the corresponding service instance.  Secondly,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    82
 * command line arguments can be provided to specify a particular
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    83
 * configuration.  If configuration is available from both sources,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    84
 * command line configuration is processed before SMF configuration.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    85
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    86
 * There are two things that are configurable in rad(1M).
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
 * 1) The set of directories to scan for modules:
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    89
 *    SMF: config/moduledir astring[]
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    90
 *    Command line: '-m <moduledir>' option
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
 * 2) The set of endpoints to listen on
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    93
 *    SMF: <pgname>:xport_<xport type> / *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    94
 *    Command line: '-t <transport>[:opt1[=val1][,opt2[=val2]...]]'
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    95
 *
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    96
 *    Available transports are 'stdin', 'tcp', 'tls', and 'uds'.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    97
 *    All transports take a 'proto' option, which defaults to 'rad'.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    98
 *    'tcp' and 'tls' require a 'port' option.  'uds' requires a
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
    99
 *    'path' option.
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
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   102
static int
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   103
rad_service_wait()
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
	int status;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   106
	pid_t pid;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   107
	int fds[2];
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   108
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   109
	if (pipe(fds) == -1)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   110
		rad_log(RL_FATAL, "unable to create pipe: %s", strerror(errno));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   111
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   112
	if ((pid = fork()) == -1)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   113
		rad_log(RL_FATAL, "unable to fork daemon: %s", strerror(errno));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   114
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   115
	if (pid > 0) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   116
		pid_t wpid;
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
		(void) close(fds[1]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   119
		if (read(fds[0], &status, sizeof (status)) == sizeof (status))
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   120
			_exit(status);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   121
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   122
		do {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   123
			wpid = waitpid(pid, &status, 0);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   124
		} while (wpid != pid && errno == EINTR);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   125
		if (WIFEXITED(status))
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   126
			_exit(WEXITSTATUS(status));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   127
		_exit(SMF_EXIT_ERR_FATAL);
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
	(void) close(fds[0]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   131
	return (fds[1]);
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
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   134
static void
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   135
rad_service_done(int fd)
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
	int status = SMF_EXIT_OK;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   138
	(void) write(fd, &status, sizeof (status));
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   139
}
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
/* -s is for SMF consumption only; not documented */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   142
static const char *usage =
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   143
	"Usage: rad [ -d ] [ -S fmri ] [ -m moduledir ] [ -M modules ] "
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   144
	"[ -t transport ]\n";
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   145
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   146
int
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   147
main(int argc, char **argv)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   148
{
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   149
	int opt, i;
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   150
	int nxport = 0, nmoddir = 0, nmods = 0;
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   151
	const char *xports[argc], *moddirs[argc], *mods[argc];
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   152
	boolean_t smf_startup = B_FALSE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   153
	boolean_t smf_config = B_FALSE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   154
	const char *smf_fmri = NULL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   155
	sigset_t hupset;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   156
	int svc_fd = -1;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   157
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
   158
	(void) umask(077);
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   159
	(void) setlocale(LC_ALL, "");
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   160
	(void) textdomain(TEXT_DOMAIN);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   161
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   162
	(void) sigemptyset(&hupset);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   163
	(void) sigaddset(&hupset, SIGHUP);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   164
	(void) sigprocmask(SIG_BLOCK, &hupset, NULL);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   165
	(void) sigignore(SIGPIPE);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   166
	(void) sigignore(SIGCHLD);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   167
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   168
	while ((opt = getopt(argc, argv, "dpsS:t:m:M:")) != EOF) {
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   169
		switch (opt) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   170
		case 't':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   171
			xports[nxport++] = optarg;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   172
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   173
		case 'm':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   174
			moddirs[nmoddir++] = optarg;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   175
			break;
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   176
		case 'M':
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   177
			mods[nmods++] = optarg;
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   178
			break;
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   179
		case 'p':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   180
			rad_isproxy = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   181
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   182
		case 's':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   183
			smf_startup = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   184
			smf_config = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   185
			rad_exit_failure = SMF_EXIT_ERR_FATAL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   186
			rad_exit_config = SMF_EXIT_ERR_CONFIG;
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
		case 'S':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   189
			/* Read config from specified FMRI */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   190
			smf_config = B_TRUE;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   191
			smf_fmri = optarg;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   192
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   193
		case 'd':
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   194
			rad_loglevel = RL_ALL;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   195
			break;
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   196
		default:
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   197
			(void) fprintf(stderr, usage);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   198
			exit(2);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   199
		}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   200
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   201
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   202
	rad_moduledirs = rad_strarray(moddirs, nmoddir, lt_copy);
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   203
	rad_modules = rad_strarray(mods, nmods, lt_copy);
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   204
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   205
	if (smf_config) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   206
		data_t *config = rad_smf_read_pg_byname(smf_fmri, "config",
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   207
		    &t__radconfig);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   208
		if (config == NULL)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   209
			rad_log(RL_CONFIG,
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   210
			    "unable to read configuration from service\n");
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   211
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   212
		data_t *moduledir, *modules, *debug;
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   213
		if ((debug = struct_get(config, "debug")) != NULL &&
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   214
		    data_to_boolean(debug))
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   215
			rad_loglevel = RL_ALL;
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   216
		if ((moduledir = struct_get(config, "moduledir")) != NULL)
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   217
			rad_moduledirs =
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
   218
			    array_addall(rad_moduledirs, data_ref(moduledir));
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   219
		if ((modules = struct_get(config, "modules")) != NULL)
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   220
			rad_modules =
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
   221
			    array_addall(rad_modules, data_ref(modules));
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   222
		data_free(config);
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   223
	}
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
	/* parent exits, child returns */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   226
	if (smf_startup)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   227
		svc_fd = rad_service_wait();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   228
604
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
   229
	cont_create(&rad_container_auth);
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
   230
	cont_create(&rad_container_unauth);
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
   231
	cont_create(&rad_container_control);
20d9acfeb7fb 17421 name key order preservation
David Powell <david.e.powell@oracle.com>
parents: 595
diff changeset
   232
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   233
	xmlInitParser();	/* So libxml consumers are MT safe */
555
399f1dff49b2 16728 rad uses openssl naively
David Powell <david.e.powell@oracle.com>
parents: 540
diff changeset
   234
	adr_ssl_init();		/* So OpenSSL consumers are MT safe */
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   235
	rad_ticket_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   236
	rad_pam_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   237
	rad_module_init();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   238
	rad_control_init();
573
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents: 555
diff changeset
   239
	if (!cont_insert_contobj(&rad_container_auth) ||
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents: 555
diff changeset
   240
	    !cont_insert_contobj(&rad_container_control))
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents: 555
diff changeset
   241
		rad_log(RL_FATAL, "Failed to insert container objects");
f0add9469f92 17058 support removing objects
David Powell <david.e.powell@oracle.com>
parents: 555
diff changeset
   242
436
c28d8d667ea1 14688 slave daemons should be placed in own contracts
David Powell <David.Powell@sun.com>
parents: 401
diff changeset
   243
	if (rad_isproxy)
c28d8d667ea1 14688 slave daemons should be placed in own contracts
David Powell <David.Powell@sun.com>
parents: 401
diff changeset
   244
		rad_slave_init();
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   245
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   246
	if (array_size(rad_moduledirs) == 0 && array_size(rad_modules) == 0)
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   247
		rad_log(RL_CONFIG,
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   248
		    "No modules or module directories specified.\n");
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   249
595
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   250
	/*
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   251
	 * Explicitly specified modules take precedence over modules found by
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   252
	 * scanning provided module directories.
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   253
	 */
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   254
	for (i = 0; i < array_size(rad_modules); i++)
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   255
		rad_module_load(data_to_string(array_get(rad_modules, i)));
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   256
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   257
	for (i = 0; i < array_size(rad_moduledirs); i++)
725a82f60b1c 17332 support loading specific modules
David Powell <david.e.powell@oracle.com>
parents: 575
diff changeset
   258
		rad_module_scan(data_to_string(array_get(rad_moduledirs, i)));
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   259
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   260
	for (i = 0; i < nxport; i++)
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   261
		rad_xport_parse(xports[i]);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   262
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   263
	if (smf_startup) {
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   264
		/*
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   265
		 * Only process SMF-configured transports when really
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   266
		 * run as a service.
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   267
		 */
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   268
		rad_xport_smf();
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   269
		rad_service_done(svc_fd);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   270
	}
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   271
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   272
	(void) sigprocmask(SIG_UNBLOCK, &hupset, NULL);
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   273
	for (;;)
472
a124d7f07f0e 15466 add lint target for main rad daemon
David Powell <David.Powell@sun.com>
parents: 436
diff changeset
   274
		(void) pause();
a124d7f07f0e 15466 add lint target for main rad daemon
David Powell <David.Powell@sun.com>
parents: 436
diff changeset
   275
	/* NOTREACHED */
391
71abce159a62 13357 rad
David Powell <David.Powell@sun.com>
parents:
diff changeset
   276
}