1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * CDDL HEADER START
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * The contents of this file are subject to the terms of the
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Common Development and Distribution License (the "License").
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * You may not use this file except in compliance with the License.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * or http://www.opensolaris.org/os/licensing.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * See the License for the specific language governing permissions
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * and limitations under the License.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * When distributing Covered Code, include this CDDL HEADER in each
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * If applicable, add the following below this CDDL HEADER, with the
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * fields enclosed by brackets "[]" replaced with your own identifying
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * information: Portions Copyright [yyyy] [name of copyright owner]
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * CDDL HEADER END
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Use is subject to license terms.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <sys/types.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <sys/varargs.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <getopt.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <stdio.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <stdlib.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <strings.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <errno.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <locale.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <libintl.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <libvrrpadm.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou#include <ofmt.h>
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic vrrp_handle_t vrrp_vh = NULL;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoutypedef void cmd_func_t(int, char *[], const char *);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic cmd_func_t do_create, do_delete, do_enable, do_disable,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou do_modify, do_show;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoutypedef struct {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char *c_name;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou cmd_func_t *c_fn;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou const char *c_usage;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou} cmd_t;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic cmd_t cmds[] = {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { "create-router", do_create,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "-V <vrid> -l <link> -A {inet | inet6} [-p <priority>] "
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "[-i <adv_interval>] [-o <flags>] <router_name>" },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { "delete-router", do_delete, "<router_name>" },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { "enable-router", do_enable, "<router_name>" },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { "disable-router", do_disable, "<router_name>" },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { "modify-router", do_modify,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "[-p <priority>] [-i <adv_interval>] [-o <flags>] <router_name>" },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { "show-router", do_show,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "[-P | -x] [-o field[,...]] [-p] [<router_name>]" }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou};
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic const struct option lopts[] = {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"vrid", required_argument, 0, 'V'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"link", required_argument, 0, 'l'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"address_family", required_argument, 0, 'A'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"priority", required_argument, 0, 'p'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"adv_interval", required_argument, 0, 'i'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"flags", required_argument, 0, 'o'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { 0, 0, 0, 0 }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou};
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic const struct option l_show_opts[] = {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"peer", no_argument, 0, 'P'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"parsable", no_argument, 0, 'p'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"extended", no_argument, 0, 'x'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou {"output", required_argument, 0, 'o'},
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou { 0, 0, 0, 0 }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou};
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic ofmt_cb_t sfunc_vrrp_conf;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * structures for 'dladm show-link -s' (print statistics)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouenum {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_NAME,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_VRID,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_LINK,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_VNIC,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_AF,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_PRIO,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_ADV_INTV,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_MODE,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_STATE,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_PRV_STAT,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_STAT_LAST,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_PEER,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_P_PRIO,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_P_INTV,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_P_ADV_LAST,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_M_DOWN_INTV,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_PRIMARY_IP,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_VIRTUAL_IPS,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ROUTER_VIP_CNT
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou};
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * structures for 'vrrpadm show-router'
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic const ofmt_field_t show_print_fields[] = {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/* name, field width, index, callback */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "NAME", 8, ROUTER_NAME, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "VRID", 5, ROUTER_VRID, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "LINK", 8, ROUTER_LINK, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "VNIC", 8, ROUTER_VNIC, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "AF", 5, ROUTER_AF, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "PRIO", 5, ROUTER_PRIO, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "ADV_INTV", 9, ROUTER_ADV_INTV, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "MODE", 6, ROUTER_MODE, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "STATE", 6, ROUTER_STATE, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "PRV_STAT", 9, ROUTER_PRV_STAT, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "STAT_LAST", 10, ROUTER_STAT_LAST, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "PEER", 20, ROUTER_PEER, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "P_PRIO", 7, ROUTER_P_PRIO, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "P_INTV", 9, ROUTER_P_INTV, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "P_ADV_LAST", 11, ROUTER_P_ADV_LAST, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "M_DOWN_INTV", 12, ROUTER_M_DOWN_INTV, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "PRIMARY_IP", 20, ROUTER_PRIMARY_IP, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "VIRTUAL_IPS", 40, ROUTER_VIRTUAL_IPS, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ "VIP_CNT", 7, ROUTER_VIP_CNT, sfunc_vrrp_conf },
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{ NULL, 0, 0, NULL}}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic vrrp_err_t do_show_router(const char *, ofmt_handle_t);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic int str2opt(char *opts, uint32_t *, boolean_t *, boolean_t *);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic char *timeval_since_str(int, char *, size_t);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void usage();
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void warn(const char *, ...);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void err_exit(const char *, ...);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void opterr_exit(int, int, const char *);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouint
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoumain(int argc, char *argv[])
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int i;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou cmd_t *cp;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) setlocale(LC_ALL, "");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) textdomain(TEXT_DOMAIN);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (argv[1] == NULL)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou usage();
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_open(&vrrp_vh)) != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("operation failed: %s", vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou for (i = 0; i < sizeof (cmds) / sizeof (cmd_t); i++) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou cp = &cmds[i];
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (strcmp(argv[1], cp->c_name) == 0) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou cp->c_fn(argc - 1, &argv[1], cp->c_usage);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_close(vrrp_vh);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (EXIT_SUCCESS);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou usage();
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (EXIT_FAILURE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_create(int argc, char *argv[], const char *usage)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_vr_conf_t conf;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int c;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint32_t create_mask = 0, mask;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char *endp;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * default value
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou bzero(&conf, sizeof (vrrp_vr_conf_t));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_vrid = VRRP_VRID_NONE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_af = AF_UNSPEC;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_pri = VRRP_PRI_DEFAULT;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int = VRRP_MAX_ADVER_INT_DFLT;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_preempt = B_TRUE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_accept = B_TRUE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_enabled = B_TRUE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou while ((c = getopt_long(argc, argv, ":V:l:p:i:o:A:f", lopts,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou NULL)) != EOF) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou switch (c) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'l':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (strlcpy(conf.vvc_link, optarg,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou sizeof (conf.vvc_link)) >=
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou sizeof (conf.vvc_link)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid data-link name %s", optarg);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'i':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (create_mask & VRRP_CONF_INTERVAL)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-i' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou create_mask |= VRRP_CONF_INTERVAL;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int = (uint32_t)strtol(optarg, &endp, 0);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((*endp) != '\0' ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int < VRRP_MAX_ADVER_INT_MIN ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int > VRRP_MAX_ADVER_INT_MAX ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (conf.vvc_adver_int == 0 && errno != 0)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid advertisement interval");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'p':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (create_mask & VRRP_CONF_PRIORITY)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-p' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou create_mask |= VRRP_CONF_PRIORITY;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_pri = strtol(optarg, &endp, 0);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((*endp) != '\0' || conf.vvc_pri < VRRP_PRI_MIN ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_pri > VRRP_PRI_OWNER ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (conf.vvc_pri == 0 && errno != 0)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid priority");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'o':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou mask = 0;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (str2opt(optarg, &mask,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou &conf.vvc_preempt, &conf.vvc_accept) != 0) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid options: %s", optarg);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (mask & create_mask & VRRP_CONF_PREEMPT)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-o preempt' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou else if (mask & create_mask & VRRP_CONF_ACCEPT)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-o accept' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou create_mask |= mask;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'V':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf.vvc_vrid != VRRP_VRID_NONE)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-V' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_vrid = strtol(optarg, &endp, 0);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((*endp) != '\0' || conf.vvc_vrid < VRRP_VRID_MIN ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_vrid > VRRP_VRID_MAX ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (conf.vvc_vrid == 0 && errno != 0)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid VRID");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'A':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf.vvc_af != AF_UNSPEC)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-A' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (strcmp(optarg, "inet") == 0)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_af = AF_INET;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou else if (strcmp(optarg, "inet6") == 0)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_af = AF_INET6;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou else
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid address family");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou default:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou opterr_exit(optopt, c, usage);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (argc - optind > 1)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("usage: %s", gettext(usage));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (optind != argc - 1)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("VRRP name not specified");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (strlcpy(conf.vvc_name, argv[optind],
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou sizeof (conf.vvc_name)) >= sizeof (conf.vvc_name)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("Invalid router name %s", argv[optind]);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf.vvc_vrid == VRRP_VRID_NONE)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("VRID not specified");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf.vvc_af == AF_UNSPEC)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("address family not specified");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (strlen(conf.vvc_link) == 0)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("link name not specified");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (!conf.vvc_accept && conf.vvc_pri == VRRP_PRI_OWNER)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("accept_mode must be true for virtual IP owner");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudone:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_create(vrrp_vh, &conf)) == VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("create-router failed: %s", vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_delete(int argc, char *argv[], const char *use)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (argc != 2)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("usage: %s", gettext(use));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_delete(vrrp_vh, argv[1])) != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("delete-router failed: %s", vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_enable(int argc, char *argv[], const char *use)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (argc != 2)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("usage: %s", gettext(use));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_enable(vrrp_vh, argv[1])) != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("enable-router failed: %s", vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_disable(int argc, char *argv[], const char *use)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (argc != 2)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("usage: %s", gettext(use));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_disable(vrrp_vh, argv[1])) != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("disable-router failed: %s", vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_modify(int argc, char *argv[], const char *use)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_vr_conf_t conf;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint32_t modify_mask = 0, mask;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char *endp;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int c;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou while ((c = getopt_long(argc, argv, ":i:p:o:", lopts, NULL)) != EOF) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou switch (c) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'i':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (modify_mask & VRRP_CONF_INTERVAL)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-i' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou modify_mask |= VRRP_CONF_INTERVAL;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int = (uint32_t)strtol(optarg, &endp, 0);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((*endp) != '\0' ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int < VRRP_MAX_ADVER_INT_MIN ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_adver_int > VRRP_MAX_ADVER_INT_MAX ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (conf.vvc_adver_int == 0 && errno != 0)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid advertisement interval");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'o':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou mask = 0;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (str2opt(optarg, &mask, &conf.vvc_preempt,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou &conf.vvc_accept) != 0) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("Invalid options");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (mask & modify_mask & VRRP_CONF_PREEMPT)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-o preempt' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou else if (mask & modify_mask & VRRP_CONF_ACCEPT)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-o accept' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou modify_mask |= mask;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'p':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (modify_mask & VRRP_CONF_PRIORITY)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("duplicate '-p' option");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou modify_mask |= VRRP_CONF_PRIORITY;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_pri = strtol(optarg, &endp, 0);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((*endp) != '\0' || conf.vvc_pri < VRRP_PRI_MIN ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_pri > VRRP_PRI_OWNER ||
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (conf.vvc_pri == 0 && errno != 0)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid priority");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou default:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou opterr_exit(optopt, c, use);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (argc - optind > 1)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("usage: %s", gettext(use));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (optind != argc - 1)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("VRRP name not specified.");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (strlcpy(conf.vvc_name, argv[optind], sizeof (conf.vvc_name)) >=
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou sizeof (conf.vvc_name)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("invalid router name %s", argv[optind]);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((modify_mask & VRRP_CONF_ACCEPT) && !conf.vvc_accept &&
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (modify_mask & VRRP_CONF_PRIORITY) &&
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf.vvc_pri == VRRP_PRI_OWNER) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("accept_mode must be true for virtual IP owner");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (modify_mask == 0)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou usage();
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err = vrrp_modify(vrrp_vh, &conf, modify_mask);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (err != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("modify-router failed: %s", vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * 'show-router' one VRRP router.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic vrrp_err_t
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_show_router(const char *vn, ofmt_handle_t ofmt)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_queryinfo_t *vq;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_query(vrrp_vh, vn, &vq)) != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (err);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ofmt_print(ofmt, vq);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou free(vq);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (VRRP_SUCCESS);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudo_show(int argc, char *argv[], const char *use)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int c;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char *fields_str = NULL;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char *names = NULL, *router;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint32_t i, in_cnt = 0, out_cnt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ofmt_status_t oferr;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ofmt_handle_t ofmt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint_t ofmt_flags = 0;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_err_t err = VRRP_SUCCESS;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou boolean_t P_opt, x_opt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou static char *dft_fields_str =
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "NAME,VRID,LINK,AF,PRIO,ADV_INTV,MODE,STATE,VNIC";
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou static char *ext_fields_str =
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "NAME,STATE,PRV_STAT,STAT_LAST,VNIC,PRIMARY_IP,VIRTUAL_IPS";
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou static char *peer_fields_str =
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "NAME,PEER,P_PRIO,P_INTV,P_ADV_LAST,M_DOWN_INTV";
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * If parsable output is requested, add VIP_CNT into the output
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * for extended output. It is not needed for human-readable
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * output as it is obvious from the VIRTUAL_IPS list.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou static char *ext_parsable_fields_str =
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "NAME,STATE,PRV_STAT,STAT_LAST,VNIC,PRIMARY_IP,VIP_CNT,"
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "VIRTUAL_IPS";
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou P_opt = x_opt = B_FALSE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou fields_str = dft_fields_str;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou while ((c = getopt_long(argc, argv, ":Pxpo:", l_show_opts,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou NULL)) != EOF) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou switch (c) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'o':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou fields_str = optarg;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'p':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ofmt_flags |= OFMT_PARSABLE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'P':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou P_opt = B_TRUE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou fields_str = peer_fields_str;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case 'x':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou x_opt = B_TRUE;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou fields_str = ext_fields_str;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou default:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou opterr_exit(optopt, c, use);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (x_opt && P_opt)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("incompatible -P and -x options");
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * If parsable output is requested, add VIP_CNT into the output
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * for extended output.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((ofmt_flags & OFMT_PARSABLE) && (fields_str == ext_fields_str))
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou fields_str = ext_parsable_fields_str;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((oferr = ofmt_open(fields_str, show_print_fields, ofmt_flags,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou 0, &ofmt)) != OFMT_SUCCESS) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char buf[OFMT_BUFSIZE];
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * If some fields were badly formed in human-friendly mode, we
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * emit a warning and continue. Otherwise exit immediately.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) ofmt_strerror(ofmt, oferr, buf, sizeof (buf));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (oferr != OFMT_EBADFIELDS || (ofmt_flags & OFMT_PARSABLE)) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ofmt_close(ofmt);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit(buf);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou } else {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou warn(buf);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /* Show one router */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (optind == argc - 1) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err = do_show_router(argv[optind], ofmt);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou goto done;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Show all routers. First set in_cnt to 0 to find out the number
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * of vrrp routers.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouagain:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((in_cnt != 0) && (names = malloc(in_cnt * VRRP_NAME_MAX)) == NULL) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err = VRRP_ENOMEM;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou goto done;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou out_cnt = in_cnt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if ((err = vrrp_list(vrrp_vh, VRRP_VRID_NONE, NULL, AF_UNSPEC,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou &out_cnt, names)) != VRRP_SUCCESS) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou free(names);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou goto done;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * The VRRP routers has been changed between two vrrp_list()
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * calls, try again.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (out_cnt > in_cnt) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou in_cnt = out_cnt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou free(names);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou goto again;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Each VRRP router name is separated by '\0`
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou router = names;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou for (i = 0; i < in_cnt; i++) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) do_show_router(router, ofmt);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou router += strlen(router) + 1;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou free(names);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoudone:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou ofmt_close(ofmt);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (err != VRRP_SUCCESS)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit(vrrp_err2str(err));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Callback function to print fields of the configuration information.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic boolean_t
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhousfunc_vrrp_conf(ofmt_arg_t *ofmtarg, char *buf, uint_t bufsize)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_queryinfo_t *qinfo = ofmtarg->ofmt_cbarg;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint_t ofmtid = ofmtarg->ofmt_id;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_vr_conf_t *conf = &qinfo->show_vi;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_stateinfo_t *sinfo = &qinfo->show_vs;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_peer_t *peer = &qinfo->show_vp;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_timerinfo_t *tinfo = &qinfo->show_vt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_addrinfo_t *ainfo = &qinfo->show_va;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou switch (ofmtid) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_NAME:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%s", conf->vvc_name);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_VRID:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", conf->vvc_vrid);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_LINK:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%s", conf->vvc_link);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_AF:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "IPv%d",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou conf->vvc_af == AF_INET ? 4 : 6);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_PRIO:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", conf->vvc_pri);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_ADV_INTV:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", conf->vvc_adver_int);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_MODE:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) strlcpy(buf, "-----", bufsize);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf->vvc_enabled)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf[0] = 'e';
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf->vvc_pri == VRRP_PRI_OWNER)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf[1] = 'o';
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf->vvc_preempt)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf[2] = 'p';
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (conf->vvc_accept)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf[3] = 'a';
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_STATE:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%s",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_state2str(sinfo->vs_state));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_PRV_STAT:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%s",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_state2str(sinfo->vs_prev_state));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_STAT_LAST:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) timeval_since_str(tinfo->vt_since_last_tran, buf,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou bufsize);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_PEER:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /* LINTED E_CONSTANT_CONDITION */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou VRRPADDR2STR(conf->vvc_af, &peer->vp_addr,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf, bufsize, B_FALSE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_P_PRIO:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", peer->vp_prio);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_P_INTV:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", peer->vp_adver_int);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_P_ADV_LAST:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) timeval_since_str(tinfo->vt_since_last_adv, buf,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou bufsize);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_M_DOWN_INTV:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", tinfo->vt_master_down_intv);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_VNIC:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%s",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou strlen(ainfo->va_vnic) == 0 ? "--" : ainfo->va_vnic);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_PRIMARY_IP:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /* LINTED E_CONSTANT_CONDITION */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou VRRPADDR2STR(conf->vvc_af, &ainfo->va_primary,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf, bufsize, B_FALSE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_VIRTUAL_IPS: {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint32_t i;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou for (i = 0; i < ainfo->va_vipcnt; i++) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou /* LINTED E_CONSTANT_CONDITION */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou VRRPADDR2STR(conf->vvc_af, &(ainfo->va_vips[i]),
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou buf, bufsize, B_TRUE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (i != ainfo->va_vipcnt - 1)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) strlcat(buf, ",", bufsize);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ROUTER_VIP_CNT:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(buf, bufsize, "%d", ainfo->va_vipcnt);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou default:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (B_FALSE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (B_TRUE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouusage()
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int i;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou cmd_t *cp;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) fprintf(stderr, "%s",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou gettext("usage: vrrpadm <sub-command> <args> ...\n"));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou for (i = 0; i < sizeof (cmds) / sizeof (cmd_t); i++) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou cp = &cmds[i];
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (cp->c_usage != NULL)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) fprintf(stderr, " %-10s %s\n",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou gettext(cp->c_name), gettext(cp->c_usage));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_close(vrrp_vh);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou exit(EXIT_FAILURE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouwarn(const char *format, ...)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou va_list alist;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou format = gettext(format);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) fprintf(stderr, gettext("warning: "));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou va_start(alist, format);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) vfprintf(stderr, format, alist);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou va_end(alist);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) putc('\n', stderr);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouerr_exit(const char *format, ...)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou va_list alist;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou format = gettext(format);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou va_start(alist, format);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) vfprintf(stderr, format, alist);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou va_end(alist);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) putc('\n', stderr);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou vrrp_close(vrrp_vh);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou exit(EXIT_FAILURE);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic void
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhouopterr_exit(int opt, int opterr, const char *use)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou switch (opterr) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case ':':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("option '-%c' requires a value\nusage: %s", opt,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou gettext(use));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case '?':
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou default:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou err_exit("unrecognized option '-%c'\nusage: %s", opt,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou gettext(use));
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic char *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoutimeval_since_str(int mill, char *str, size_t len)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int sec, msec, min;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou msec = mill % 1000;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou sec = mill / 1000;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou min = sec > 60 ? sec / 60 : 0;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou sec %= 60;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (min > 0)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(str, len, "%4dm%2ds", min, sec);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou else
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou (void) snprintf(str, len, "%4d.%03ds", sec, msec);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (str);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou/*
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Parses options string. The values of the two options will be returned
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * by 'preempt' and 'accept', and the mask 'modify_mask' will be updated
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * accordingly.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Returns 0 on success, errno on failures.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Used by do_create() and do_modify().
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou * Note that "opts" could be modified internally in this function.
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou */
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustatic int
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhoustr2opt(char *opts, uint32_t *modify_mask, boolean_t *preempt,
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou boolean_t *accept)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou{
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou char *value;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou int opt;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou uint32_t mask = 0;
df53e1a116c70dde0788e9b6aff5f893ac34473eCathy Zhou enum { o_preempt = 0, o_un_preempt, o_accept, o_no_accept };
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou static char *myopts[] = {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "preempt",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "un_preempt",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "accept",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou "no_accept",
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou NULL
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou };
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou while (*opts != '\0') {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou switch ((opt = getsubopt(&opts, myopts, &value))) {
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case o_preempt:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case o_un_preempt:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (mask & VRRP_CONF_PREEMPT)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (EINVAL);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou mask |= VRRP_CONF_PREEMPT;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *preempt = (opt == o_preempt);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case o_accept:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou case o_no_accept:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou if (mask & VRRP_CONF_ACCEPT)
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (EINVAL);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou mask |= VRRP_CONF_ACCEPT;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *accept = (opt == o_accept);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou break;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou default:
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (EINVAL);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou }
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou *modify_mask |= mask;
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou return (0);
1cb875ae88fb9463b368e725c2444776595895cbCathy Zhou}