911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * CDDL HEADER START
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * The contents of this file are subject to the terms of the
911106dfb16696472af8c1b7b4c554a829354fa8jm * Common Development and Distribution License (the "License").
911106dfb16696472af8c1b7b4c554a829354fa8jm * You may not use this file except in compliance with the License.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
911106dfb16696472af8c1b7b4c554a829354fa8jm * or http://www.opensolaris.org/os/licensing.
911106dfb16696472af8c1b7b4c554a829354fa8jm * See the License for the specific language governing permissions
911106dfb16696472af8c1b7b4c554a829354fa8jm * and limitations under the License.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * When distributing Covered Code, include this CDDL HEADER in each
911106dfb16696472af8c1b7b4c554a829354fa8jm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
911106dfb16696472af8c1b7b4c554a829354fa8jm * If applicable, add the following below this CDDL HEADER, with the
911106dfb16696472af8c1b7b4c554a829354fa8jm * fields enclosed by brackets "[]" replaced with your own identifying
911106dfb16696472af8c1b7b4c554a829354fa8jm * information: Portions Copyright [yyyy] [name of copyright owner]
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * CDDL HEADER END
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
911106dfb16696472af8c1b7b4c554a829354fa8jm * Use is subject to license terms.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <stdio.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <strings.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <limits.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <stdlib.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <stdarg.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <errno.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <ctype.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <arpa/inet.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <unistd.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <sys/types.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <sys/stat.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <fcntl.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <libintl.h>
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh#include <locale.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm#include <libvscan.h>
911106dfb16696472af8c1b7b4c554a829354fa8jm
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh#if !defined(TEXT_DOMAIN)
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh#define TEXT_DOMAIN "SYS_TEST"
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh#endif
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* Property Names */
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_MAXSIZE "max-size"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_MAXSIZE_ACTION "max-size-action"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_TYPES "types"
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* Scan Engine Property Names */
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_SE_ENABLE "enable"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_SE_HOST "host"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_SE_PORT "port"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_SE_MAXCONN "max-connection"
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* Property Values */
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_ON "on"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_OFF "off"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_ALLOW "allow"
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_DENY "deny"
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * Print buffer length: used for sizing buffers that are filled with
911106dfb16696472af8c1b7b4c554a829354fa8jm * user-readable strings for property values. Define a number that
911106dfb16696472af8c1b7b4c554a829354fa8jm * accounts for some pre-value information, and won't (likely)
911106dfb16696472af8c1b7b4c554a829354fa8jm * wrap an 80-column display
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_PRINT_BUF_LEN 4096
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* Program exit codes */
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_EXIT_SUCCESS 0
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_EXIT_ERROR 1
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_EXIT_USAGE 2
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vscanadm property definition. Maps the property ids to a
911106dfb16696472af8c1b7b4c554a829354fa8jm * property name, and includes functions to convert to and from
911106dfb16696472af8c1b7b4c554a829354fa8jm * input strings and native data.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmtypedef struct vs_adm_property {
911106dfb16696472af8c1b7b4c554a829354fa8jm const char *vap_name;
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t vap_id;
911106dfb16696472af8c1b7b4c554a829354fa8jm int (*vap_parse)(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jm int (*vap_unparse)(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jm} vs_adm_property_t;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* usage/help information for subcommnds */
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_GET ("[-p property]...\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\tdisplay vscan properties")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_SET ("-p property=value [-p property=value]...\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\tset values of vscan properties")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_GET_ENG ("[-p property] [engine_id]\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\tdisplay values of scan engine properties")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_ADD_ENG ("[-p property=value]... engine_id\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\tadd scan engine")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_SET_ENG ("-p property=value [-p property=value]" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "... engine_id\n\tset values of scan engine properties")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_REM_ENG ("engine_id\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\tremove scan engine")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_SHOW ("\n\tdisplay the values of all vscan " \
911106dfb16696472af8c1b7b4c554a829354fa8jm "service and scan engine properties")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_STATS ("[-z]\n\tdisplay vscan service statistics")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_IMPORT ("-p property filename\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\timport property from file")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_EXPORT ("-p property filename\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\texport property to file")
911106dfb16696472af8c1b7b4c554a829354fa8jm#define VS_ADM_HELP_VALIDATE ("-p property filename\n" \
911106dfb16696472af8c1b7b4c554a829354fa8jm "\tvalidate property in file")
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vscanadm command structure. Encapsulates the vscanadm
911106dfb16696472af8c1b7b4c554a829354fa8jm * subcommand name, pointer to the subcommand implementation
911106dfb16696472af8c1b7b4c554a829354fa8jm * function, and a help id to get usage/help information.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmtypedef struct vs_adm_cmd {
911106dfb16696472af8c1b7b4c554a829354fa8jm int (*vac_func)(int, char *[]);
911106dfb16696472af8c1b7b4c554a829354fa8jm const char *vac_name;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *vac_helpid;
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_cmd_t;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/* Subcommand implementation functions */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_set(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_get(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_set_engine(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_get_engine(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_rem_engine(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_show(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_stats(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_import(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_export(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_validate(int, char **);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parse routines to transform libvscan API data into user-readable strings
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_maxsize(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_maxsize_action(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_types(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_enable(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_host(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_port(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse_maxconn(const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparse routines to transform strings from the user input into
911106dfb16696472af8c1b7b4c554a829354fa8jm * API native data.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * While some value validation is performed in the course of unparsing
911106dfb16696472af8c1b7b4c554a829354fa8jm * string data, complete value validation is left to libvscan.
911106dfb16696472af8c1b7b4c554a829354fa8jm * Values that are in unacceptable form, out of range, or otherwise
911106dfb16696472af8c1b7b4c554a829354fa8jm * violate rules for a given property will be rejected
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_maxsize(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_maxsize_action(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_types(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_enable(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_host(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_port(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_unparse_maxconn(const void *, char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * The properties table includes a vscanadm property entry, specifying
911106dfb16696472af8c1b7b4c554a829354fa8jm * the property nane, property id, parse amd inparse methods,
911106dfb16696472af8c1b7b4c554a829354fa8jm * for each vscanadm property.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const vs_adm_property_t vs_adm_props_all[] = {
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_MAXSIZE, VS_PROPID_MAXSIZE,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_maxsize, vs_adm_unparse_maxsize },
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_MAXSIZE_ACTION, VS_PROPID_MAXSIZE_ACTION,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_maxsize_action, vs_adm_unparse_maxsize_action },
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_TYPES, VS_PROPID_TYPES,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_types, vs_adm_unparse_types },
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_SE_ENABLE, VS_PROPID_SE_ENABLE,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_enable, vs_adm_unparse_enable },
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_SE_HOST, VS_PROPID_SE_HOST,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_host, vs_adm_unparse_host },
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_SE_PORT, VS_PROPID_SE_PORT,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_port, vs_adm_unparse_port },
911106dfb16696472af8c1b7b4c554a829354fa8jm { VS_ADM_SE_MAXCONN, VS_PROPID_SE_MAXCONN,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_parse_maxconn, vs_adm_unparse_maxconn },
911106dfb16696472af8c1b7b4c554a829354fa8jm { NULL, 0, NULL, NULL }
911106dfb16696472af8c1b7b4c554a829354fa8jm};
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * The subcommand table. Used to find the subcommand specified
911106dfb16696472af8c1b7b4c554a829354fa8jm * by the user and dispatch the processing for the subcommand.
911106dfb16696472af8c1b7b4c554a829354fa8jm * Also used to display usage information for each subcommand.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const vs_adm_cmd_t vs_adm_cmds[] =
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_get, "get", VS_ADM_HELP_GET },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_set, "set", VS_ADM_HELP_SET },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_get_engine, "get-engine", VS_ADM_HELP_GET_ENG },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_set_engine, "set-engine", VS_ADM_HELP_SET_ENG },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_set_engine, "add-engine", VS_ADM_HELP_ADD_ENG },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_rem_engine, "remove-engine", VS_ADM_HELP_REM_ENG },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_import, "import", VS_ADM_HELP_IMPORT },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_export, "export", VS_ADM_HELP_EXPORT },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_validate, "validate", VS_ADM_HELP_VALIDATE },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_show, "show", VS_ADM_HELP_SHOW },
911106dfb16696472af8c1b7b4c554a829354fa8jm { vs_adm_stats, "stats", VS_ADM_HELP_STATS },
911106dfb16696472af8c1b7b4c554a829354fa8jm { NULL, NULL, NULL }
911106dfb16696472af8c1b7b4c554a829354fa8jm};
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const char *vs_adm_cmd;
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const char *vs_adm_subcmd;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_usage(FILE *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_props_from_input(int, char **, vs_props_t *, uint64_t *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void vs_adm_output_getcmd(uint64_t, const void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void vs_adm_output_stats(vs_stats_t *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const vs_adm_property_t *vs_adm_prop_by_name(const char *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const vs_adm_property_t *vs_adm_prop_by_id(const uint64_t);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_parse(const vs_adm_property_t *, const char *, void *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void vs_adm_unparse(const vs_adm_property_t *, const void *,
911106dfb16696472af8c1b7b4c554a829354fa8jm char *, size_t);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_file_read(char *, char *, int);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_file_write(char *, char *);
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int vs_adm_file_usage(int argc, char **argv);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * main
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmint
911106dfb16696472af8c1b7b4c554a829354fa8jmmain(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_cmd_t *cp;
911106dfb16696472af8c1b7b4c554a829354fa8jm const char *p;
911106dfb16696472af8c1b7b4c554a829354fa8jm int i, err;
911106dfb16696472af8c1b7b4c554a829354fa8jm
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh (void) setlocale(LC_ALL, "");
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh (void) textdomain(TEXT_DOMAIN);
96a62ada8aa6cb19b04270da282e7e21ba74b808joyce mcintosh
911106dfb16696472af8c1b7b4c554a829354fa8jm /* executable and subcommand names */
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((p = strrchr(argv[0], '/')) == NULL)
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_cmd = argv[0];
911106dfb16696472af8c1b7b4c554a829354fa8jm else
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_cmd = p + 1;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_subcmd = argv[1];
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* require at least command and sub-command */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc < 2)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (vs_adm_usage(stdout));
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* Check for the "-?" help switch */
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 1; i < argc; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(argv[i], "-?") == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (vs_adm_usage(stdout));
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* Locate the specified subcommand */
911106dfb16696472af8c1b7b4c554a829354fa8jm for (cp = vs_adm_cmds; cp->vac_name != NULL; cp++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(cp->vac_name, vs_adm_subcmd) == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (cp->vac_name == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s -- %s\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid subcommand"),
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_cmd, vs_adm_subcmd);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (vs_adm_usage(stderr));
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* invoke sub-command handler */
911106dfb16696472af8c1b7b4c554a829354fa8jm err = cp->vac_func(argc, argv);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (err == VS_ADM_EXIT_USAGE ? vs_adm_usage(stderr) : err);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_usage
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_usage(FILE *fp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_cmd_t *cp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (cp = vs_adm_cmds; cp->vac_name != NULL; cp++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(fp, "%s %s", vs_adm_cmd, cp->vac_name);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (cp->vac_helpid != NULL)
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(fp, " %s\n", cp->vac_helpid);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_get
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Gets and displays general vscan service configuration properties.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_get(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propids;
911106dfb16696472af8c1b7b4c554a829354fa8jm int i, rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *vap;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memset(&vp, 0, sizeof (vp));
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc <= 2) {
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = VS_PROPID_GEN_ALL;
911106dfb16696472af8c1b7b4c554a829354fa8jm } else {
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = 0LL;
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 2; i < argc; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm /* the "-p" specifier is optional */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(argv[i], "-p") == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (++i >= argc)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap = vs_adm_prop_by_name(argv[i])) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property"), argv[i]);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm propids |= vap->vap_id;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_props_get(&vp, propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_output_getcmd(propids, &vp);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_set
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Sets values for general vscan service configuration properties
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Calls a common function used by the set, add, and remove
911106dfb16696472af8c1b7b4c554a829354fa8jm * subcommands to modify general property values.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_set(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propids;
911106dfb16696472af8c1b7b4c554a829354fa8jm int rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc < 3)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_adm_props_from_input(argc, argv, &vp, &propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_props_set(&vp, propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_get_engine
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Gets and displays scan engine configuration properties for
911106dfb16696472af8c1b7b4c554a829354fa8jm * one or more scan engines.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_get_engine(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int i, rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propids;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *engid = NULL;
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *vap;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_all_t va;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = 0LL;
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 2; i < argc; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm /* if not preceded by -p, must be engine id and must be last */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(argv[i], "-p") != 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (i != (argc - 1))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm engid = argv[i];
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlen(engid) > VS_SE_NAME_LEN) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid scan engine"));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm } else {
911106dfb16696472af8c1b7b4c554a829354fa8jm /* property should follow the -p */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (++i >= argc)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap = vs_adm_prop_by_name(argv[i])) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property"), argv[i]);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm propids |= vap->vap_id;
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (propids == 0LL)
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = VS_PROPID_SE_ALL;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* get properties for specified engine */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (engid) {
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_props_se_get(engid, &va.va_se[0], propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_output_getcmd(propids, &va.va_se[0]);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* get properties for all engines */
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_props_get_all(&va)) != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 0; i < VS_SE_MAX; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (*(va.va_se[i].vep_engid) == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_output_getcmd(propids, &va.va_se[i]);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm if (i == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("no scan engines configured"));
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_set_engine
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Sets one or more scan engine configuration properties for a
911106dfb16696472af8c1b7b4c554a829354fa8jm * single scan engine.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_set_engine(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *vap;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_se_t sep;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *val;
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propids;
911106dfb16696472af8c1b7b4c554a829354fa8jm int i, rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm int add = (strcmp(vs_adm_subcmd, "add-engine") == 0) ? 1 : 0;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((argc < 3) || ((!add) && (argc < 4)))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* Get the engine id */
911106dfb16696472af8c1b7b4c554a829354fa8jm engid = argv[argc - 1];
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strchr(engid, '=') || strcmp(argv[argc - 2], "-p") == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlen(engid) > VS_SE_NAME_LEN) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid scan engine"));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = 0LL;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 2; i < (argc - 1); i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm /* The "-p" is optional */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(argv[i], "-p") == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (++i >= argc)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((val = strchr(argv[i], '=')) == NULL)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm *val = 0;
911106dfb16696472af8c1b7b4c554a829354fa8jm val++;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* Find the SE property pointer from the SE property name */
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap = vs_adm_prop_by_name(argv[i])) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property"), argv[i]);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm propids |= vap->vap_id;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vs_adm_parse(vap, val, &sep)) != 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property value"), val);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (add)
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_props_se_create(engid, &sep, propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm else
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_props_se_set(engid, &sep, propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_rem_engine
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_rem_engine(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc != 3)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm engid = argv[2];
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlen(engid) > VS_SE_NAME_LEN) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid scan engine"));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_props_se_delete(engid)) != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_import
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_import(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propids;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *filename;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_adm_file_usage(argc, argv)) != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm filename = argv[argc - 1];
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_adm_file_read(filename, vp.vp_types, sizeof (vp.vp_types));
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = VS_PROPID_TYPES;
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_props_set(&vp, propids);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_validate
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_validate(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *filename;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_adm_file_usage(argc, argv)) != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm filename = argv[argc - 1];
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_adm_file_read(filename, vp.vp_types, sizeof (vp.vp_types));
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (vs_props_validate(&vp, VS_PROPID_TYPES) != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s\n", filename, vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s: valid\n", filename);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_export
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_export(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propids;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *filename;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_adm_file_usage(argc, argv)) != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm filename = argv[argc - 1];
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memset(&vp, 0, sizeof (vs_props_t));
911106dfb16696472af8c1b7b4c554a829354fa8jm propids = VS_PROPID_TYPES;
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_props_get(&vp, propids)) != VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s\n", filename, vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm rc = vs_adm_file_write(filename, vp.vp_types);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (rc != VS_ADM_EXIT_SUCCESS)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (rc);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_file_usage
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * import, export and validate - VS_PROPID_TYPES only
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_file_usage(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *vap;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *prop;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc < 4)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* -p optional */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(argv[2], "-p") == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc != 5)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm } else if (argc != 4)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* only VS_PROPID_TYPES supported */
911106dfb16696472af8c1b7b4c554a829354fa8jm prop = argv[argc - 2];
911106dfb16696472af8c1b7b4c554a829354fa8jm vap = vs_adm_prop_by_name(prop);
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap == NULL) || (vap->vap_id != VS_PROPID_TYPES)) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property"), prop);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_file_read
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_file_read(char *filename, char *buf, int len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm FILE *fp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((fp = fopen(filename, "r")) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s\n", filename,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_strerror(VS_ERR_SYS));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memset(buf, 0, len);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (fgets(buf, len, fp) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s\n", filename,
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property value"));
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fclose(fp);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fclose(fp);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* remove newline */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (buf[strlen(buf) - 1] == '\n')
911106dfb16696472af8c1b7b4c554a829354fa8jm buf[strlen(buf) - 1] = '\0';
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_file_write
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_file_write(char *filename, char *buf)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm FILE *fp;
911106dfb16696472af8c1b7b4c554a829354fa8jm int bytes;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((fp = fopen(filename, "w")) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s\n", filename,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_strerror(VS_ERR_SYS));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm bytes = fprintf(fp, "%s\n", buf);
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((bytes < 0) || (bytes != strlen(buf) + 1)) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s: %s\n", filename,
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_strerror(VS_ERR_SYS));
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fclose(fp);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fclose(fp);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_show
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Gets and displays all general properties and all scan engine
911106dfb16696472af8c1b7b4c554a829354fa8jm * properties.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_show(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc > 2)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) vs_adm_get(argc, argv);
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) vs_adm_get_engine(argc, argv);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_stats
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Gets and displays vscan service statistics.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_stats(int argc, char **argv)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int rc;
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_stats_t stats;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* get statistics */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc == 2) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_statistics(&stats)) == VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_output_stats(&stats);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm } else {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* reset statistics */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (argc == 3 && strcmp(argv[2], "-z") == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((rc = vs_statistics_reset()) == VS_ERR_NONE) {
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm } else {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s\n", vs_strerror(rc));
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* usage error */
911106dfb16696472af8c1b7b4c554a829354fa8jm return (vs_adm_usage(stdout));
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_output_stats
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_output_stats(vs_stats_t *stats)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm int i;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (stats == NULL)
911106dfb16696472af8c1b7b4c554a829354fa8jm return;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "scanned=%lld\n", stats->vss_scanned);
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "infected=%lld\n", stats->vss_infected);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (stats->vss_cleaned > 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) printf("cleaned=%lld\n", stats->vss_cleaned);
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "failed=%lld\n", stats->vss_failed);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 0; i < VS_SE_MAX; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm engid = stats->vss_eng[i].vss_engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm if (*engid == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm break;
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s:errors=%lld\n", engid,
911106dfb16696472af8c1b7b4c554a829354fa8jm stats->vss_eng[i].vss_errors);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_props_from_input
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_props_from_input(int argc, char **argv, vs_props_t *vsprops,
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t *propids)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *vap;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *val;
911106dfb16696472af8c1b7b4c554a829354fa8jm int i;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) memset(vsprops, 0, sizeof (vs_props_t));
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm *propids = 0LL;
911106dfb16696472af8c1b7b4c554a829354fa8jm for (i = 2; i < argc; i++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm /* The "-p" is optional */
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(argv[i], "-p") == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (++i >= argc)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((val = strchr(argv[i], '=')) == NULL)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_USAGE);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* Find the vscanadm property pointer from the property name */
911106dfb16696472af8c1b7b4c554a829354fa8jm *val = '\0';
911106dfb16696472af8c1b7b4c554a829354fa8jm val++;
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap = vs_adm_prop_by_name(argv[i])) == NULL) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property"), argv[i]);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /* Add in the property id and parse the property value */
911106dfb16696472af8c1b7b4c554a829354fa8jm *propids |= vap->vap_id;
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vs_adm_parse(vap, val, vsprops)) != 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stderr, "%s '%s'\n",
911106dfb16696472af8c1b7b4c554a829354fa8jm gettext("invalid property value"), val);
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_ERROR);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (VS_ADM_EXIT_SUCCESS);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_output_getcmd
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Prints the results of a get command; both the get for general
911106dfb16696472af8c1b7b4c554a829354fa8jm * configuration properties as well as the get for an engine
911106dfb16696472af8c1b7b4c554a829354fa8jm * properties.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_output_getcmd(uint64_t propids, const void *props)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm char value[VS_ADM_PRINT_BUF_LEN];
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t propid;
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *vap;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *label = NULL;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (VS_PROPID_IS_SE(propids))
911106dfb16696472af8c1b7b4c554a829354fa8jm label = ((vs_props_se_t *)props)->vep_engid;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm /*
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparse values from the property structure into readable strings
911106dfb16696472af8c1b7b4c554a829354fa8jm * and print them.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm for (propid = 1LL; propid <= VS_PROPID_MAX; propid <<= 1) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((propids & propid) == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm continue;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap = vs_adm_prop_by_id(propid)) == NULL)
911106dfb16696472af8c1b7b4c554a829354fa8jm continue;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm *value = '\0';
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_adm_unparse(vap, props, value, sizeof (value));
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (label)
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s:", label);
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "%s=%s\n", vap->vap_name, value);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) fprintf(stdout, "\n");
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_prop_by_name
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Finds and returns a pointer to a vscan property structure from the
911106dfb16696472af8c1b7b4c554a829354fa8jm * property table by property name.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const vs_adm_property_t *
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_prop_by_name(const char *propname)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *p;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (p = vs_adm_props_all; p->vap_name != NULL; p++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(propname, p->vap_name) == 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (p);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (NULL);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_prop_by_id
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Finds and returns a pointer to a vscan property structure from the
911106dfb16696472af8c1b7b4c554a829354fa8jm * property table by property name.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic const vs_adm_property_t *
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_prop_by_id(const uint64_t propid)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_adm_property_t *p;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm for (p = vs_adm_props_all; p->vap_id != 0; p++) {
911106dfb16696472af8c1b7b4c554a829354fa8jm if (propid == p->vap_id)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (p);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (NULL);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Entry point for parsing the user input strings into a data structure
911106dfb16696472af8c1b7b4c554a829354fa8jm * used for setting values. Dispatches the actual parsing to the parse
911106dfb16696472af8c1b7b4c554a829354fa8jm * routine for the specified vscanadm property.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * This function is used to dispatch parsing for values supplied by the
911106dfb16696472af8c1b7b4c554a829354fa8jm * user for all subcommands; both the general configuration as well as
911106dfb16696472af8c1b7b4c554a829354fa8jm * scan engine configuration. The structure pointer is therefore typed
911106dfb16696472af8c1b7b4c554a829354fa8jm * as a void pointer, and cast appropriately in the parse routine for
911106dfb16696472af8c1b7b4c554a829354fa8jm * the vscanadm property.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse(const vs_adm_property_t *vap, const char *valvap_name,
911106dfb16696472af8c1b7b4c554a829354fa8jm void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm return ((vap->vap_parse)(valvap_name, vp));
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_maxsize
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parses a user-supplied string into a maxsize (decimal) value for
911106dfb16696472af8c1b7b4c554a829354fa8jm * the general vscan configuration properties.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_maxsize(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t *svcp = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm uint64_t maxsize;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *end;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm errno = 0;
911106dfb16696472af8c1b7b4c554a829354fa8jm maxsize = strtoll(valstr, &end, 10);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (errno != 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(svcp->vp_maxsize, sizeof (svcp->vp_maxsize),
911106dfb16696472af8c1b7b4c554a829354fa8jm "%llu%s", maxsize, end);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_maxsize_action
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parses a user-supplied string into a maxsize action value for the
911106dfb16696472af8c1b7b4c554a829354fa8jm * general vscan configuration properties.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 failure
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_maxsize_action(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t *svcp = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(valstr, VS_ADM_ALLOW) == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm svcp->vp_maxsize_action = B_TRUE;
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(valstr, VS_ADM_DENY) == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm svcp->vp_maxsize_action = B_FALSE;
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_types
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 on failure.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_types(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_t *svcp = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlen(valstr) >= sizeof (svcp->vp_types))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlcpy(svcp->vp_types, valstr, sizeof (svcp->vp_types))
911106dfb16696472af8c1b7b4c554a829354fa8jm >= sizeof (svcp->vp_types))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_enable
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parses a user-supplied string into an enable value for the
911106dfb16696472af8c1b7b4c554a829354fa8jm * properties of a scan engine.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 on failure.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_enable(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(valstr, VS_ADM_ON) == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm sep->vep_enable = B_TRUE;
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strcmp(valstr, VS_ADM_OFF) == 0) {
911106dfb16696472af8c1b7b4c554a829354fa8jm sep->vep_enable = B_FALSE;
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm }
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_host
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parses a user-supplied string into an ip address value for the
911106dfb16696472af8c1b7b4c554a829354fa8jm * properties of a scan engine.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_host(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlen(valstr) >= sizeof (sep->vep_host))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm if (strlcpy(sep->vep_host, valstr, sizeof (sep->vep_host)) >=
911106dfb16696472af8c1b7b4c554a829354fa8jm sizeof (sep->vep_host))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_port
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parses a user-supplied string into a port value for the properties of
911106dfb16696472af8c1b7b4c554a829354fa8jm * a scan engine. The port is an unsigned short int, but the conversion
911106dfb16696472af8c1b7b4c554a829354fa8jm * must be done on a word-sized int. Casting the converted int into the
911106dfb16696472af8c1b7b4c554a829354fa8jm * port member of the property structure can result in a valid but
911106dfb16696472af8c1b7b4c554a829354fa8jm * unintended value, so the range is checked first for validity.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 on failure.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_port(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm unsigned long port;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *end;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm end = 0;
911106dfb16696472af8c1b7b4c554a829354fa8jm port = strtoul(valstr, &end, 0);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (port > UINT16_MAX || (end < (valstr + strlen(valstr))))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm sep->vep_port = port;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_parse_maxconn
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Parses a user-supplied string into a max connections (decimal) value
911106dfb16696472af8c1b7b4c554a829354fa8jm * for the properties of a scan engine.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 on failure.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_parse_maxconn(const char *valstr, void *vp)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm char *end;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm sep->vep_maxconn = strtoll(valstr, &end, 10);
911106dfb16696472af8c1b7b4c554a829354fa8jm if (end < valstr + strlen(valstr))
911106dfb16696472af8c1b7b4c554a829354fa8jm return (-1);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Entry point for unparsing native data into a readable string
911106dfb16696472af8c1b7b4c554a829354fa8jm * used for display to the user. Dispatches the actual unparsing to
911106dfb16696472af8c1b7b4c554a829354fa8jm * the unparse routine for the specified vscanadm property.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * This function is used to dispatch unparsing for all subcommands.
911106dfb16696472af8c1b7b4c554a829354fa8jm * The structure pointer is therefore typed as a void pointer, and
911106dfb16696472af8c1b7b4c554a829354fa8jm * cast appropriately in the unparse routine for the vscanadm property.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic void
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse(const vs_adm_property_t *vap, const void *vp,
911106dfb16696472af8c1b7b4c554a829354fa8jm char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm if ((vap->vap_unparse)(vp, buf, len) != 0)
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(buf, len, gettext(" (error) "));
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_maxsize
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparses a max fsize value in native data form into a
911106dfb16696472af8c1b7b4c554a829354fa8jm * user-readable string.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_maxsize(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_t *svcp = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(buf, len, "%s", svcp->vp_maxsize);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_maxsize_action
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparses a max fsize action value in native data form into a
911106dfb16696472af8c1b7b4c554a829354fa8jm * user-readable string.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_maxsize_action(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_t *svcp = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(buf, len, "%s",
911106dfb16696472af8c1b7b4c554a829354fa8jm svcp->vp_maxsize_action ? VS_ADM_ALLOW : VS_ADM_DENY);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_types
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 on failure.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_types(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_t *svcp = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) strlcpy(buf, svcp->vp_types, len);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_enable
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparses the enable value for a scan engine in native data
911106dfb16696472af8c1b7b4c554a829354fa8jm * form into a user-readable string.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_enable(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(buf, len, "%s",
911106dfb16696472af8c1b7b4c554a829354fa8jm sep->vep_enable ? VS_ADM_ON : VS_ADM_OFF);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_host
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparses an ip address for a scan engine in native data
911106dfb16696472af8c1b7b4c554a829354fa8jm * form into a user-readable string.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Returns: 0 success
911106dfb16696472af8c1b7b4c554a829354fa8jm * -1 on failure.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_host(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) strlcpy(buf, sep->vep_host, len);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_port
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparses a port value for a scan engine in native data
911106dfb16696472af8c1b7b4c554a829354fa8jm * form into a user-readable string.
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_port(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(buf, len, "%hu", sep->vep_port);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm/*
911106dfb16696472af8c1b7b4c554a829354fa8jm * vs_adm_unparse_maxconn
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm * Unparses a max connecctions for a scan engine in native data
911106dfb16696472af8c1b7b4c554a829354fa8jm * form into a user-readable string.
911106dfb16696472af8c1b7b4c554a829354fa8jm *
911106dfb16696472af8c1b7b4c554a829354fa8jm */
911106dfb16696472af8c1b7b4c554a829354fa8jm/* ARGSUSED */
911106dfb16696472af8c1b7b4c554a829354fa8jmstatic int
911106dfb16696472af8c1b7b4c554a829354fa8jmvs_adm_unparse_maxconn(const void *vp, char *buf, size_t len)
911106dfb16696472af8c1b7b4c554a829354fa8jm{
911106dfb16696472af8c1b7b4c554a829354fa8jm const vs_props_se_t *sep = vp;
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm (void) snprintf(buf, len, "%lld", sep->vep_maxconn);
911106dfb16696472af8c1b7b4c554a829354fa8jm
911106dfb16696472af8c1b7b4c554a829354fa8jm return (0);
911106dfb16696472af8c1b7b4c554a829354fa8jm}