dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER START
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The contents of this file are subject to the terms of the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Common Development and Distribution License (the "License").
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You may not use this file except in compliance with the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * or http://www.opensolaris.org/os/licensing.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * See the License for the specific language governing permissions
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and limitations under the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * If applicable, add the following below this CDDL HEADER, with the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner]
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER END
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Use is subject to license terms.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdio.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <unistd.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdlib.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <strings.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stddef.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <assert.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <errno.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/types.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/socket.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <netinet/in.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <arpa/inet.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/list.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <ofmt.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <libilb.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include "ilbadm.h"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t servrange_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_SERVER, "server", "servers"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_SERVRANGE, "server", "servers"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t serverID_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_SERVERID, "server", ""},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct sg_export_arg {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra FILE *fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sgroup_t *sg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} sg_export_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct arg_struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *o_str;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *o_fields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_handle_t oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} list_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct sg_srv_o_struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *sgname;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_server_data_t *sd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} sg_srv_o_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_sgname;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_srvID;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_port;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_ip;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t sgfields_v4[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SGNAME", ILB_SGNAME_SZ, 0, of_sgname},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERID", ILB_NAMESZ, 0, of_srvID},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"MINPORT", 8, 0, of_port},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"MAXPORT", 8, 1, of_port},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"IP_ADDRESS", 15, 0, of_ip},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t sgfields_v6[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SGNAME", ILB_SGNAME_SZ, 0, of_sgname},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERID", ILB_NAMESZ, 0, of_srvID},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"MINPORT", 8, 0, of_port},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"MAXPORT", 8, 1, of_port},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"IP_ADDRESS", 39, 0, of_ip},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define MAXCOLS 80 /* make flexible? */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraextern int optind, optopt, opterr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraextern char *optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_sgname(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, l->sgname, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_srvID(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, l->sd->sd_srvID, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_port(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int port;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (of_arg->ofmt_id == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra port = ntohs(l->sd->sd_minport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (port == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *buf = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%d", port);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra port = ntohs(l->sd->sd_maxport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (port == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *buf = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%d", port);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_ip(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t *l = (sg_srv_o_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&l->sd->sd_addr, buf, bufsize, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_list_sg_srv_ofmt(char *sgname, ilb_server_data_t *sd, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_arg_t *larg = (list_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_srv_o_arg_t line_arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra line_arg.sgname = sgname;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra line_arg.sd = sd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_print(larg->oh, &line_arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILBADM_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * This function is always called via ilb_walk_servergroups()
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and so must return libilb errors.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * That's why we need to retain currently unused "h" argument
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_list_sg_srv(ilb_handle_t h, ilb_server_data_t *sd, const char *sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char ip_str[2*INET6_ADDRSTRLEN + 3] = "";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char port_str[INET6_ADDRSTRLEN];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_arg_t *larg = (list_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_status_t oerr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int oflags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ocols = MAXCOLS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int h_minport, h_maxport;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra static ofmt_handle_t oh = (ofmt_handle_t)NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *ofp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->o_str != NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oh == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sd->sd_addr.ia_af == AF_INET)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofp = sgfields_v6;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofp = sgfields_v4;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->flags & ILBADM_LIST_PARSE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oflags |= OFMT_PARSABLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oerr = ofmt_open(larg->o_str, ofp, oflags, ocols, &oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oerr != OFMT_SUCCESS) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char e[80];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("ofmt_open failed: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_strerror(oh, oerr, e, sizeof (e)));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_GENERIC);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg->oh = oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) i_list_sg_srv_ofmt((char *)sgname, sd, arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&sd->sd_addr, ip_str, sizeof (ip_str), 0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra h_minport = ntohs(sd->sd_minport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra h_maxport = ntohs(sd->sd_maxport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h_minport == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *port_str = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else if (h_maxport > h_minport)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) sprintf(port_str, ":%d-%d", h_minport, h_maxport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) sprintf(port_str, ":%d", h_minport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) printf("%s: id:%s %s%s\n", sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sd->sd_srvID?sd->sd_srvID:"(null)", ip_str, port_str);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_list_sg(ilb_handle_t h, ilb_sg_data_t *sg, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sg->sgd_srvcount == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_server_data_t tmp_srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bzero(&tmp_srv, sizeof (tmp_srv));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_list_sg_srv(h, &tmp_srv, sg->sgd_name, arg));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilb_walk_servers(h, ilbadm_list_sg_srv, sg->sgd_name, arg));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char *def_fields = "SGNAME,SERVERID,MINPORT,MAXPORT,IP_ADDRESS";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_servergroups(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char optstr[] = ":po:";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t o_opt = B_FALSE, p_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_arg_t larg = {0, def_fields, NULL, NULL};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, optstr)) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'p': p_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.flags |= ILBADM_LIST_PARSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'o': larg.o_str = optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra o_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':': ilbadm_err(gettext("missing option argument"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " for %c"), (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default: unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt && !o_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt && larg.o_str != NULL &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (strcasecmp(larg.o_str, "all") == 0)) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires explicit field"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " names for -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_servergroups(h, ilbadm_list_sg, NULL,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void*)&larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while (optind < argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_servergroups(h, ilbadm_list_sg,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra argv[optind++], (void*)&larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg.oh != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_close(larg.oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The show function returns ILB_STATUS_GENERIC after printing
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * out an error message. So we don't need to print it again.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_GENERIC)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_servnode_t *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_new_sg_elem(ilbadm_sgroup_t *sgp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_servnode_t *s;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra s = (ilbadm_servnode_t *)calloc(sizeof (*s), 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (s != NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_insert_tail(&sgp->sg_serv_list, s);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sgp->sg_count++;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (s);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_parse_servrange_list(char *arg, ilbadm_sgroup_t *sgp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int count;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_optstring(arg, (void *) sgp, servrange_keys,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra OPT_VALUE_LIST|OPT_IP_RANGE|OPT_PORTS, &count);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_parse_serverIDs(char *arg, ilbadm_sgroup_t *sgp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int count;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_optstring(arg, (void *) sgp, serverID_keys,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra OPT_VALUE_LIST|OPT_PORTS, &count);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_mod_sg(ilb_handle_t h, ilbadm_sgroup_t *sgp, ilbadm_cmd_t cmd,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_servnode_t *sn;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_server_data_t *srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h == ILB_INVALID_HANDLE && cmd != cmd_enable_server &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra cmd != cmd_disable_server)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILBADM_LIBERR);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sn = list_head(&sgp->sg_serv_list);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while (sn != NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv = &sn->s_spec;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv->sd_flags |= flags;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cmd == cmd_create_sg || cmd == cmd_add_srv) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_add_server_to_group(h, sgp->sg_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char buf[INET6_ADDRSTRLEN + 1];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&srv->sd_addr, buf, sizeof (buf),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("cannot add %s to %s: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf, sgp->sg_name, ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we created the SG, we bail out */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cmd == cmd_create_sg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra assert(cmd == cmd_rem_srv);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_rem_server_from_group(h, sgp->sg_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we fail, we tell user and continue */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra gettext("cannot remove %s from %s: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv->sd_srvID, sgp->sg_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * list_next returns NULL instead of cycling back to head
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * so we don't have to check for list_head explicitly.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sn = list_next(&sgp->sg_serv_list, sn);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra };
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_ilbadm_alloc_sgroup(ilbadm_sgroup_t **sgp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sgroup_t *sg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *sgp = sg = (ilbadm_sgroup_t *)calloc(sizeof (*sg), 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sg == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_create(&sg->sg_serv_list, sizeof (ilbadm_servnode_t),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra offsetof(ilbadm_servnode_t, s_link));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_ilbadm_free_sgroup(ilbadm_sgroup_t *sg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_servnode_t *s;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((s = list_remove_head(&sg->sg_serv_list)) != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra free(s);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra list_destroy(&sg->sg_serv_list);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_create_servergroup(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sgroup_t *sg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_alloc_sgroup(&sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":s:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 's':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_servrange_list(optarg, sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument for"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " %c"), (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing mandatory arguments - please refer"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " to 'create-servergroup' subcommand"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " description in ilbadm(1M)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strlen(argv[optind]) > ILB_SGNAME_SZ - 1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("servergroup name %s is too long -"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " must not exceed %d chars"), argv[optind],
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ILB_SGNAME_SZ - 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg->sg_name = argv[optind];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_create_servergroup(h, sg->sg_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* we create a servergroup with all servers enabled */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ILB_SET_ENABLED(flags);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_mod_sg(h, sg, cmd_create_sg, flags);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_destroy_servergroup(h, sg->sg_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_free_sgroup(sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_add_server_to_group(int argc, char **argv)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sgroup_t *sg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_alloc_sgroup(&sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":s:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 's':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_servrange_list(optarg, sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument for"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " %c"), (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default: unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing mandatory arguments - please refer"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " to 'add-server' subcommand description in ilbadm(1M)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg->sg_name = argv[optind];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* A server is added enabled */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ILB_SET_ENABLED(flags);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_mod_sg(h, sg, cmd_add_srv, flags);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_free_sgroup(sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_Xable_server(int argc, char *argv[], ilbadm_cmd_t cmd)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (argc < 2) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing required argument"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " (server specification)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* enable-server and disable-server only accepts serverids */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 1; i < argc && rclib == ILB_STATUS_OK; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_server_data_t srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (argv[i][0] != ILB_SRVID_PREFIX) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_INVAL_SRVID;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bzero(&srv, sizeof (srv));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* to do: check length */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(srv.sd_srvID, argv[i], sizeof (srv.sd_srvID));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (cmd) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case cmd_enable_server:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_enable_server(h, &srv, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case cmd_disable_server:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_disable_server(h, &srv, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we can't find a given server ID, just plough on */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib == ILB_STATUS_ENOENT) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra const char *msg = ilb_errstr(rclib);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err("%s: %s", msg, argv[i]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_disable_server(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_Xable_server(argc, argv, cmd_disable_server));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_enable_server(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_Xable_server(argc, argv, cmd_enable_server));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_rem_server_from_group(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sgroup_t *sg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_alloc_sgroup(&sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":s:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 's':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_serverIDs(optarg, sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument for"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " %c"), (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default: unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* we need servergroup name and at least one serverID to remove */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc || sg->sg_count == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOOPTION;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg->sg_name = argv[optind];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_mod_sg(h, sg, cmd_rem_srv, 0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_free_sgroup(sg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_destroy_servergroup(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *sgname;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (argc != 2) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("usage:ilbadm"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " delete-servergroup groupname"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sgname = argv[1];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_destroy_servergroup(h, sgname);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define BUFSZ 1024
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraexport_srv_spec(ilb_server_data_t *srv, char *buf, const int bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int len = 0, bufsz = (int)bufsize;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&srv->sd_addr, buf, bufsz, 0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra len += strlen(buf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bufsz -= len;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (srv->sd_minport != 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra in_port_t h_min, h_max;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int inc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra h_min = ntohs(srv->sd_minport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra h_max = ntohs(srv->sd_maxport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* to do: if service name was given, print that, not number */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h_max <= h_min)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra inc = snprintf(buf+len, bufsz, ":%d", h_min);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra inc = snprintf(buf+len, bufsz, ":%d-%d", h_min, h_max);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (inc > bufsz) /* too little space */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra len += inc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (len);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * this is called by ilb_walk_servers(), therefore we return ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * not ilbadm_status, and retain an unused function argument
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_a_srv(ilb_handle_t h, ilb_server_data_t *srv, const char *sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_export_arg_t *larg = (sg_export_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra FILE *fp = larg->fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char linebuf[BUFSZ]; /* XXXms make that dynamic */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int sz = BUFSZ;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (export_srv_spec(srv, linebuf, sz) == -1)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "add-server -s server=");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "%s %s\n", linebuf, sgname);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_sg(ilb_handle_t h, ilb_sg_data_t *sg, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rc = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_export_arg_t *larg = (sg_export_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra FILE *fp = larg->fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "create-servergroup %s\n", sg->sgd_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sg->sgd_srvcount == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ilb_walk_servers(h, ilbadm_export_a_srv, sg->sgd_name, arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (fflush(fp) == EOF)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILB_STATUS_WRITE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_servergroups(ilb_handle_t h, FILE *fp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sg_export_arg_t arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra arg.fp = fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra arg.sg = NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_servergroups(h, ilbadm_export_sg, NULL, (void *)&arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}