f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CDDL HEADER START
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * The contents of this file are subject to the terms of the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Common Development and Distribution License (the "License").
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * You may not use this file except in compliance with the License.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * or http://www.opensolaris.org/os/licensing.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * See the License for the specific language governing permissions
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * and limitations under the License.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * When distributing Covered Code, include this CDDL HEADER in each
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * If applicable, add the following below this CDDL HEADER, with the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * fields enclosed by brackets "[]" replaced with your own identifying
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * information: Portions Copyright [yyyy] [name of copyright owner]
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CDDL HEADER END
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Use is subject to license terms.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#pragma ident "%Z%%M% %I% %E% SMI"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * add_allocatable -
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * a command-line interface to add device to device_allocate and
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * device_maps.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#ifndef __EXTENSIONS__
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define __EXTENSIONS__ /* needed for _strtok_r */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <sys/types.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <unistd.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <stdlib.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <strings.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <string.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <locale.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <libintl.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <pwd.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <nss_dbdefs.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <auth_attr.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <auth_list.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <zone.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <tsol/label.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <bsm/devices.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <bsm/devalloc.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define NO_OVERRIDE -1
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint check_args(da_args *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint process_args(int, char **, da_args *, char *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint scan_label(char *, char *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricavoid usage(da_args *, char *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint system_labeled = 0;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricamain(int argc, char *argv[])
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int rc;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica uid_t uid;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *progname;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char pwbuf[NSS_LINELEN_PASSWD];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica struct passwd pwd;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica da_args dargs;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo_t devinfo;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) setlocale(LC_ALL, "");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#if !defined(TEXT_DOMAIN)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define TEXT_DOMAIN "SYS_TEST"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#endif
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) textdomain(TEXT_DOMAIN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((progname = strrchr(argv[0], '/')) == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica progname = argv[0];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica progname++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica system_labeled = is_system_labeled();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (system_labeled) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * this command can be run only in the global zone.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (getzoneid() != GLOBAL_ZONEID) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : must be run in global zone\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * this command works in Trusted Extensions only.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : need to install Trusted Extensions\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.optflag = 0;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.rootdir = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.devnames = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.devinfo = &devinfo;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strcmp(progname, "add_allocatable") == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.optflag |= DA_ADD;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (strcmp(progname, "remove_allocatable") == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.optflag |= DA_REMOVE;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica usage(&dargs, progname);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica uid = getuid();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((getpwuid_r(uid, &pwd, pwbuf, sizeof (pwbuf))) == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : getpwuid_r failed: "));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s\n", strerror(errno));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(2);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (chkauthattr(DEVICE_CONFIG_AUTH, pwd.pw_name) != 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : user lacks authorization: \n"),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DEVICE_CONFIG_AUTH);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(4);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (process_args(argc, argv, &dargs, progname) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica usage(&dargs, progname);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dargs.optflag & DA_ADD) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (check_args(&dargs) == NO_OVERRIDE) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : entry exists for "),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs.devinfo->devname, gettext("\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica usage(&dargs, progname);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(3);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dargs.optflag & DA_DEFATTRS)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica rc = da_update_defattrs(&dargs);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica rc = da_update_device(&dargs);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((rc != 0) && (!(dargs.optflag & DA_SILENT))) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (rc == -2)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : device name/type/list missing\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else if (dargs.optflag & DA_ADD)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : error adding/updating device\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else if (dargs.optflag & DA_REMOVE)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : error removing device\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica rc = 2; /* exit code for 'Unknown system error' in man page */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (rc);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaprocess_args(int argc, char **argv, da_args *dargs, char *progname)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int c;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int aflag, cflag, dflag, fflag, lflag, nflag, oflag, tflag;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica extern char *optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo_t *devinfo;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo = dargs->devinfo;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica aflag = cflag = dflag = fflag = lflag = nflag = oflag = tflag = 0;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devname = devinfo->devtype = devinfo->devauths =
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devexec = devinfo->devopts = devinfo->devlist = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->instance = 0;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while ((c = getopt(argc, argv, "a:c:dfl:n:o:st:")) != EOF) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica switch (c) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'a':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devauths = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica aflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'c':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devexec = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strlen(devinfo->devexec) == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : device clean program"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica " name not found\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica cflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'd':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs->optflag |= DA_DEFATTRS;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'l':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devlist = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strlen(devinfo->devlist) == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : device file list"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica " not found\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica lflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'f':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs->optflag |= DA_FORCE;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica fflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'n':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devname = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strlen(devinfo->devname) == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : device name "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "not found\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 'o':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* check for field delimiters in the option */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strpbrk(optarg, ":;=") == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s%s",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : invalid "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "key=val string: "),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica optarg);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext("\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devopts = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dargs->optflag & DA_ADD) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (scan_label(devinfo->devopts, progname) != 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica oflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 's':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dargs->optflag |= DA_SILENT;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica case 't':
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devtype = optarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strlen(devinfo->devtype) == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : device type "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "not found\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica tflag++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica break;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica default :
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dargs->optflag & DA_ADD) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dflag) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* -d requires -t, but does not like -n */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (nflag || tflag == 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (nflag == 0 && tflag == 0 && lflag == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* require at least -n or -t or -l to be specified */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : required options missing\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (dargs->optflag & DA_REMOVE) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dflag) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* -d requires -t, but does not like -n */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (nflag || tflag == 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (nflag == 0 && tflag == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* require at least -n or -t to be specified */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : required options missing\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* there's a bunch not accepted by remove_allocatable */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (aflag || cflag || lflag || oflag)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* check for option specified more than once */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (aflag > 1 || cflag > 1 || lflag > 1 || fflag > 1 ||
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nflag > 1 || tflag > 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!(dargs->optflag & DA_SILENT))
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : multiple-defined options\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaverify_label(char *token, char *progname)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int error = 0;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *p, *val, *str;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((strstr(token, DAOPT_MINLABEL) == NULL) &&
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (strstr(token, DAOPT_MAXLABEL) == NULL)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* no label specified */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((val = strchr(token, '=')) == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica val++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * if non-default labels are specified, check if they are correct
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((strcmp(val, DA_DEFAULT_MIN) != 0) &&
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (strcmp(val, DA_DEFAULT_MAX) != 0)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica m_label_t *slabel = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica str = strdup(val);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* get rid of double quotes if they exist */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while (*str == '"')
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica str++;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((p = strchr(str, '"')) != NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *p = '\0';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (str_to_label(str, &slabel, MAC_LABEL, L_NO_CORRECTION,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica &error) == -1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s%s", progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" : bad label input: "),
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica val);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s", gettext("\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(str);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica m_label_free(slabel);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(str);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica m_label_free(slabel);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricascan_label(char *devopts, char *progname)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *tok = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *lasts, *optsarg;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (devopts == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((optsarg = strdup(devopts)) == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((tok = strtok_r(optsarg, KV_TOKEN_DELIMIT, &lasts)) == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (verify_label(tok, progname) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(optsarg);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while ((tok = strtok_r(NULL, KV_TOKEN_DELIMIT, &lasts)) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (verify_label(tok, progname) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica free(optsarg);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricacheck_args(da_args *dargs)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int nlen;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *kval, *nopts, *ntok, *nstr,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *defmin, *defmax, *defauths, *defexec;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica kva_t *kva;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo_t *devinfo;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devalloc_t *da = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica da_defs_t *da_defs = NULL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo = dargs->devinfo;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * check if we're updating an existing entry without -f
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica setdaent();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica da = getdanam(devinfo->devname);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica enddaent();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (da && !(dargs->optflag & DA_FORCE)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica freedaent(da);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (NO_OVERRIDE);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((devinfo->devopts == NULL) ||
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (strstr(devinfo->devopts, DAOPT_MINLABEL) == NULL) ||
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (strstr(devinfo->devopts, DAOPT_MAXLABEL) == NULL) ||
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (devinfo->devauths == NULL) ||
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (devinfo->devexec == NULL)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* fill in defaults as required */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defmin = DA_DEFAULT_MIN;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defmax = DA_DEFAULT_MAX;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defauths = DEFAULT_DEV_ALLOC_AUTH;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defexec = DA_DEFAULT_CLEAN;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica setdadefent();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (da_defs = getdadeftype(devinfo->devtype)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica kva = da_defs->devopts;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((kval = kva_match(kva, DAOPT_MINLABEL)) != NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defmin = strdup(kval);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((kval = kva_match(kva, DAOPT_MAXLABEL)) != NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defmax = strdup(kval);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((kval = kva_match(kva, DAOPT_AUTHS)) != NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defauths = strdup(kval);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((kval = kva_match(kva, DAOPT_CSCRIPT)) != NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica defexec = strdup(kval);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica freedadefent(da_defs);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica enddadefent();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (devinfo->devauths == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devauths = defauths;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (devinfo->devexec == NULL)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devexec = defexec;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (devinfo->devopts == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* add default minlabel and maxlabel */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nlen = strlen(DAOPT_MINLABEL) + strlen(KV_ASSIGN) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(defmin) + strlen(KV_TOKEN_DELIMIT) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(DAOPT_MAXLABEL) + strlen(KV_ASSIGN) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(defmax) + 1; /* +1 for terminator */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (nopts = (char *)malloc(nlen)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) snprintf(nopts, nlen, "%s%s%s%s%s%s%s",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DAOPT_MINLABEL, KV_ASSIGN, defmin,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica KV_TOKEN_DELIMIT,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica DAOPT_MAXLABEL, KV_ASSIGN, defmax);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devopts = nopts;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strstr(devinfo->devopts, DAOPT_MINLABEL) == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* add default minlabel */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ntok = DAOPT_MINLABEL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nstr = defmin;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nlen = strlen(devinfo->devopts) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(KV_TOKEN_DELIMIT) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(ntok) + strlen(KV_ASSIGN) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(nstr) + 1;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (nopts = (char *)malloc(nlen)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) snprintf(nopts, nlen,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "%s%s%s%s%s",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devopts, KV_TOKEN_DELIMIT,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ntok, KV_ASSIGN, nstr);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devopts = nopts;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (strstr(devinfo->devopts, DAOPT_MAXLABEL) == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* add default maxlabel */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ntok = DAOPT_MAXLABEL;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nstr = defmax;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica nlen = strlen(devinfo->devopts) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(KV_TOKEN_DELIMIT) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(ntok) + strlen(KV_ASSIGN) +
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica strlen(nstr) + 1;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (nopts = (char *)malloc(nlen)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) snprintf(nopts, nlen,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "%s%s%s%s%s",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devopts, KV_TOKEN_DELIMIT,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica ntok, KV_ASSIGN, nstr);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica devinfo->devopts = nopts;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricavoid
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricausage(da_args *dargs, char *progname)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dargs->optflag & DA_SILENT)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (dargs->optflag & DA_ADD)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s%s", gettext("Usage: "), progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" [-f][-s][-d] -n name -t type -l device-list"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "\n\t[-a authorization] [-c cleaning program] "
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica "[-o key=value]\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else if (dargs->optflag & DA_REMOVE)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, "%s%s%s", gettext("Usage: "), progname,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica gettext(" [-f][-s][-d] [-n name|-t type]\n"));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) fprintf(stderr, gettext("Invalid usage\n"), progname);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica}