a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * CDDL HEADER START
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * The contents of this file are subject to the terms of the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Common Development and Distribution License (the "License").
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * You may not use this file except in compliance with the License.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * or http://www.opensolaris.org/os/licensing.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * See the License for the specific language governing permissions
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and limitations under the License.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * When distributing Covered Code, include this CDDL HEADER in each
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If applicable, add the following below this CDDL HEADER, with the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * fields enclosed by brackets "[]" replaced with your own identifying
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * information: Portions Copyright [yyyy] [name of copyright owner]
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * CDDL HEADER END
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Use is subject to license terms.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#pragma ident "%Z%%M% %I% %E% SMI"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <stdio.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <string.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <stdlib.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <unistd.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <limits.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <ctype.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <stropts.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <errno.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <libintl.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <locale.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <fcntl.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/types.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <sys/stat.h>
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire#include <sys/socket.h>
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire#include <sys/sockio.h>
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire#include <inet/ip.h>
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire#include <inet/nd.h>
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire#include <net/if.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <libscf.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <libscf_priv.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#include <libuutil.h>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This program moves routing management under SMF. We do this by giving
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm options that allow interaction with SMF services. These include:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - setting the routing services routeadm will enable
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s routing-svcs="fmri [fmri...]"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * where each fmri is an SMF routing service.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - changing properties of routing services
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -m fmri key=value [key=value...]
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - listing routing daemon properties
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -l fmri
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * where all properties in the "routing" property group are listed.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * By providing legacy routing services (legacy-routing:ipv4 and ipv6), we
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * can also support running of routing daemons with no SMF service under SMF.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Specifying a routing daemon with no SMF counterpart results in the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * daemon, it`s arguments and stop command being set in the appropriate instance
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to be picked up by start/stop methods.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Internally, routeadm keeps track of routing services by setting the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * "current-routing-svc" property to "true" in the services it manages.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * So for example, running
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s routing-svcs="route:default ripng:default"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * sets this variable in each instance specified. If the user specifies a
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * non-SMF routing daemon via
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s ipv4-routing-daemon=/usr/sbin/mydaemon
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the variable will be set for the legacy-routing:ipv4 instance.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * In order to ensure that the SMF versions of routing daemons are used
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * where possible, routeadm will check the daemons specified in
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * ipv4-routing-daemon/ipv6-routing-daemon to determine if there is an
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * SMF counterpart. If so, rather than running the legacy service
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we move configuration, specifically the associated daemon arguments
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the SMF counterpart. From there, when the daemon is enabled, it
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * will pick up the daemon arguments setting, transfer the argument string
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the appropriate properties and run the service.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * To support the semantics of routeadm -e (enable at next boot) through SMF,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we make use of temporary state changes, which last only until reboot.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * For example, if a service is disabled, and it is to be enabled via
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -e, we simply change the disable to a temporary disable,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and set the persistent enabled value to true. This ensures the daemon
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * will run at next boot, but not now. The reverse is true for disabling
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * enabled instances (and if the daemon is enabled when we issue the enable,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we do nothing since it is already in the desired state).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Since the code is quite involved, we provide a guide to the more complex
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * actions taken in response to user commands.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -e[d] ipv4[6]-routing[forwarding]
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * In this case, the goal is to prepare the configured routing daemons
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * (specified through routeadm -s routing-svcs="...") or forwarding
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * services to switch on (-e) or of (-d) at next boot.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Since this operation must be applied to multiple services in the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing daemon case (as opposed to the single ipv4[6]-forwarding
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * service), we make use of the scf_walk_fmri() function, which
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * applies a callback function to all matching functions. In the case
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * of the routing daemons, we pass in a NULL signifying that all
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * instances should be walked (we then weed out the relevant routing
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * services through presence of the routeadm/protocol property). In
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the case of enable, a routing service is enabled IFF it has the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * previously-mentioned property - with an appropriate value (i.e. ipv4
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * for "routeadm -e ipv4-routing") - and it has routeadm/curr-routing-svc
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * property set to true (this is set by other operations such as
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -s routing-svcs="..."). Then, smf_enable_instance() or
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * smf_disable_instance() is called, setting the temporary state to
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the current state of the service. This then allows setting of
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * general/enabled value to next-boot value. In the case of disabling
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * ipv4[6]-routing, all valid ipv4[6] routing daemons are prepared
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * for next-boot disable, not just those specified via routing-svcs (this
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * means that if the user enables routing daemons with "svcadm enable",
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * disabling global routing does really switch off all routing daemons).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This is implemented through the ra_get_set_opt_common_cb() function,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * called by the ra_set_persistent_opt_cb() function. The same
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * function can be used for both routing and forwarding options, in the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * latter case we simply provide the specific FMRI of the forwarding
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * service in question (ipv4-forwarding or ipv6-forwarding), and dispense
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * with the eligibility tests we need to weed out the routing services
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * from the rest.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Before we initiate the "enable" however, we must check routing daemons
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * specified via the legacy variables (ipv4-routing-daemon etc).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If they map to SMF routing services, we wish to transfer their
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * configuration to the corresponding services and use them instead of
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the legacy services. To do this, we need to match the daemon program
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * against the routeadm/daemon property of each routing daemon (we use
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * scf_walk_fmri() and the routeadm/protocol property again to identify
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * daemons). If a match is found, the daemon arguments are transferred
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the appropriate service`s daemon-args property, to be picked up
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * by it`s start method and converted into appropriate property values.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This is accomplished by ra_check_legacy_daemons(), and the callback
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * operation is carried out by ra_upgrade_legacy_daemons_cb(). If the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * daemon was not upgraded, we need to mark the legacy-routing:ipv4[6]
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * instance to be enabled (by routeadm -e), since it now must run the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * un-upgradeable legacy daemon.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -l fmri
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Lists all properties and values in the routing property group associated
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * with instance fmri. We simply walk through the composed property
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * group, displaying all values. See ra_list_props_cb().
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -m fmri key=value ...
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Modify property values in the routing property group. If the same
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * key is used more than once, multiple property values are set for that
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * property. Properties must exist in the composed property group, but
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * will only ever be set at the instance level to prevent multiple
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * instances inheriting the property in error. See ra_modify_props_cb().
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -s var=value
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * In all cases bar the routing-svcs variable, this simply involves
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * setting the appropriate SMF property value for the variable. The
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing-svcs case is more complex, since we would like operations
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * like the following to have intuitive effects:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s routing-svcs=route -e ipv4-routing -u
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s routing-svcs=rdisc -u
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * i.e., in the end, rdisc is the only routing service running. To
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * accomplish this switchover, we need to disable the old routing-svcs
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and enable the new, marking the latter with the curr-routing-svc
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * property so that routeadm -e will pick them up. This is carried
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * out by the ra_update_routing_svcs() function.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -R alt_root ...
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Used to support use of routeadm in Custom Jumpstart scripts, this
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * option causes all subsequent commands to be appended to the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * /var/svc/profile/upgrade file, which is run on the subsequent boot.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This is done because the SMF repository is not available to make
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the modifications to property values required in routeadm operations.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routeadm -u
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Update applies the "next boot" state to the current system. Here
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we simply take the persistent state (general/enabled value) and
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * make it the current state through smf_enable_instance() or
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * smf_disable_instance() as appropriate (these calls, without the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * temporary flag set, delete the general_ovr/enabled property).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_OPT_IPV4_ROUTING "ipv4-routing"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_OPT_IPV6_ROUTING "ipv6-routing"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_OPT_IPV4_FORWARDING "ipv4-forwarding"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_OPT_IPV6_FORWARDING "ipv6-forwarding"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IS_ROUTING_OPT(opt) (strcmp(opt, RA_OPT_IPV4_ROUTING) == 0 || \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strcmp(opt, RA_OPT_IPV6_ROUTING) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_IPV4_ROUTING_DAEMON "ipv4-routing-daemon"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_IPV4_ROUTING_DAEMON_ARGS "ipv4-routing-daemon-args"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_IPV4_ROUTING_STOP_CMD "ipv4-routing-stop-cmd"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_IPV6_ROUTING_DAEMON "ipv6-routing-daemon"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_IPV6_ROUTING_DAEMON_ARGS "ipv6-routing-daemon-args"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_IPV6_ROUTING_STOP_CMD "ipv6-routing-stop-cmd"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_VAR_ROUTING_SVCS "routing-svcs"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_INSTANCE_ALL NULL
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_INSTANCE_ROUTING_SETUP "svc:/network/routing-setup:default"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_INSTANCE_IPV4_FORWARDING "svc:/network/ipv4-forwarding:default"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_INSTANCE_IPV6_FORWARDING "svc:/network/ipv6-forwarding:default"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_INSTANCE_LEGACY_ROUTING_IPV4 \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "svc:/network/routing/legacy-routing:ipv4"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_INSTANCE_LEGACY_ROUTING_IPV6 \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "svc:/network/routing/legacy-routing:ipv6"
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire#define RA_INSTANCE_NDP "svc:/network/routing/ndp:default"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PG_ROUTEADM "routeadm"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_CURR_ROUTING_SVC "current-routing-svc"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_ROUTING_SVCS "routing-svcs"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_ROUTING_SVCS "default-routing-svcs"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_PROTO "protocol"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DAEMON "daemon"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_DAEMON "default-daemon"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DAEMON_ARGS "daemon-args"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_DAEMON_ARGS "default-daemon-args"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DAEMON_STOP_CMD "daemon-stop-cmd"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_STOP_CMD "default-daemon"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_LEGACY_DAEMON "legacy-daemon"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_IPV4_ROUTING "default-ipv4-routing"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_IPV6_ROUTING "default-ipv6-routing"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_IPV4_FORWARDING "default-ipv4-forwarding"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_DEFAULT_IPV6_FORWARDING "default-ipv6-forwarding"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_IPV4_ROUTING_SET "ipv4-routing-set"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_IPV6_ROUTING_SET "ipv6-routing-set"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROP_ROUTING_CONF_READ "routing-conf-read"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PG_ROUTING "routing"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROPVAL_BOOLEAN_TRUE "true"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROPVAL_BOOLEAN_FALSE "false"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROPVAL_PROTO_IPV4 "ipv4"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_PROPVAL_PROTO_IPV6 "ipv6"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_SVC_FLAG_NONE 0x0
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_SVC_FLAG_IPV4_ROUTING 0x1
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_SVC_FLAG_IPV6_ROUTING 0x2
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_SMF_UPGRADE_FILE "/var/svc/profile/upgrade"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_SMF_UPGRADE_MSG " # added by routeadm(1M)"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_CONF_FILE "/etc/inet/routing.conf"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_CONF_FILE_OLD "/etc/inet/routing.conf.old"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define RA_MAX_CONF_LINE 256
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Option value. Each option requires an FMRI identifying which services
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to run the get_current/persistent scf_walk_fmri() function with, and
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * associated flags (to ensure that in the case that multiple services
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * match, we select the correct ones). In addition, we specify the FMRI
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and property used to set default option value. The opt_enabled field
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * is used to hold retrieved state from get_*_opt_() callbacks and to specify
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * desired state for set_*_opt() operations.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguiretypedef struct raopt {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *opt_name;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *opt_fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int opt_flags;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t opt_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *opt_default_fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *opt_default_prop;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t opt_default_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire} raopt_t;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireraopt_t ra_opts[] = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_OPT_IPV4_ROUTING, RA_INSTANCE_ALL, RA_SVC_FLAG_IPV4_ROUTING,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE, RA_INSTANCE_ROUTING_SETUP, RA_PROP_DEFAULT_IPV4_ROUTING,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_OPT_IPV6_ROUTING, RA_INSTANCE_ALL, RA_SVC_FLAG_IPV6_ROUTING,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE, RA_INSTANCE_ROUTING_SETUP, RA_PROP_DEFAULT_IPV6_ROUTING,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_OPT_IPV4_FORWARDING, RA_INSTANCE_IPV4_FORWARDING, RA_SVC_FLAG_NONE,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE, RA_INSTANCE_IPV4_FORWARDING, RA_PROP_DEFAULT_IPV4_FORWARDING,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_OPT_IPV6_FORWARDING, RA_INSTANCE_IPV6_FORWARDING, RA_SVC_FLAG_NONE,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE, RA_INSTANCE_IPV6_FORWARDING, RA_PROP_DEFAULT_IPV6_FORWARDING,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { NULL, NULL, RA_SVC_FLAG_NONE, B_FALSE, NULL, NULL, B_FALSE }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguiretypedef enum option_values {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire OPT_INVALID, OPT_ENABLED, OPT_DISABLED, OPT_DEFAULT, OPT_UNKNOWN
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire} oval_t;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguiretypedef struct ra_var {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *var_name;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *var_fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *var_prop;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *var_value;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *var_default_fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *var_default_prop;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *var_default_value;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire} ravar_t;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireravar_t ra_vars[] = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_IPV4_ROUTING_DAEMON, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON, NULL, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_DAEMON, NULL},
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_IPV4_ROUTING_DAEMON_ARGS, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON_ARGS, NULL, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_DAEMON_ARGS, NULL },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_IPV4_ROUTING_STOP_CMD, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON_STOP_CMD, NULL, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_STOP_CMD, NULL },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_IPV6_ROUTING_DAEMON, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON, NULL, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_DAEMON, NULL },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_IPV6_ROUTING_DAEMON_ARGS, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON_ARGS, NULL, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_DAEMON_ARGS, NULL },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_IPV6_ROUTING_STOP_CMD, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON_STOP_CMD, NULL, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_STOP_CMD, NULL },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { RA_VAR_ROUTING_SVCS, RA_INSTANCE_ROUTING_SETUP,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_ROUTING_SVCS, NULL, RA_INSTANCE_ROUTING_SETUP,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DEFAULT_ROUTING_SVCS, NULL },
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire { NULL, NULL, NULL, NULL, NULL, NULL, NULL }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirechar *v_opt[] = {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV4_ROUTING_DAEMON 0
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_IPV4_ROUTING_DAEMON,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV4_ROUTING_DAEMON_ARGS 1
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_IPV4_ROUTING_DAEMON_ARGS,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV4_ROUTING_STOP_CMD 2
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_IPV4_ROUTING_STOP_CMD,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV6_ROUTING_DAEMON 3
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_IPV6_ROUTING_DAEMON,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV6_ROUTING_DAEMON_ARGS 4
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_IPV6_ROUTING_DAEMON_ARGS,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV6_ROUTING_STOP_CMD 5
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_IPV6_ROUTING_STOP_CMD,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define ROUTING_SVCS 6
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_VAR_ROUTING_SVCS,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire};
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IS_IPV4_VAR(varname) (strncmp(varname, "ipv4", 4) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IS_IPV6_VAR(varname) (strncmp(varname, "ipv6", 4) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define VAR_PROTO_MATCH(varname, proto) (strncmp(varname, proto, 4) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV4_VARS_UNSET \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (strtok(ra_vars[IPV4_ROUTING_DAEMON].var_value, " \t") == NULL && \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strtok(ra_vars[IPV4_ROUTING_DAEMON_ARGS].var_value, " \t") == NULL && \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strtok(ra_vars[IPV4_ROUTING_STOP_CMD].var_value, " \t") == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define IPV6_VARS_UNSET \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (strtok(ra_vars[IPV6_ROUTING_DAEMON].var_value, " \t") == NULL && \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strtok(ra_vars[IPV6_ROUTING_DAEMON_ARGS].var_value, " \t") == NULL && \
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strtok(ra_vars[IPV6_ROUTING_STOP_CMD].var_value, " \t") == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Structure used in modify operations to tie property name and multiple values
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * together.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguiretypedef struct ra_prop {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *prop_name;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char **prop_values;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int prop_numvalues;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire} ra_prop_t;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguiretypedef int (*ra_smf_cb_t)(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Used to store program name */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic const char *myname;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void usage(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_check_legacy_daemons(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_upgrade_legacy_daemons(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_upgrade_cmd(char, int, char **);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_update(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_update_routing_svcs(char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_report(boolean_t, const char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_smf_cb(ra_smf_cb_t, const char *, void *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_upgrade_from_legacy_conf(void);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguirestatic int ra_numv6intfs(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_parseconf(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_parseopt(char *, int, raopt_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_parsevar(char *, ravar_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic oval_t ra_str2oval(const char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic raopt_t *ra_str2opt(const char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void ra_resetopts(void);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic ravar_t *ra_str2var(const char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void ra_resetvars(const char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic char *ra_intloptname(const char *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Callback for upgrade of legacy daemons */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_upgrade_legacy_daemons_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Callbacks used to set/retieve routing options */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_set_current_opt_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_set_persistent_opt_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_set_default_opt_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_current_opt_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_persistent_opt_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_default_opt_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_set_opt_common_cb(raopt_t *, scf_walkinfo_t *, boolean_t,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirestatic int ra_routing_opt_set_cb(void *, scf_walkinfo_t *);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirestatic int ra_routing_opt_unset_cb(void *, scf_walkinfo_t *);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirestatic int ra_routing_opt_set_unset_cb(raopt_t *, scf_walkinfo_t *, boolean_t);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Callbacks used to set/retrieve routing variables */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_set_persistent_var_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_persistent_var_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_default_var_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_mark_routing_svcs_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Callbacks used to list/set daemon properties and list daemons and states. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_list_props_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_modify_props_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_print_state_cb(void *, scf_walkinfo_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Utility functions for SMF operations */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_pg(scf_handle_t *, scf_instance_t *, const char *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t, boolean_t, scf_propertygroup_t **);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_boolean_prop(scf_handle_t *, scf_instance_t *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *, const char *, boolean_t, boolean_t, boolean_t *);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_single_prop_as_string(scf_handle_t *, scf_instance_t *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *, const char *, boolean_t, boolean_t, scf_type_t *, char **);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_get_prop_as_string(scf_handle_t *, scf_instance_t *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *, const char *, boolean_t, boolean_t, scf_type_t *, int *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char ***);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void ra_free_prop_values(int, char **);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_set_boolean_prop(scf_handle_t *, scf_instance_t *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *, const char *, boolean_t, boolean_t);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int ra_set_prop_from_string(scf_handle_t *, scf_instance_t *,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *, const char *, scf_type_t, boolean_t, int,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char **);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireusage(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "usage: %1$s [-p] [-R <root-dir>]\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " %1$s [-e <option>] [-d <option>] [-r <option>]\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " [-l <FMRI>] [-m <FMRI> key=value [...]]\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " [-s <var>=<val>] [-R <root-dir>]\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " %1$s -u\n\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " <option> is one of:\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv4-forwarding\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv4-routing\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv6-forwarding\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv6-routing\n\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " <var> is one of:\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv4-routing-daemon\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv4-routing-daemon-args\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv4-routing-stop-cmd\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv6-routing-daemon\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv6-routing-daemon-args\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " ipv6-routing-stop-cmd\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " routing-svcs\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireint
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguiremain(int argc, char *argv[])
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int opt, opt_index, numargs, status = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int numvalues, i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ssize_t keylen;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t modify = B_FALSE, report = B_TRUE, update = B_FALSE;
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire boolean_t booting = B_FALSE, alt_root_set = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t parseable = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *key, *nk, *keyend, *val, **vals, *options, *fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *parseopt = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt_t *raopt;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *ravar;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_prop_t raprop;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname = argv[0];
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) setlocale(LC_ALL, "");
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#define TEXT_DOMAIN "SYS_TEST"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire#endif
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) textdomain(TEXT_DOMAIN);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Before processing any options, we parse /etc/inet/routing.conf
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * (if present) and transfer values to SMF.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_upgrade_from_legacy_conf() == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire while ((opt = getopt(argc, argv, ":bd:e:l:m:p:R:r:s:u")) != EOF) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire switch (opt) {
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire case 'b':
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire /*
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * Project-private option that tells us enable/disable
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * operations should not set ipv4(6)-routing-set
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * property. Used in routing-setup service method
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * to change default routing state, and, if
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * no explicit enable/disable operations have been
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * carried out, change current ipv4 routing state.
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire */
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire booting = B_TRUE;
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'd':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'e':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'r':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (alt_root_set) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_upgrade_cmd(opt, 1, &optarg) != 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire modify = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((raopt = ra_str2opt(optarg)) != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Set current value appropriately */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire switch (opt) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'd':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'e':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Check legacy daemons, mark
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing-svcs.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (IS_ROUTING_OPT(optarg) &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_check_legacy_daemons() == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'r':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This callback sets opt_enabled to
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the default value.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetopts();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_default_opt_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_default_fmri, raopt)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (raopt->opt_enabled &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire IS_ROUTING_OPT(optarg) &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_check_legacy_daemons() == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* set value to default */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled =
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_default_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_opt_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_fmri, raopt) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire /*
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * ipv4(6)-routing explicitly enabled/disabled,
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * need to set ipv4(6)-routing-set property
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * for routing-setup service. Once this
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * is set, routing-setup will not override
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * administrator action and will not enable
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * ipv4-routing in the case that no default
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * route can be determined. If ipv4(6)-routing
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * is reverted to its default value, set
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * ipv4(6)-routing-set back to false.
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire */
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire if (!booting && (raopt->opt_flags &
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire (RA_SVC_FLAG_IPV4_ROUTING |
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire RA_SVC_FLAG_IPV6_ROUTING))) {
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire if (ra_smf_cb(opt == 'r' ?
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire ra_routing_opt_unset_cb :
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire ra_routing_opt_set_cb,
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire raopt->opt_default_fmri, raopt)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire == -1)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire exit(EXIT_FAILURE);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else if ((ravar = ra_str2var(optarg)) != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (opt != 'r') {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* set current value to default */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetopts();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_default_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_default_fmri, ravar) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Need special case for routing-svcs var */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(ravar->var_name, RA_VAR_ROUTING_SVCS)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_update_routing_svcs(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_default_value) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else if (ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_fmri, ravar) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%1$s: invalid option: %2$s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire optarg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire modify = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'l':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_list_props_cb, optarg, NULL) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire report = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'm':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire fmri = optarg;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire modify = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Argument list of key=value pairs, we need to
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * collate all matching keys to set multiple values.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire numargs = 1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire i = optind;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (numargs = 1; argv[i] != NULL && argv[i][0] != '-';
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire numargs++)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire i++;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (numargs == 1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: key=value required for "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "property change\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (alt_root_set) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_upgrade_cmd(opt, numargs,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &argv[optind - 1]) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire optind += numargs - 1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Collect all key=value pairs which use same key
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * so we can add multiple property values.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (key = argv[optind]; key != NULL && key[0] != '-';
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire key = argv[++optind]) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (key[0] == '\0')
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire vals = malloc(sizeof (char *));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((vals[0] = strchr(key, '=')) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: Malformed name=value "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "pair %s\n"), myname, key);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire numvalues = 1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *(vals[0]) = '\0';
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (vals[0])++;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire i = optind + 1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (nk = argv[i];
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nk != NULL && nk[0] != '-';
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nk = argv[++i]) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (nk[0] == '\0')
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((keyend = strchr(nk, '='))
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: Malformed name=value "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " pair %s\n"), myname, nk);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((keylen = keyend - nk) !=
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strlen(key))
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strncmp(key, nk, keylen) == 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire vals = realloc(vals, ++numvalues
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * sizeof (char *));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire vals[numvalues - 1] = ++keyend;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nk[0] = '\0';
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire optind++;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raprop.prop_name = key;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raprop.prop_values = vals;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raprop.prop_numvalues = numvalues;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_modify_props_cb, fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &raprop) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'p':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire parseable = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire parseopt = optarg;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'R':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (chroot(optarg) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%1$s: failed to chroot to %2$s: %3$s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, optarg, strerror(errno));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire alt_root_set = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire report = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 's':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (alt_root_set) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_upgrade_cmd(opt, 1, &optarg) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire modify = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire options = optarg;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire while (*options != '\0') {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire opt_index = getsubopt(&options, v_opt, &val);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (val == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (opt_index == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%1$s: invalid variable: %2$s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, optarg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar = &ra_vars[opt_index];
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Need special case for routing-svcs var */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(ravar->var_name, RA_VAR_ROUTING_SVCS)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_update_routing_svcs(val) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_value = strdup(val);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_fmri, ravar) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire modify = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case 'u':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire update = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case ':':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* if not 'p', usage failure */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(argv[optind - 1], "-p") != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: option requires an argument -%s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, argv[optind - 1]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire parseable = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case '?':
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (argc > optind) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* There shouldn't be any extra args. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (parseable && (update || modify)) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext("%s: the -p option cannot be "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "used with any of -demrsu\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire usage();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire exit(EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (update && ! alt_root_set)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire status = ra_update();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (report && !modify && !update)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire status = ra_report(parseable, parseopt);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Upgrade legacy daemons, mark to-be-enabled routing services.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_check_legacy_daemons(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *routing_svcs = ra_str2var(RA_VAR_ROUTING_SVCS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4d = ra_str2var(RA_VAR_IPV4_ROUTING_DAEMON);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6d = ra_str2var(RA_VAR_IPV6_ROUTING_DAEMON);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *fmri, *nextfmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t mark = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_persistent_var_cb, routing_svcs->var_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* First unmark all services */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_mark_routing_svcs_cb, NULL, &mark) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire mark = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (routing_svcs->var_value != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * For routing-svcs variable, mark each named
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * service as a current-routing-svc.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((fmri = strdup(routing_svcs->var_value)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: out of memory\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Now, mark each service named in routing-svcs. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (nextfmri = strtok(fmri, " \t");
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nextfmri != NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire nextfmri = strtok(NULL, " \t")) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_mark_routing_svcs_cb, nextfmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &mark) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Now check if legacy variables (if specified) map to SMF routing
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * daemons. If so, transfer associated daemon arguments.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_upgrade_legacy_daemons() == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetvars(NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * At this point, if the legacy services still have ipv4/ipv6
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing daemons specified, we know they weren`t upgraded, so
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we mark them also.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_persistent_var_cb, v4d->var_fmri, v4d) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, v6d->var_fmri, v6d) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v4d->var_value != NULL && strtok(v4d->var_value, " \t") != NULL &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_mark_routing_svcs_cb, RA_INSTANCE_LEGACY_ROUTING_IPV4,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &mark) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v6d->var_value != NULL && strtok(v6d->var_value, " \t") != NULL &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_mark_routing_svcs_cb, RA_INSTANCE_LEGACY_ROUTING_IPV6,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &mark) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Retrieve legacy daemon variables, and check if any SMF routing daemons
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * run the daemons specified. If so, the legacy configuration (arguments
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the daemon) is transferred to the routeadm/daemon-args property
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * of the corresponding instance. From there, the instance picks up the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * value and will transfer the daemon arguments to individiual properties
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * when enabled.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_upgrade_legacy_daemons(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4d = ra_str2var(RA_VAR_IPV4_ROUTING_DAEMON);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6d = ra_str2var(RA_VAR_IPV6_ROUTING_DAEMON);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4args = ra_str2var(RA_VAR_IPV4_ROUTING_DAEMON_ARGS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6args = ra_str2var(RA_VAR_IPV6_ROUTING_DAEMON_ARGS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4stop = ra_str2var(RA_VAR_IPV4_ROUTING_STOP_CMD);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6stop = ra_str2var(RA_VAR_IPV6_ROUTING_STOP_CMD);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_persistent_var_cb, v4d->var_fmri, v4d) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, v6d->var_fmri, v6d) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, v4args->var_fmri, v4args)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, v6args->var_fmri, v6args)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, v4stop->var_fmri, v4stop)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, v6stop->var_fmri, v6stop)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_smf_cb(ra_upgrade_legacy_daemons_cb, NULL, NULL));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Determine if service runs the same daemon as that which is specified
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * in ipv4-routing-daemon or ipv6-routing-daemon. If so, the associated
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * daemon arguments are transferred to the service.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* ARGSUSED0 */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_upgrade_legacy_daemons_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *inst_fmri = wip->fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *daemon, *l_daemon = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4d = ra_str2var(RA_VAR_IPV4_ROUTING_DAEMON);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6d = ra_str2var(RA_VAR_IPV6_ROUTING_DAEMON);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4args = ra_str2var(RA_VAR_IPV4_ROUTING_DAEMON_ARGS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6args = ra_str2var(RA_VAR_IPV6_ROUTING_DAEMON_ARGS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v4stop = ra_str2var(RA_VAR_IPV4_ROUTING_STOP_CMD);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *v6stop = ra_str2var(RA_VAR_IPV6_ROUTING_STOP_CMD);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *routing_svcs = ra_str2var(RA_VAR_ROUTING_SVCS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t mark, marked;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *new_routing_svcs;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Ensure instance is a routing service, and not one of the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * legacy instances - if it is, the daemon property is already
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * set to the legacy daemon.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_single_prop_as_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON, B_TRUE, B_FALSE, NULL, &daemon) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strcmp(RA_INSTANCE_LEGACY_ROUTING_IPV4, inst_fmri) == 0 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strcmp(RA_INSTANCE_LEGACY_ROUTING_IPV6, inst_fmri) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* A legacy daemon may be defined */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) ra_get_single_prop_as_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_LEGACY_DAEMON, B_TRUE, B_FALSE, NULL, &l_daemon);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If we match daemon/legacy_daemon with ipv4-routing-daemon or
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * ipv6-routing-daemon values, transfer daemon-args value
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the matching service.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v4d->var_value != NULL && (strcmp(v4d->var_value, daemon) == 0 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (l_daemon != NULL && strcmp(v4d->var_value, l_daemon) == 0))) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf(gettext("%s: migrating daemon configuration "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "for %s to %s\n"), myname, l_daemon != NULL ?
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire l_daemon : daemon, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Transfer daemon-args value, clear legacy v4 values */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_set_prop_from_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON_ARGS, SCF_TYPE_ASTRING, B_TRUE, 1,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (const char **)&(v4args->var_value)) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetvars(RA_PROPVAL_PROTO_IPV4);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_INSTANCE_LEGACY_ROUTING_IPV4, v4d) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_INSTANCE_LEGACY_ROUTING_IPV4, v4args) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_INSTANCE_LEGACY_ROUTING_IPV4, v4stop) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else if (v6d->var_value != NULL && (strcmp(v6d->var_value, daemon)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == 0 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (l_daemon != NULL && strcmp(v6d->var_value, l_daemon) == 0))) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf(gettext("%s: migrating daemon configuration "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "for %s to %s\n"), myname, l_daemon != NULL ?
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire l_daemon : daemon, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Transfer daemon-args value, clear legacy v6 values */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_set_prop_from_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_DAEMON_ARGS, SCF_TYPE_ASTRING, B_TRUE, 1,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (const char **)&(v6args->var_value)) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetvars(RA_PROPVAL_PROTO_IPV6);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_INSTANCE_LEGACY_ROUTING_IPV6, v6d) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_INSTANCE_LEGACY_ROUTING_IPV6, v6args) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_INSTANCE_LEGACY_ROUTING_IPV6, v6stop) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If service is unmarked at this point, add it to routing-svcs and
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * mark it.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_CURR_ROUTING_SVC, B_FALSE, B_FALSE, &marked) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire marked == B_FALSE) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire mark = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_mark_routing_svcs_cb, inst_fmri, &mark)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, routing_svcs->var_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((new_routing_svcs =
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire malloc(strlen(routing_svcs->var_value) +
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strlen(inst_fmri) + 2)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: out of memory"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strlen(routing_svcs->var_value) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) snprintf(new_routing_svcs,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strlen(inst_fmri) + 1, "%s", inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) snprintf(new_routing_svcs,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strlen(routing_svcs->var_value) +
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire strlen(inst_fmri) + 2, "%s %s",
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs->var_value, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs->var_value);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs->var_value = new_routing_svcs;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_smf_cb(ra_set_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs->var_fmri, routing_svcs));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If we are upgrading, append operation to <alt_root>/var/svc/profile/upgrade.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_upgrade_cmd(char opt, int argc, char **argv)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire FILE *fp;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((fp = fopen(RA_SMF_UPGRADE_FILE, "a+")) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%1$s: failed to open %2$s: %3$s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_SMF_UPGRADE_FILE, strerror(errno));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(fp, "/sbin/routeadm -%c ", opt);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (argv != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < argc; i++)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(fp, "%s ", argv[i]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(fp, "%s\n", RA_SMF_UPGRADE_MSG);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fclose(fp);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Set current state to "next boot" state, i.e. if general/enabled
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * value is overlaid by a general_ovr/enabled value, set the current state
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the value of the latter. Doing this applies "next boot" changes to
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * the current setup. If any IPv6 interfaces are present, also start in.ndpd.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_update(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_check_legacy_daemons() == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_opts[i].opt_name != NULL; i++) {
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire if (ra_smf_cb(ra_set_current_opt_cb, ra_opts[i].opt_fmri,
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire &ra_opts[i]) == -1) {
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (-1);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire /*
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * If in.ndpd isn't already running, then we start it here, regardless
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * of global IPv6 routing status (provided there are IPv6 interfaces
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * present).
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire if (ra_numv6intfs() > 0)
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (smf_enable_instance(RA_INSTANCE_NDP, SMF_TEMPORARY));
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Here we catch the special case where ipv4/ipv6 routing was enabled,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and the user updates the routing-svcs list. The problem is that
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the enabled state is the result of services on the old routing-svcs list
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * being enabled, and we want to support users doing something like this:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s routing-svcs=route -e ipv4-routing -u
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * followed by
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * # routeadm -s routing-svcs=rdisc -u
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * To do this, we need to:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - cache the old ipv4-routing/ipv6-routing values.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - persistently disable the old routing-svcs list.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - if ipv4-routing was enabled, mark and persistently enable all the new
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * v4 routing-svcs
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * - if ipv6-routing was enabled, mark and persistently enable all the new
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * v6 routing-svcs.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This will result in the next "-u" switching on the new routing-svcs, and
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * switching off the old ones, as the user would expect.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_update_routing_svcs(char *routing_svcs_new)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt_t *v4opt = ra_str2opt(RA_OPT_IPV4_ROUTING);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt_t *v6opt = ra_str2opt(RA_OPT_IPV6_ROUTING);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *routing_svcs = ra_str2var(RA_VAR_ROUTING_SVCS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *routing_svcs_old, *fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t v4_old, v6_old, mark = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetopts();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_persistent_opt_cb, v4opt->opt_fmri, v4opt) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_opt_cb, v6opt->opt_fmri, v6opt) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_persistent_var_cb, routing_svcs->var_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire v4_old = v4opt->opt_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire v6_old = v6opt->opt_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs_old = routing_svcs->var_value;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs->var_value = routing_svcs_new;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_var_cb, routing_svcs->var_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs_old);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (!v4_old && !v6_old) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* We don`t need to do anything, since services were disabled */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs_old);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire v4opt->opt_enabled = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire v6opt->opt_enabled = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Persistently disable each old v4/v6 "routing-svc" */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (fmri = strtok(routing_svcs_old, " \t"); fmri != NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire fmri = strtok(NULL, " \t")) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_mark_routing_svcs_cb, fmri, &mark) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs_old);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v4_old &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_opt_cb, fmri, v4opt) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs_old);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v6_old &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_opt_cb, fmri, v6opt) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs_old);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(routing_svcs_old);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire v4opt->opt_enabled = v4_old;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire v6opt->opt_enabled = v6_old;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Persistently enable each new v4/v6 "routing-svc" */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire mark = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (fmri = strtok(routing_svcs_new, " \t"); fmri != NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire fmri = strtok(NULL, " \t")) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_mark_routing_svcs_cb, fmri, &mark) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v4_old &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_opt_cb, fmri, v4opt) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (v6_old &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_persistent_opt_cb, fmri, v6opt) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Display status, in parseable form if required. If param is
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * specified, only the named option/variable is displayed (this option is
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * for parseable display only).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_report(boolean_t parseable, const char *param)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *c_state, *d_state, *p_state, *p_var, *d_var;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *enabled = "enabled";
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *disabled = "disabled";
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t param_found = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (!parseable) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf(gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " Configuration Current "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "Current\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire " Option Configuration "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "System State\n"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "---------------------------------------------------"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "------------\n"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_opts[i].opt_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (param != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(ra_opts[i].opt_name, param) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire param_found = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_current_opt_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_opts[i].opt_fmri, &ra_opts[i]) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire c_state = ra_opts[i].opt_enabled ? enabled : disabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetopts();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_persistent_opt_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_opts[i].opt_fmri, &ra_opts[i]) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire p_state = ra_opts[i].opt_enabled ? enabled : disabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetopts();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_default_opt_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_opts[i].opt_default_fmri, &ra_opts[i]) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire d_state = ra_opts[i].opt_default_enabled ? enabled : disabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetopts();
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (parseable) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (param == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("%s ", ra_opts[i].opt_name);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("persistent=%s default=%s "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "current=%s\n", p_state, d_state, c_state);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf(gettext("%1$27s %2$-21s%3$s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_intloptname(ra_opts[i].opt_name),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire p_state, c_state);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (!parseable)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("\n");
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetvars(NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Gather persistent/default variable values */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_vars[i].var_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_get_persistent_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_vars[i].var_fmri, &ra_vars[i]) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_get_default_var_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_vars[i].var_default_fmri, &ra_vars[i]) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_vars[i].var_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (param != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(ra_vars[i].var_name, param) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire param_found = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire p_var = ra_vars[i].var_value == NULL ? "":
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_vars[i].var_value;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire d_var = ra_vars[i].var_default_value == NULL ?
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "": ra_vars[i].var_default_value;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (parseable) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (param == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("%s ", ra_vars[i].var_name);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("persistent=\"%s\" "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "default=\"%s\" \n", p_var, d_var);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* If daemon variables are not set, do not display. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((IS_IPV4_VAR(ra_vars[i].var_name) &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire IPV4_VARS_UNSET) ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (IS_IPV6_VAR(ra_vars[i].var_name) &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire IPV6_VARS_UNSET))
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf(gettext("%1$27s \"%2$s\"\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_intloptname(ra_vars[i].var_name), p_var);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (param != NULL && !param_found) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: no such option/variable %s\n"), myname, param);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (parseable)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf(gettext("\nRouting daemons:\n"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("\n %s %s\n", "STATE", "FMRI");
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_print_state_cb, NULL, NULL) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Call scf_walk_fmri() with appropriate function, fmri, and data.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * A NULL fmri causes scf_walk_fmri() to run on all instances. We make
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * use of this many times in applying changes to the routing services.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_smf_cb(ra_smf_cb_t cbfunc, const char *fmri, void *data)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int exit_status = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((h = scf_handle_create(SCF_VERSION)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_bind(h) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: cannot connect to SMF repository\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (scf_walk_fmri(h, fmri == NULL ? 0 : 1,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire fmri == NULL ? NULL : (char **)&fmri, 0,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire cbfunc, data, &exit_status, uu_die));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Applies persistent configuration settings to current setup.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_set_current_opt_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_set_opt_common_cb(data, wip, B_FALSE, B_FALSE));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Sets persistent value for option, to be applied on next boot
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * or by "routeadm -u".
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_set_persistent_opt_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_set_opt_common_cb(data, wip, B_TRUE, B_FALSE));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_current_opt_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_set_opt_common_cb(data, wip, B_FALSE, B_TRUE));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_persistent_opt_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_set_opt_common_cb(data, wip, B_TRUE, B_TRUE));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirestatic int
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirera_routing_opt_set_cb(void *data, scf_walkinfo_t *wip)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire{
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire return (ra_routing_opt_set_unset_cb(data, wip, B_TRUE));
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire}
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirestatic int
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirera_routing_opt_unset_cb(void *data, scf_walkinfo_t *wip)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire{
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire return (ra_routing_opt_set_unset_cb(data, wip, B_FALSE));
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire}
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire/*
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * Notify network/routing-setup service that administrator has explicitly
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * set/reset ipv4(6)-routing value. If no explicit setting of this value is
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * done, ipv4-routing can be enabled in the situation when no default route can
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * be determined.
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire */
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirestatic int
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguirera_routing_opt_set_unset_cb(raopt_t *raopt, scf_walkinfo_t *wip, boolean_t set)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire{
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire scf_instance_t *inst = wip->inst;
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire scf_handle_t *h = scf_instance_handle(inst);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire return (ra_set_boolean_prop(h, inst, RA_PG_ROUTEADM,
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire raopt->opt_flags & RA_SVC_FLAG_IPV4_ROUTING ?
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire RA_PROP_IPV4_ROUTING_SET : RA_PROP_IPV6_ROUTING_SET,
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire B_FALSE, set));
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire}
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Shared function that either sets or determines persistent or current
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * state. Setting persistent state (for next boot) involves setting
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the general_ovr/enabled value to the current service state, and
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the general/enabled value to the desired (next-boot) state.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Setting current state involves removing the temporary state
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * setting so the persistent state has effect.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Persistent state is reported as being enabled if any of the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * candidate services have a general/enabled value set to true,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * while current state is reported as being enabled if any of the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * candidate services has a general_ovr/enabled or general/enabled
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * value set to true.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_set_opt_common_cb(raopt_t *raopt, scf_walkinfo_t *wip,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t persistent, boolean_t get)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *inst_fmri = wip->fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_propertygroup_t *routeadm_pg;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t persistent_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t temporary_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t current_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t curr_svc = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t found_proto;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char **protolist = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i, ret, numvalues = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Ensure we are dealing with a routeadm-managed service. If
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the FMRI used for walking instances is NULL, it is reasonable
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * that a service not have a routeadm property group as we will
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * check all services in this case.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_pg(h, inst, RA_PG_ROUTEADM, B_TRUE, raopt->opt_fmri != NULL,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &routeadm_pg) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Not a routing service, not an error. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_fmri == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_pg_destroy(routeadm_pg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Services with no "protocol" property are not routing daemons */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (raopt->opt_fmri == NULL && ra_get_prop_as_string(h, inst,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PG_ROUTEADM, RA_PROP_PROTO, B_TRUE, B_FALSE, NULL, &numvalues,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &protolist) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Skip invalid services based on flag settings. Flags are used when
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we run callback functions on all instances to identify
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the correct instances to operate on.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (raopt->opt_flags & RA_SVC_FLAG_IPV4_ROUTING) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire found_proto = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (protolist != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Check if protolist contains "ipv4" */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < numvalues; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (protolist[i] != NULL && strcmp(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire protolist[i], RA_PROPVAL_PROTO_IPV4) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire found_proto = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* If not an ipv4 routing service, skip. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (protolist == NULL || !found_proto) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (raopt->opt_flags & RA_SVC_FLAG_IPV6_ROUTING) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire found_proto = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (protolist != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Check if protolist contains "ipv6" */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < numvalues; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (protolist[i] != NULL && strcmp(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire protolist[i], RA_PROPVAL_PROTO_IPV6) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire found_proto = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* If not an ipv6 routing service, skip. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (protolist == NULL || !found_proto) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire /*
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * If no IPv6 interfaces are configured, do not apply
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * the "enable" state change to this IPv6 routing service.
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire if (raopt->opt_enabled && ra_numv6intfs() < 1)
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* If enabling routing services, select only current routing services */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (raopt->opt_fmri == NULL && !get && raopt->opt_enabled) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_CURR_ROUTING_SVC, B_FALSE, B_FALSE,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &curr_svc) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (!curr_svc && persistent) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * We apply "current" routing changes to all routing
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * daemons, whether current or not, so bail if
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we are trying to make a persistent update to a
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * non-"routing-svc".
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_boolean_prop(h, inst, SCF_PG_GENERAL, SCF_PROPERTY_ENABLED,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE, B_TRUE, &persistent_state_enabled) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire current_state_enabled = persistent_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_boolean_prop(h, inst, SCF_PG_GENERAL_OVR,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire SCF_PROPERTY_ENABLED, B_FALSE, B_FALSE, &temporary_state_enabled)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire current_state_enabled = temporary_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (get) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Persistent state is enabled if any services are
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * persistently enabled, i.e. general/enabled == true).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * current state is enabled if any services
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * services are currently enabled, i.e. if defined,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * general_ovr/enabled == true, if not, general/enabled == true.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (persistent)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled = raopt->opt_enabled ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire persistent_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled = raopt->opt_enabled ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire current_state_enabled;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (persistent) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * For peristent state changes, from -e/-d,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * we set the general_ovr/enabled value to the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * current state (to ensure it is preserved),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * while setting the general/enabled value to
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the desired value. This has the effect of
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the desired value coming into effect on next boot.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = current_state_enabled ?
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire smf_enable_instance(inst_fmri, SMF_TEMPORARY) :
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire smf_disable_instance(inst_fmri, SMF_TEMPORARY);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ret != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: unexpected libscf error: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Refresh here so general_ovr/enabled state overrides
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * general/enabled state.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Now we can safely set the general/enabled value
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to the value we require on next boot (or
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * "routeadm -u").
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = ra_set_boolean_prop(h, inst, SCF_PG_GENERAL,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire SCF_PROPERTY_ENABLED, B_FALSE, raopt->opt_enabled);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ret != 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Refresh here so general/enabled value is set.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (raopt->opt_fmri != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(RA_INSTANCE_ROUTING_SETUP);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire /*
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * Refresh here to get latest property values prior
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * to starting daemon.
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire */
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire (void) smf_refresh_instance(inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * For current changes (result of -u), we
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * enable/disable depending on persistent value
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * stored in general/enabled. Here we disable
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * old routing-svcs (identified by a current-routing-svc
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * value of false) also.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = persistent_state_enabled && curr_svc ?
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire smf_enable_instance(inst_fmri, 0) :
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire smf_disable_instance(inst_fmri, 0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ret != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: unexpected libscf error: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire if (current_state_enabled && persistent_state_enabled) {
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire /*
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * Instance was already enabled, so we restart
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * to get latest property values. This covers
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * the case where users update properties
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * via routeadm -m, and issue an update. The
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * daemon should be running with the latest
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire * property values.
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire */
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire (void) smf_restart_instance(inst_fmri);
8b4b8c9c5a115c22996e3ce0052d46294eef7175amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_set_default_opt_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt_t *raopt = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_set_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_default_prop, B_FALSE, raopt->opt_default_enabled));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_default_opt_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt_t *raopt = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_default_prop, B_TRUE, B_TRUE,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &(raopt->opt_default_enabled)));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Callbacks to set/retrieve persistent/default routing variable values.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * The set functions use the value stored in the var_value/var_default_value
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * field of the associated ra_var_t, while the retrieval functions store
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the value retrieved in that field.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_persistent_var_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *ravar = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_single_prop_as_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_prop, B_TRUE, B_TRUE, NULL, &ravar->var_value));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_set_persistent_var_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *ravar = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_set_prop_from_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_prop, SCF_TYPE_INVALID, B_FALSE, 1,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (const char **)&ravar->var_value));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_default_var_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *ravar = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_get_single_prop_as_string(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_default_prop, B_TRUE, B_TRUE, NULL,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &ravar->var_default_value));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Depending on the value of the boolean_t * passed in, this callback
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * either marks the relevant service(s) as current-routing-svcs (or unmarking)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * by setting that property to true or false. When routing services
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * are to be enabled, the a current-routing-svc value of true flags the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * service as one to be enabled.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_mark_routing_svcs_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t *mark = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t marked;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int numvalues = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char **protolist = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Check we are dealing with a routing daemon service */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_prop_as_string(h, inst, RA_PG_ROUTEADM, RA_PROP_PROTO,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_TRUE, B_FALSE, NULL, &numvalues, &protolist) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (*mark)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_set_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_CURR_ROUTING_SVC, B_TRUE, B_TRUE));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Unmark service. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_CURR_ROUTING_SVC, B_TRUE, B_FALSE, &marked) == 0 && marked)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_set_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_CURR_ROUTING_SVC, B_TRUE, B_FALSE));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * List property values for all properties in the "routing" property
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * group of the routing service instance.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* ARGSUSED0 */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_list_props_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *inst_fmri = wip->fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_t *propiter, *valiter;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_propertygroup_t *pg;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_t *prop;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_t *val;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char **protolist = NULL, *pnamebuf, *valbuf;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ssize_t pnamelen, vallen;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int numvalues = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int propiterret, valiterret, retval = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Services with no "protocol" property are not routing daemons */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_prop_as_string(h, inst, RA_PG_ROUTEADM, RA_PROP_PROTO,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_TRUE, B_FALSE, NULL, &numvalues, &protolist) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: %s is not a routing daemon service\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: unexpected libscf error: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_pg(h, inst, RA_PG_ROUTING, B_TRUE, B_FALSE, &pg) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("%s: no %s property group for %s\n",
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_PG_ROUTING, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: unexpected libscf error: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("%s:\n", inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Create an iterator to walk through all properties */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((propiter = scf_iter_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (prop = scf_property_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_pg_properties(propiter, pg) != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ("%s: could not iterate through properties for %s: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, inst_fmri, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire while ((propiterret = scf_iter_next_property(propiter, prop)) == 1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((pnamelen = scf_property_get_name(prop, NULL, 0) + 1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext("%s: could not retrieve "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "property name for instance %s: %s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire inst_fmri, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((pnamebuf = malloc(pnamelen)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: out of memory\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) scf_property_get_name(prop, pnamebuf,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire pnamelen);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("\t%s = ", pnamebuf);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((valiter = scf_iter_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (val = scf_value_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_property_values(valiter, prop)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ("%s: could not iterate through "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "properties for %s: %s\n"), myname, inst_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_destroy(val);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_destroy(valiter);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(pnamebuf);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire while ((valiterret = scf_iter_next_value(valiter, val)) == 1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((vallen = scf_value_get_as_string
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (val, NULL, 0) + 1) == 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ("%s: could not retrieve "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "property value for instance %s, "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "property %s: %s\n"), myname, inst_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire pnamebuf, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else if ((valbuf = malloc(vallen)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: out of memory\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (retval == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_destroy(valiter);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_destroy(val);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(pnamebuf);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) scf_value_get_as_string(val, valbuf, vallen);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("%s ", valbuf);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(valbuf);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("\n");
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_destroy(valiter);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_destroy(val);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(pnamebuf);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (valiterret == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: could not iterate through"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "properties for %s: %s\n"), myname, inst_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireout:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_destroy(propiter);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_destroy(prop);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_pg_destroy(pg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (propiterret == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ("%s: could not iterate through properties for %s: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, inst_fmri, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (retval);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Modify property with name stored in passed-in ra_prop_t to have
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the assocatied values. Only works for existing properties in
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * the "routing" property group for routing daemon services, so all
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing daemons should place configurable options in that group.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_modify_props_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *inst_fmri = wip->fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_prop_t *raprop = data;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int numvalues = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char **protolist = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Services with no "protocol" property are not routing daemons */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_prop_as_string(h, inst, RA_PG_ROUTEADM, RA_PROP_PROTO,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_TRUE, B_FALSE, NULL, &numvalues, &protolist) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: %s is not a routing daemon service\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: unexpected libscf error: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_set_prop_from_string(h, inst, RA_PG_ROUTING, raprop->prop_name,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire SCF_TYPE_INVALID, B_FALSE, raprop->prop_numvalues,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (const char **)raprop->prop_values) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Display FMRI, state for each routing daemon service.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* ARGSUSED0 */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_print_state_cb(void *data, scf_walkinfo_t *wip)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *inst_fmri = wip->fmri;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = wip->inst;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = scf_instance_handle(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *inst_state, **protolist = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int numvalues = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Ensure service is a routing daemon */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_prop_as_string(h, inst, RA_PG_ROUTEADM, RA_PROP_PROTO,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_TRUE, B_FALSE, NULL, &numvalues, &protolist) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, protolist);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((inst_state = smf_get_state(inst_fmri)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%s: could not retrieve state for %s: %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, inst_fmri, scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) printf("%27s %2s\n", inst_state, inst_fmri);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(inst_state);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_pg(scf_handle_t *h, scf_instance_t *inst, const char *pgname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t composed, boolean_t required, scf_propertygroup_t **pg)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Retrieve (possibly composed) property group for instance */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((*pg = scf_pg_create(h)) == NULL || (composed &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_get_pg_composed(inst, NULL, pgname, *pg) != 0) ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (!composed && scf_instance_get_pg(inst, pgname, *pg) != 0)) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (required)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: no such property group %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, pgname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (required)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: unexpected libscf error: %s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_boolean_prop(scf_handle_t *h, scf_instance_t *inst,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *pgname, const char *propname, boolean_t composed,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t required, boolean_t *val)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *valstr;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_single_prop_as_string(h, inst, pgname, propname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire composed, required, NULL, &valstr) != 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *val = strcmp(valstr, RA_PROPVAL_BOOLEAN_TRUE) == 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(valstr);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_single_prop_as_string(scf_handle_t *h, scf_instance_t *inst,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *pgname, const char *propname, boolean_t composed,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t required, scf_type_t *type, char **value)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char **values;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int numvalues = 1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_prop_as_string(h, inst, pgname, propname, composed, required,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire type, &numvalues, &values) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *value = values[0];
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(values);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Retrieve property named in propname, possibly using the composed
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * property group view (union of instance and service-level properties,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * where instance-level properties override service-level values).
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_get_prop_as_string(scf_handle_t *h, scf_instance_t *inst,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *pgname, const char *propname, boolean_t composed,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t required, scf_type_t *type, int *numvalues, char ***values)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_propertygroup_t *pg = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_t *prop = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_t *valiter = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_t *val = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ssize_t vallen = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int valiterret, i, numvalues_retrieved, ret = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_pg(h, inst, pgname, composed, required, &pg) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *values = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Retrieve values. All values routeadm needs to retrieve
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * (bar those gathered by routeadm -l), are known to be single-valued.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((prop = scf_property_create(h)) == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_pg_get_property(pg, propname, prop) != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *numvalues = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (required)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: property %s/%s not found\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, pgname, propname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((val = scf_value_create(h)) == NULL &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_get_value(prop, val) != 0 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (valiter = scf_iter_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_property_values(valiter, prop) != 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* retrieve each value */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (numvalues_retrieved = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (valiterret = scf_iter_next_value(valiter, val)) == 1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire numvalues_retrieved++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((vallen = scf_value_get_as_string
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (val, NULL, 0) + 1) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((*values = realloc(*values,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire sizeof (*values) + sizeof (char *))) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ((*values)[numvalues_retrieved] = malloc(vallen)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: out of memory\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) scf_value_get_as_string(val,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (*values)[numvalues_retrieved], vallen);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (valiterret == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * if *numvalues != 0, it holds expected number of values. If a
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * different number are found, it is an error.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (*numvalues != 0 && *numvalues != numvalues_retrieved) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: got %d values for property %s/%s, expected %d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, numvalues_retrieved, pgname, propname, *numvalues);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire *numvalues = numvalues_retrieved;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Retrieve property type if required. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (type != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) scf_property_type(prop, type);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireerror:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: property %s not found"), myname, propname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: unexpected libscf error: %s, "), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < numvalues_retrieved; i++)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free((*values)[i]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (*values != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(*values);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireout:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (val != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_destroy(val);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (valiter != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_iter_destroy(valiter);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (prop != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_destroy(prop);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (pg != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_pg_destroy(pg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ret);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_free_prop_values(int numvalues, char **values)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (values != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < numvalues; i++)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(values[i]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(values);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_set_boolean_prop(scf_handle_t *h, scf_instance_t *inst, const char *pgname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *prop, boolean_t create, boolean_t propval)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *val = propval ? RA_PROPVAL_BOOLEAN_TRUE :
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROPVAL_BOOLEAN_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ra_set_prop_from_string(h, inst, pgname, prop, SCF_TYPE_BOOLEAN,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire create, 1, &val));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Set the property named in propname to the values passed in in the propvals
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * array. Only create a new property if "create" is true.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_set_prop_from_string(scf_handle_t *h, scf_instance_t *inst,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire const char *pgname, const char *propname, scf_type_t proptype,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t create, int numpropvals, const char **propvals)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_propertygroup_t *instpg = NULL, *cpg = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_type_t oldproptype, newproptype = proptype;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_t *prop = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_t **values = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_transaction_t *tx = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_transaction_entry_t *ent = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t new = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i, retval, numvalues = 0, ret = 0;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *pgtype = NULL, **ovalues;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ssize_t typelen;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Firstly, does property exist? If not, and create is false, bail */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_prop_as_string(h, inst, pgname, propname, B_TRUE,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire B_FALSE, &oldproptype, &numvalues, &ovalues) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() != SCF_ERROR_NOT_FOUND)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (!create) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: no such property %s/%s\n"), myname, pgname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire propname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_free_prop_values(numvalues, ovalues);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Use old property type */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (proptype == SCF_TYPE_INVALID)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire newproptype = oldproptype;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Does property group exist at instance level? If not, we need to
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * create it, since the composed view of the property group did
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * contain the property. We never modify properties at the service
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * level, as it`s possible that multiple instances will inherit those
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * settings.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_pg(h, inst, pgname, B_FALSE, B_FALSE, &instpg) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() != SCF_ERROR_NOT_FOUND)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Ensure pg exists at service level, get composed pg */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_pg(h, inst, pgname, B_TRUE, B_FALSE, &cpg) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Create instance-level property group */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((typelen = scf_pg_get_type(cpg, NULL, 0) + 1) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((pgtype = malloc(typelen)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: out of memory\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) scf_pg_get_type(cpg, pgtype, typelen);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((instpg = scf_pg_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_add_pg(inst, pgname, pgtype, 0, instpg)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: could not create property group %s\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, pgname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((prop = scf_property_create(h)) == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((values = calloc(numpropvals, sizeof (scf_value_t *))) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext("%s: out of memory"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_pg_get_property(instpg, propname, prop) != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* New property? */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_error() == SCF_ERROR_NOT_FOUND)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire new = B_TRUE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((tx = scf_transaction_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (ent = scf_entry_create(h)) == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireretry:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_transaction_start(tx, instpg) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (new) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_transaction_property_new(tx, ent, propname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire newproptype) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else if (scf_transaction_property_change(tx, ent, propname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire newproptype) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < numpropvals; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((values[i] = scf_value_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_set_from_string(values[i], newproptype,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire propvals[i] == NULL ? "": propvals[i]) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_entry_add_value(ent, values[i]) != 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire retval = scf_transaction_commit(tx);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (retval == 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_transaction_reset(tx);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (scf_pg_update(instpg) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto retry;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (retval == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto error;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireerror:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire switch (scf_error()) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case SCF_ERROR_INVALID_ARGUMENT:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: invalid value for property %s/%s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire pgname, propname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire case SCF_ERROR_NOT_FOUND:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: no such property %s/%s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire pgname, propname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire default:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: unexpected libscf error: %s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireout:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (tx != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_transaction_destroy(tx);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ent != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_entry_destroy(ent);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (values != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; i < numpropvals; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (values[i] != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_value_destroy(values[i]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(values);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (prop != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_property_destroy(prop);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (cpg != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_pg_destroy(cpg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (instpg != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_pg_destroy(instpg);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (pgtype != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(pgtype);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ret);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This function gathers configuration from the legacy /etc/inet/routing.conf,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * if any, and sets the appropriate variable values accordingly. Once
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * these are set, the legacy daemons are checked to see if they have
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * SMF counterparts (ra_check_legacy_daemons()). If they do, the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * configuration is upgraded. Finally, the legacy option settings are
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * applied, enabling/disabling the routing/forwarding services as
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * appropriate.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_upgrade_from_legacy_conf(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_t *h = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_t *inst = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int ret = 0, i, r;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire boolean_t old_conf_read;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *routing_svcs = ra_str2var(RA_VAR_ROUTING_SVCS);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * First, determine if we have already upgraded - if "routing-conf-read"
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * is true, we bail. The use of a boolean property indicating if
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing.conf has been read and applied might seem a lot more
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * work than simply copying routing.conf aside, but leaving the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * file in place allows users to downgrade and have their old
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * routing configuration still in place.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((h = scf_handle_create(SCF_VERSION)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_bind(h) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: cannot connect to SMF repository\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((inst = scf_instance_create(h)) == NULL ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_decode_fmri(h, RA_INSTANCE_ROUTING_SETUP,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire NULL, NULL, inst, NULL, NULL, SCF_DECODE_FMRI_EXACT) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext(
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "%s: unexpected libscf error: %s\n"), myname,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_strerror(scf_error()));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_get_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_ROUTING_CONF_READ, B_TRUE, B_TRUE, &old_conf_read) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (old_conf_read)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Now set "routing-conf-read" to true so we don`t reimport legacy
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * configuration again.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_set_boolean_prop(h, inst, RA_PG_ROUTEADM,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire RA_PROP_ROUTING_CONF_READ, B_FALSE, B_TRUE) == -1)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) smf_refresh_instance(RA_INSTANCE_ROUTING_SETUP);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_resetvars(NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* First, gather values from routing.conf */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((r = ra_parseconf()) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* No routing.conf file found */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (r == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Now, set the options/variables gathered. We set variables first,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * as we cannot enable routing before we determine the daemons
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * to enable.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_vars[i].var_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Skip routing-svcs var, not featured in legacy config */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(ra_vars[i].var_name, RA_VAR_ROUTING_SVCS) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_var_cb, ra_vars[i].var_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &(ra_vars[i])) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Clear routing-svcs value */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_var_cb, routing_svcs->var_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire routing_svcs) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_check_legacy_daemons() == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire goto out;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_opts[i].opt_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_smf_cb(ra_set_persistent_opt_cb, ra_opts[i].opt_fmri,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire &(ra_opts[i])) == -1 ||
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_smf_cb(ra_set_default_opt_cb,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_opts[i].opt_default_fmri, &(ra_opts[i])) == -1) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ret = -1;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguireout:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (inst != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_instance_destroy(inst);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (h != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire scf_handle_destroy(h);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (ret);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire/*
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire *
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * Return the number of IPv6 addresses configured. This answers the
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * generic question, "is IPv6 configured?". We only start in.ndpd if IPv6
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * is configured, and we also only enable IPv6 routing daemons if IPv6 is
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire * enabled.
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire */
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguirestatic int
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguirera_numv6intfs(void)
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire{
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire static int num = -1;
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire int ipsock;
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire struct lifnum lifn;
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire if (num != -1)
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (num);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire if ((ipsock = socket(PF_INET6, SOCK_DGRAM, 0)) == -1) {
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire (void) fprintf(stderr,
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire gettext("%1$s: unable to open %2$s: %3$s\n"),
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire myname, IP_DEV_NAME, strerror(errno));
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (0);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire }
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire lifn.lifn_family = AF_INET6;
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire lifn.lifn_flags = 0;
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire if (ioctl(ipsock, SIOCGLIFNUM, &lifn) == -1) {
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire (void) close(ipsock);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (0);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire }
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire (void) close(ipsock);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire return (num = lifn.lifn_count);
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire}
ceb97a6a3232437e1f0b4c6b8604bc1b4245ccc5amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Parse the configuration file and fill the ra_opts array with opt_value
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * and opt_default_value values, and the ra_vars array with var_value and
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * var_default_value values. Then copy aside routing.conf so it will not
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * be read by future invokations of routeadm.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_parseconf(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire FILE *fp;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire uint_t lineno;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char line[RA_MAX_CONF_LINE];
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire char *cp, *confstr;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt_t *raopt;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar_t *ravar;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((fp = fopen(RA_CONF_FILE, "r")) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * There's no config file, so we simply return as there
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * is no work to do.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (lineno = 1; fgets(line, sizeof (line), fp) != NULL; lineno++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (line[strlen(line) - 1] == '\n')
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire line[strlen(line) - 1] = '\0';
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire cp = line;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Skip leading whitespace */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire while (isspace(*cp))
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire cp++;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /* Skip comment lines and empty lines */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (*cp == '#' || *cp == '\0')
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Anything else must be of the form:
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * <option> <value> <default_value>
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((confstr = strtok(cp, " ")) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%1$s: %2$s: invalid entry on line %3$d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_CONF_FILE, lineno);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((raopt = ra_str2opt(confstr)) != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_parseopt(confstr, lineno, raopt) != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fclose(fp);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else if ((ravar = ra_str2var(confstr)) != NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_parsevar(confstr, ravar) != 0) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fclose(fp);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire } else {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%1$s: %2$s: invalid option name on "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "line %3$d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_CONF_FILE, lineno);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fclose(fp);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_parseopt(char *confstr, int lineno, raopt_t *raopt)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire oval_t oval, d_oval;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((confstr = strtok(NULL, " ")) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%1$s: %2$s: missing value on line %3$d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_CONF_FILE, lineno);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((oval = ra_str2oval(confstr)) == OPT_INVALID) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%1$s: %2$s: invalid option "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "value on line %3$d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_CONF_FILE, lineno);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (oval != OPT_DEFAULT)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled = oval == OPT_ENABLED;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((confstr = strtok(NULL, " ")) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%1$s: %2$s: missing revert "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "value on line %3$d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_CONF_FILE, lineno);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((d_oval = ra_str2oval(confstr)) == OPT_INVALID) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr,
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire gettext("%1$s: %2$s: invalid revert "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "value on line %3$d\n"),
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire myname, RA_CONF_FILE, lineno, confstr);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_default_enabled = d_oval == OPT_ENABLED;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (oval == OPT_DEFAULT)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire raopt->opt_enabled = d_oval == OPT_ENABLED;
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire /*
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * Set ipv4(6)-routing-set property as appropriate on upgrading
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * routing.conf. If option was default, set this value to false,
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * as this indicates the administrator has not explicitly enabled
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * or disabled ipv4(6)-routing. The ipv4-routing-set value is used
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * in the routing-setup service, and if it is false, ipv4-routing
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire * is enabled in the case where no default route can be determined.
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire */
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire if (raopt->opt_flags & (RA_SVC_FLAG_IPV4_ROUTING |
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire RA_SVC_FLAG_IPV6_ROUTING)) {
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire if (ra_smf_cb(oval == OPT_DEFAULT ? ra_routing_opt_unset_cb :
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire ra_routing_opt_set_cb, raopt->opt_default_fmri, raopt)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire == -1)
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire return (-1);
ef2c19a1d5242688ccc42f46886fcc495f8e1141amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic int
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_parsevar(char *confstr, ravar_t *ravar)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire confstr = strtok(NULL, "=");
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (confstr == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * This isn't an error condition, it simply means that the
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * variable has no value.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ravar->var_value = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if ((ravar->var_value = strdup(confstr)) == NULL) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire (void) fprintf(stderr, gettext("%s: "
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire "unable to allocate memory\n"), myname);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (-1);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (0);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/* Convert a string to an option value. */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic oval_t
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_str2oval(const char *valstr)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(valstr, "enabled") == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (OPT_ENABLED);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(valstr, "disabled") == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (OPT_DISABLED);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(valstr, "default") == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (OPT_DEFAULT);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (OPT_INVALID);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic raopt_t *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_str2opt(const char *optnamestr)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_opts[i].opt_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(optnamestr, ra_opts[i].opt_name) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_opts[i].opt_name == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (&ra_opts[i]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Reset all option values previously gathered to B_FALSE.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_resetopts(void)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_opts[i].opt_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_opts[i].opt_enabled = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_opts[i].opt_default_enabled = B_FALSE;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic ravar_t *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_str2var(const char *varnamestr)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_vars[i].var_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(varnamestr, ra_vars[i].var_name) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire break;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_vars[i].var_name == NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (&ra_vars[i]);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Reset variable values previously gathered to NULL.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic void
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_resetvars(const char *proto)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire int i;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire for (i = 0; ra_vars[i].var_name != NULL; i++) {
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (proto != NULL &&
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire !VAR_PROTO_MATCH(ra_vars[i].var_name, proto))
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire continue;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_vars[i].var_value != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(ra_vars[i].var_value);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_vars[i].var_value = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (ra_vars[i].var_default_value != NULL)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire free(ra_vars[i].var_default_value);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire ra_vars[i].var_default_value = NULL;
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire }
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire/*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * Given an option name, this function provides an internationalized, human
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * readable version of the option name.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirestatic char *
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguirera_intloptname(const char *optname)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire{
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire if (strcmp(optname, RA_OPT_IPV4_FORWARDING) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv4 forwarding"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_OPT_IPV4_ROUTING) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv4 routing"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_OPT_IPV6_FORWARDING) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv6 forwarding"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_OPT_IPV6_ROUTING) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv6 routing"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_IPV4_ROUTING_DAEMON) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv4 routing daemon"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_IPV4_ROUTING_DAEMON_ARGS) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv4 routing daemon args"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_IPV4_ROUTING_STOP_CMD) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv4 routing daemon stop"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_IPV6_ROUTING_DAEMON) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv6 routing daemon"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_IPV6_ROUTING_DAEMON_ARGS) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv6 routing daemon args"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_IPV6_ROUTING_STOP_CMD) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("IPv6 routing daemon stop"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire else if (strcmp(optname, RA_VAR_ROUTING_SVCS) == 0)
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (gettext("Routing services"));
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire /*
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * If we get here, there's a bug and someone should trip over this
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire * NULL pointer.
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire */
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire return (NULL);
a192e900f6d2b0e1a822e3252c0dfd795ed49d76amaguire}