45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER START
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The contents of this file are subject to the terms of the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Common Development and Distribution License (the "License").
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You may not use this file except in compliance with the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or http://www.opensolaris.org/os/licensing.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * See the License for the specific language governing permissions
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and limitations under the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * When distributing Covered Code, include this CDDL HEADER in each
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If applicable, add the following below this CDDL HEADER, with the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fields enclosed by brackets "[]" replaced with your own identifying
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * information: Portions Copyright [yyyy] [name of copyright owner]
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER END
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdlib.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <ctype.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <unistd.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <limits.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <fcntl.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/types.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <sys/stat.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <utime.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <synch.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <strings.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <string.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <libintl.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <errno.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <auth_list.h>
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel#include <syslog.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <bsm/devices.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <bsm/devalloc.h>
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel#include <tsol/label.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define DA_DEFS "/etc/security/tsol/devalloc_defaults"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern int _readbufline(char *, int, char *, int, int *);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern char *strtok_r(char *, const char *, char **);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern char *_strtok_escape(char *, char *, char **);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern int getdaon(void);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern int da_matchname(devalloc_t *, char *);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern int da_match(devalloc_t *, da_args *);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern int dmap_matchname(devmap_t *, char *);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkextern int dm_match(devmap_t *, da_args *);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelextern int dmap_matchtype(devmap_t *dmap, char *type);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelextern int dmap_matchdev(devmap_t *dmap, char *dev);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelextern int dmap_exact_dev(devmap_t *dmap, char *dev, int *num);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelextern char *dmap_physname(devmap_t *dmap);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The following structure is for recording old entries to be retained.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * We read the entries from the database into a linked list in memory,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * then turn around and write them out again.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpktypedef struct strentry {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct strentry *se_next;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char se_str[4096 + 1];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk} strentry_t;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_check_longindevperm -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * reads /etc/logindevperm and checks if specified device is in the file.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 1 if specified device found in /etc/logindevperm, else returns 0
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_check_logindevperm(char *devname)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int ret = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int fd = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int nlen, plen, slen, lineno, fsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char line[MAX_CANON];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *field_delims = " \t\n";
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *fbuf = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *ptr, *device;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *lasts = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk FILE *fp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat f_stat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * check if /etc/logindevperm exists and get its size
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((fd = open(LOGINDEVPERM, O_RDONLY)) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (fstat(fd, &f_stat) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fsize = f_stat.st_size;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((fbuf = (char *)malloc(fsize)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
004388ebfdfe2ed7dfd2d153a876dfcc22d2c006casper if ((fp = fdopen(fd, "rF")) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * read and parse /etc/logindevperm
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen = nlen = lineno = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (fgets(line, MAX_CANON, fp) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lineno++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((ptr = strchr(line, '#')) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *ptr = '\0'; /* handle comments */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strtok_r(line, field_delims, &lasts) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue; /* ignore blank lines */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strtok_r(NULL, field_delims, &lasts) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* invalid entry */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((ptr = strtok_r(NULL, field_delims, &lasts)) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* empty device list */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = strlen(ptr) + 1; /* +1 terminator */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen += (plen + 1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (plen == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen = snprintf(fbuf, nlen, "%s", ptr);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen = snprintf(fbuf + plen, nlen - plen, ":%s", ptr);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (slen >= fsize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fbuf[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(fp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (slen);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen += slen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(fp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * check if devname exists in /etc/logindevperm
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk device = strtok_r(fbuf, ":", &lasts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (device != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device and devname may be one of these types -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * /dev/xx
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * /dev/xx*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * /dev/dir/xx
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * /dev/dir/xx*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * /dev/dir/"*"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(device, devname) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* /dev/xx, /dev/dir/xx */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((ptr = strrchr(device, KV_WILDCHAR)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* all wildcard types */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *ptr = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strncmp(device, devname, strlen(device)) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk device = strtok_r(NULL, ":", &lasts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (ret);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _da_read_file -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * establishes readers/writer lock on fname; reads in the file if its
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * contents changed since the last time we read it.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns size of buffer read, or -1 on failure.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_da_read_file(char *fname, char **fbuf, time_t *ftime, rwlock_t *flock,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int flag)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int fd = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int fsize = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk time_t newtime;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat f_stat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_FORCE)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *ftime = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* check the size and the time stamp on the file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rw_rdlock(flock) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (stat(fname, &f_stat) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fsize = f_stat.st_size;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newtime = f_stat.st_mtime;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (newtime > *ftime) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * file has been modified since we last read it; or this
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * is a forced read.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * read file into the buffer with rw lock.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rw_wrlock(flock) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
004388ebfdfe2ed7dfd2d153a876dfcc22d2c006casper if ((fd = open(fname, O_RDONLY)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*fbuf != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(*fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *fbuf = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((*fbuf = malloc(fsize)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (read(fd, *fbuf, fsize) < fsize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(*fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * verify that the file did not change just after we read it.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rw_rdlock(flock) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(*fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (stat(fname, &f_stat) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(*fbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fsize = f_stat.st_size;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newtime = f_stat.st_mtime;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) rw_unlock(flock);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *ftime = newtime;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (fsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _update_zonename -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * add/remove current zone's name to the given devalloc_t.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkvoid
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_update_zonename(da_args *dargs, devalloc_t *dap)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int i, j;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int oldsize, newsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int has_zonename = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *zonename;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk kva_t *newkva, *oldkva;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk kv_t *newdata, *olddata;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo_t *devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo = dargs->devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk oldkva = dap->da_devopts;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (oldkva == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_REMOVE_ZONE)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD_ZONE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newkva = _str2kva(devinfo->devopts, KV_ASSIGN,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_TOKEN_DELIMIT);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (newkva != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dap->da_devopts = newkva;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newsize = oldsize = oldkva->length;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (kva_match(oldkva, DAOPT_ZONE))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk has_zonename = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD_ZONE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((zonename = index(devinfo->devopts, '=')) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk zonename++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (has_zonename) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) _insert2kva(oldkva, DAOPT_ZONE, zonename);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newsize += 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (dargs->optflag & DA_REMOVE_ZONE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (has_zonename) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newsize -= 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (newsize == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If zone name was the only key/value pair,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * put 'reserved' in the empty slot.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _kva_free(oldkva);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dap->da_devopts = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newkva = _new_kva(newsize);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newkva->length = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newdata = newkva->data;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk olddata = oldkva->data;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (i = 0, j = 0; i < oldsize; i++) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((dargs->optflag & DA_REMOVE_ZONE) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strcmp(olddata[i].key, DAOPT_ZONE) == 0))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newdata[j].key = strdup(olddata[i].key);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newdata[j].value = strdup(olddata[i].value);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newkva->length++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk j++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD_ZONE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newdata[j].key = strdup(DAOPT_ZONE);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newdata[j].value = strdup(zonename);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk newkva->length++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _kva_free(oldkva);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dap->da_devopts = newkva;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _dmap2str -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * converts a device_map entry into a printable string
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*ARGSUSED*/
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel_dmap2str(devmap_t *dmp, char *buf, int size, const char *sep)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int length;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = snprintf(buf, size, "%s%s", dmp->dmap_devname, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dmp->dmap_devtype, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s\n",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dmp->dmap_devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _dmap2strentry -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * calls dmap2str to break given devmap_t into printable entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns pointer to decoded entry, NULL on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic strentry_t *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel_dmap2strentry(devmap_t *devmapp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *sep;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((sep = (strentry_t *)malloc(sizeof (strentry_t))) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (_dmap2str(devmapp, sep->se_str, sizeof (sep->se_str),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_TOKEN_DELIMIT"\\\n\t") != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fix_optstr -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * removes trailing ':' from buf.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkvoid
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkfix_optstr(char *buf)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *p = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (p = rindex(buf, ':'))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *p = ';';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _da2str -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * converts a device_allocate entry into a printable string
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_da2str(da_args *dargs, devalloc_t *dap, char *buf, int size, const char *sep,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk const char *osep)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int length;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int matching_entry = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char **dnames;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_UPDATE &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (dargs->optflag & DA_ADD_ZONE ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dargs->optflag & DA_REMOVE_ZONE) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dargs->devnames) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (dnames = dargs->devnames; *dnames != NULL; dnames++) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (da_matchname(dap, *dnames)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk matching_entry = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = snprintf(buf, size, "%s%s", dap->da_devname, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dap->da_devtype, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (matching_entry)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _update_zonename(dargs, dap);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((dap->da_devopts == NULL) || ((dap->da_devopts->length == 1) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strcmp(dap->da_devopts->data->key, DA_RESERVED) == 0))) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DA_RESERVED, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_kva2str(dap->da_devopts, buf + length, size - length,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_ASSIGN, (char *)osep) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = strlen(buf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dap->da_devopts)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fix_optstr(buf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DA_RESERVED, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dap->da_devauth ? dap->da_devauth : DA_ANYUSER, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length += snprintf(buf + length, size - length, "%s\n",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dap->da_devexec ? dap->da_devexec : "");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _da2strentry -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * calls da2str to break given devalloc_t into printable entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns pointer to decoded entry, NULL on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic strentry_t *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_da2strentry(da_args *dargs, devalloc_t *dap)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *sep;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((sep = (strentry_t *)malloc(sizeof (strentry_t))) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_da2str(dargs, dap, sep->se_str, sizeof (sep->se_str),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_DELIMITER "\\\n\t", KV_TOKEN_DELIMIT "\\\n\t") != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _def2str
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * converts da_defs_t into a printable string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_def2str(da_defs_t *da_defs, char *buf, int size, const char *sep)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int length;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = snprintf(buf, size, "%s%s", da_defs->devtype, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (da_defs->devopts) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_kva2str(da_defs->devopts, buf + length, size - length,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_ASSIGN, KV_DELIMITER) != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = strlen(buf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (length >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _def2strentry
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * calls _def2str to break given da_defs_t into printable entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns pointer decoded entry, NULL on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic strentry_t *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_def2strentry(da_defs_t *da_defs)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *sep;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((sep = (strentry_t *)malloc(sizeof (strentry_t))) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_def2str(da_defs, sep->se_str, sizeof (sep->se_str),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_TOKEN_DELIMIT) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (NULL);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _build_defattrs
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * cycles through all defattr entries, stores them in memory. removes
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * entries with the given search_key (device type).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 if given entry not found, 1 if given entry removed, 2 on
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_build_defattrs(da_args *dargs, strentry_t **head_defent)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rc = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk da_defs_t *da_defs;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *tail_str, *tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk setdadefent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while ((da_defs = getdadefent()) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = !(strcmp(da_defs->devtype, dargs->devinfo->devtype));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc && dargs->optflag & DA_ADD &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk !(dargs->optflag & DA_FORCE)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * During DA_ADD, we keep an existing entry unless
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * we have DA_FORCE set to override that entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dargs->optflag |= DA_NO_OVERRIDE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = _def2strentry(da_defs);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (tmp_str == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedadefent(da_defs);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddadefent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* retaining defattr entry: tmp_str->se_str */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str->se_next = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*head_defent == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *head_defent = tail_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tail_str->se_next = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tail_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedadefent(da_defs);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddadefent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel/*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * We have to handle the "standard" types in devlist differently than
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * other devices, which are not covered by our auto-naming conventions.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel *
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * buf must be a buffer of size DA_MAX_NAME + 1
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcelint
399f067736e659e2754e97190952abea40f1d0d6Jan Parcelda_std_type(da_args *dargs, char *namebuf)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel{
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel char *type = dargs->devinfo->devtype;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel int system_labeled;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel system_labeled = is_system_labeled();
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* check safely for sizes */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (strcmp(DA_AUDIO_TYPE, type) == 0) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_AUDIO_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (strcmp(DA_CD_TYPE, type) == 0) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (system_labeled)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_CD_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel else
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_CD_TYPE, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (strcmp(DA_FLOPPY_TYPE, type) == 0) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (system_labeled)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_FLOPPY_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel else
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_FLOPPY_TYPE, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (strcmp(DA_TAPE_TYPE, type) == 0) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (system_labeled)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_TAPE_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel else
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_TAPE_TYPE, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (strcmp(DA_RMDISK_TYPE, type) == 0) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_RMDISK_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel namebuf[0] = '\0';
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (0);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel}
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel/*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * allocatable: returns
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * -1 if no auths field,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * 0 if not allocatable (marked '*')
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * 1 if not marked '*'
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcelstatic int
399f067736e659e2754e97190952abea40f1d0d6Jan Parcelallocatable(da_args *dargs)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel{
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (!dargs->devinfo->devauths)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (-1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (strcmp("*", dargs->devinfo->devauths) == 0)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (0);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (1);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel}
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel/*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * _rebuild_lists -
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * If dargs->optflag & DA_EVENT, does not assume the dargs list is
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * complete or completely believable, since devfsadm caches
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * ONLY what it has been exposed to via syseventd.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Cycles through all the entries in the /etc files, stores them
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * in memory, takes note of device->dname numbers (e.g. rmdisk0,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * rmdisk12)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Cycles through again, adds dargs entry
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * with the name tname%d (lowest unused number for the device type)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * to the list of things for the caller to write out to a file,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * IFF it is a new entry.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * It is an error for it to already be there, if it is allocatable.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Add:
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Returns 0 if successful and 2 on error.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Remove:
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Returns 0 if not found, 1 if found, 2 on error.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelstatic int
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel_rebuild_lists(da_args *dargs, strentry_t **head_devallocp,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel strentry_t **head_devmapp)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel{
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel int rc = 0;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel devalloc_t *devallocp;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel devmap_t *devmapp;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel strentry_t *tail_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel strentry_t *tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel uint64_t tmp_bitmap = 0;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel uint_t tmp = 0;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel char *realname;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel int suffix;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel int found = 0;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel int stdtype = 1;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel int is_allocatable = 1;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel char new_devname[DA_MAXNAME + 1];
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel char defname[DA_MAXNAME + 1]; /* default name for type */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel char errmsg[DA_MAXNAME + 1 + (PATH_MAX * 2) + 80];
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & (DA_MAPS_ONLY | DA_ALLOC_ONLY))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & DA_FORCE)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (dargs->optflag & DA_ADD) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel stdtype = da_std_type(dargs, defname);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel is_allocatable = allocatable(dargs);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* read both files, maps first so we can compare actual devices */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* build device_maps */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel setdmapent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel while ((devmapp = getdmapent()) != NULL) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel suffix = DA_MAX_DEVNO + 1;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((rc = dmap_matchtype(devmapp, dargs->devinfo->devtype))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel == 1) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & DA_REMOVE) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((devmapp->dmap_devarray == NULL) ||
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (devmapp->dmap_devarray[0] == NULL)) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedmapent(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddmapent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel realname = dmap_physname(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (realname == NULL) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedmapent(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddmapent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (strstr(realname, dargs->devinfo->devlist)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel != NULL) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* if need to free and safe to free */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (dargs->devinfo->devname != NULL &&
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (dargs->optflag & DA_EVENT) != 0)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(dargs->devinfo->devname);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dargs->devinfo->devname =
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel strdup(devmapp->dmap_devname);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel found = 1;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedmapent(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel continue; /* don't retain */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else if (dargs->optflag & DA_ADD) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Need to know which suffixes are in use
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel rc = (dmap_exact_dev(devmapp,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dargs->devinfo->devlist, &suffix));
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (rc == 0) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Same type, different device. Record
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * device suffix already in use, if
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * applicable.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if ((suffix < DA_MAX_DEVNO &&
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel suffix != -1) && stdtype)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel tmp_bitmap |=
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (uint64_t)(1LL << suffix);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel } else if ((rc == 1) && !is_allocatable) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel rc = 0;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Match allocatable on add is an error
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * or mapping attempt returned error
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) snprintf(errmsg, sizeof (errmsg),
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel "Cannot add %s on node %s",
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel dargs->devinfo->devtype,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel devmapp->dmap_devname);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel syslog(LOG_ERR, "%s", errmsg);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedmapent(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddmapent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* add other transaction types as needed */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel } else if ((dargs->optflag & DA_ADD) &&
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (stdtype || is_allocatable) &&
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel dmap_exact_dev(devmapp, dargs->devinfo->devlist,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel &suffix)) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * no dups w/o DA_FORCE, even if type differs,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * if there is a chance this operation is
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * machine-driven. The 5 "standard types"
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * can be machine-driven adds, and tend to
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * be allocatable.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) snprintf(errmsg, sizeof (errmsg),
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel "Cannot add %s on node %s type %s",
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel dargs->devinfo->devtype,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel devmapp->dmap_devname,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel devmapp->dmap_devtype);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel syslog(LOG_ERR, "%s", errmsg);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel freedmapent(devmapp);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel enddmapent();
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (2);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tmp_str = _dmap2strentry(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (tmp_str == NULL) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedmapent(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddmapent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* retaining devmap entry: tmp_str->se_str */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tmp_str->se_next = NULL;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (*head_devmapp == NULL) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *head_devmapp = tail_str = tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tail_str->se_next = tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tail_str = tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedmapent(devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddmapent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * No need to rewrite the files if the item to be removed is not
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * in the files -- wait for another call on another darg.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((dargs->optflag & DA_REMOVE) && !found)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (0);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & DA_ADD) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel int len;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * If we got here from an event, or from devfsadm,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * we know the stored devname is a useless guess,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * since the files had not been read when the name
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * was chosen, and we don't keep them anywhere else
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * that is sufficiently definitive.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel for (tmp = 0; tmp <= DA_MAX_DEVNO; tmp++)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (!(tmp_bitmap & (1LL << tmp)))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* Future: support more than 64 hotplug devices per type? */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (tmp > DA_MAX_DEVNO)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /*
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Let the caller choose the name unless BOTH the name and
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * device type one of: cdrom, floppy, audio, rmdisk, or tape.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * (or sr, fd for unlabeled)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel len = strlen(defname);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (stdtype &&
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (strncmp(dargs->devinfo->devname, defname, len) == 0)) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) snprintf(new_devname, DA_MAXNAME + 1, "%s%u",
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel defname, tmp);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* if need to free and safe to free */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (dargs->devinfo->devname != NULL &&
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (dargs->optflag & DA_EVENT) != 0)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel free(dargs->devinfo->devname);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel dargs->devinfo->devname = strdup(new_devname);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Now adjust devalloc list to match devmaps
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Note we now have the correct devname for da_match to use.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel setdaent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel while ((devallocp = getdaent()) != NULL) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel rc = da_match(devallocp, dargs);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (rc == 1) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & DA_ADD) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* logging is on if DA_EVENT is set */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & DA_EVENT) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) snprintf(errmsg, sizeof (errmsg),
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel "%s and %s out of sync,"
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel "%s only in %s.",
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel DEVALLOC, DEVMAP,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel devallocp->da_devname, DEVALLOC);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel syslog(LOG_ERR, "%s", errmsg);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedaent(devallocp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddaent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else if (dargs->optflag & DA_REMOVE) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* make list w/o this entry */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedaent(devallocp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel continue;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tmp_str = _da2strentry(dargs, devallocp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (tmp_str == NULL) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedaent(devallocp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddaent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (2);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* retaining devalloc entry: tmp_str->se_str */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tmp_str->se_next = NULL;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (*head_devallocp == NULL) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *head_devallocp = tail_str = tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tail_str->se_next = tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tail_str = tmp_str;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel freedaent(devallocp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel enddaent();
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* the caller needs to know if a remove needs to rewrite files */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & DA_REMOVE)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (1); /* 0 and 2 cases returned earlier */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (0); /* Successful DA_ADD */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel}
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _build_lists -
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Cycles through all the entries, stores them in memory. removes entries
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * with the given search_key (device name or type).
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 if given entry not found, 1 if given entry removed, 2 on
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_build_lists(da_args *dargs, strentry_t **head_devallocp,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t **head_devmapp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rc = 0;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel int found = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devalloc_t *devallocp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devmap_t *devmapp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *tail_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_MAPS_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto dmap_only;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* build device_allocate */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk setdaent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while ((devallocp = getdaent()) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = da_match(devallocp, dargs);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* if in _build_lists and DA_ADD is set, so is DA_FORCE */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = _da2strentry(dargs, devallocp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (tmp_str == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedaent(devallocp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddaent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* retaining devalloc entry: tmp_str->se_str */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str->se_next = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*head_devallocp == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *head_devallocp = tail_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tail_str->se_next = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tail_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel } else if (rc == 1)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel found = 1;
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedaent(devallocp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddaent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkdmap_only:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ALLOC_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* build device_maps */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk setdmapent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while ((devmapp = getdmapent()) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = dm_match(devmapp, dargs);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel tmp_str = _dmap2strentry(devmapp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (tmp_str == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedmapent(devmapp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddmapent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* retaining devmap entry: tmp_str->se_str */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str->se_next = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*head_devmapp == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *head_devmapp = tail_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tail_str->se_next = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tail_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedmapent(devmapp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddmapent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* later code cleanup may cause the use of "found" in other cases */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel if (dargs->optflag & DA_REMOVE)
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel return (found);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_defattrs
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes current entries to devalloc_defaults.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_write_defattrs(FILE *fp, strentry_t *head_defent)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (tmp_str = head_defent; tmp_str != NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = tmp_str->se_next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs(tmp_str->se_str, fp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs("\n", fp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_device_allocate -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes current entries in the list to device_allocate.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * frees the strings
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_write_device_allocate(char *odevalloc, FILE *dafp, strentry_t *head_devallocp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int is_on = -1;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel strentry_t *tmp_str, *old_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat dastat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fseek(dafp, (off_t)0, SEEK_SET);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * if the devalloc on/off string existed before,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * put it back before anything else.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * we need to check for the string only if the file
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * exists.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (stat(odevalloc, &dastat) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk is_on = da_is_on();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (is_on == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs(DA_OFF_STR, dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (is_on == 1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs(DA_ON_STR, dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = head_devallocp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (tmp_str) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs(tmp_str->se_str, dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs("\n", dafp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel old_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = tmp_str->se_next;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(old_str);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_device_maps -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes current entries in the list to device_maps.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * and frees the strings
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_write_device_maps(FILE *dmfp, strentry_t *head_devmapp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel strentry_t *tmp_str, *old_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fseek(dmfp, (off_t)0, SEEK_SET);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = head_devmapp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (tmp_str) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs(tmp_str->se_str, dmfp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fputs("\n", dmfp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel old_str = tmp_str;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tmp_str = tmp_str->se_next;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(old_str);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_new_defattrs
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes the new entry to devalloc_defaults.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_write_new_defattrs(FILE *fp, da_args *dargs)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int count;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *tok = NULL, *tokp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *lasts;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo_t *devinfo = dargs->devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (fseek(fp, (off_t)0, SEEK_END) == (off_t)-1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!devinfo->devopts)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s", (devinfo->devtype ? devinfo->devtype : ""),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_TOKEN_DELIMIT);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((tokp = (char *)malloc(strlen(devinfo->devopts) +1)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strcpy(tokp, devinfo->devopts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tok = strtok_r(tokp, KV_DELIMITER, &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s", tok);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk count = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while ((tok = strtok_r(NULL, KV_DELIMITER, &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (count)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s", KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s", tok);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk count++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s", devinfo->devopts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_new_entry -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes the new devalloc_t to device_allocate or the new devmap_t to
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device_maps.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_write_new_entry(FILE *fp, da_args *dargs, int flag)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int count;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *tok = NULL, *tokp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *lasts;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo_t *devinfo = dargs->devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_MAPS_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto dmap_only;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (fseek(fp, (off_t)0, SEEK_END) == (off_t)-1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n\t",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devname ? devinfo->devname : ""), KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n\t",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devtype ? devinfo->devtype : ""), KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (devinfo->devopts == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n\t", DA_RESERVED,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((tokp = (char *)malloc(strlen(devinfo->devopts) + 1))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strcpy(tokp, devinfo->devopts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tok = strtok_r(tokp, KV_TOKEN_DELIMIT, &lasts)) !=
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s", tok);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk count = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while ((tok = strtok_r(NULL, KV_TOKEN_DELIMIT,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (count)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_TOKEN_DELIMIT "\\\n\t");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s", tok);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk count++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (count)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_DELIMITER "\\\n\t");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s", devinfo->devopts,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_DELIMITER "\\\n\t");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n\t", DA_RESERVED, KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n\t",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devauths ? devinfo->devauths : DA_ANYUSER),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s\n",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devexec ? devinfo->devexec : KV_DELIMITER));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkdmap_only:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_ALLOC_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (fseek(fp, (off_t)0, SEEK_END) == (off_t)-1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devname ? devinfo->devname : ""), KV_TOKEN_DELIMIT);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "\t%s%s\\\n",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devtype ? devinfo->devtype : ""), KV_TOKEN_DELIMIT);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "\t%s\n",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devlist ? devinfo->devlist : KV_TOKEN_DELIMIT));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _da_lock_devdb -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * locks the database files; lock can be either broken explicitly by
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * closing the fd of the lock file, or it expires automatically at process
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * termination.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns fd of the lock file or -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_da_lock_devdb(char *rootdir)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int lockfd = -1;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj int ret;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj int count = 0;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj int retry = 10;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj int retry_sleep;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj uint_t seed;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *lockfile;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char path[MAXPATHLEN];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int size = sizeof (path);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rootdir == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lockfile = DA_DB_LOCK;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk path[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(path, size, "%s%s", rootdir, DA_DB_LOCK) >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lockfile = path;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((lockfd = open(lockfile, O_RDWR | O_CREAT, 0600)) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* cannot open lock file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fchown(lockfd, DA_UID, DA_GID);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lseek(lockfd, (off_t)0, SEEK_SET) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* cannot position lock file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj errno = 0;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj while (retry > 0) {
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj count++;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj seed = (uint_t)gethrtime();
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj ret = lockf(lockfd, F_TLOCK, 0);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj if (ret == 0) {
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj (void) utime(lockfile, NULL);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj return (lockfd);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj }
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj if ((errno != EACCES) && (errno != EAGAIN)) {
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj /* cannot set lock */
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj (void) close(lockfd);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj return (-1);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj }
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj retry--;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj retry_sleep = rand_r(&seed)/((RAND_MAX + 2)/3) + count;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj (void) sleep(retry_sleep);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj errno = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_open_devdb -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * opens one or both database files - device_allocate, device_maps - in
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * the specified mode.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * locks the database files; lock is either broken explicitly by the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * caller by closing the lock file fd, or it expires automatically at
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * process termination.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes the file pointer of opened file in the input args - dafp, dmfp.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns fd of the lock file on success, -2 if database file does not
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * exist, -1 on other errors.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_open_devdb(char *rootdir, FILE **dafp, FILE **dmfp, int flag)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int oflag = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int fda = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int fdm = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int lockfd = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *fname;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *fmode;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char path[MAXPATHLEN];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk FILE *devfile;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((dafp == NULL) && (dmfp == NULL))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_RDWR) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk oflag = DA_RDWR;
004388ebfdfe2ed7dfd2d153a876dfcc22d2c006casper fmode = "r+F";
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (flag & DA_RDONLY) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk oflag = DA_RDONLY;
004388ebfdfe2ed7dfd2d153a876dfcc22d2c006casper fmode = "rF";
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((lockfd = _da_lock_devdb(rootdir)) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((dafp == NULL) || (flag & DA_MAPS_ONLY))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto dmap_only;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk path[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * open the device allocation file
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rootdir == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fname = DEVALLOC;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(path, sizeof (path), "%s%s", rootdir,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DEVALLOC) >= sizeof (path)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd != -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fname = path;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((fda = open(fname, oflag, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd != -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return ((errno == ENOENT) ? -2 : -1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((devfile = fdopen(fda, fmode)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fda);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd != -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *dafp = devfile;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fchmod(fda, DA_DBMODE);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((flag & DA_ALLOC_ONLY))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto out;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkdmap_only:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk path[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * open the device map file
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rootdir == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fname = DEVMAP;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(path, sizeof (path), "%s%s", rootdir,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DEVMAP) >= sizeof (path)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fda);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd != -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk fname = path;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((fdm = open(fname, oflag, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd != -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return ((errno == ENOENT) ? -2 : -1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((devfile = fdopen(fdm, fmode)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fdm);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(fda);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd != -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *dmfp = devfile;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fchmod(fdm, DA_DBMODE);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkout:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _record_on_off -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * adds either DA_ON_STR or DA_OFF_STR to device_allocate
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic int
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_record_on_off(da_args *dargs, FILE *tafp, FILE *dafp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int dafd;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int nsize;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int nitems = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int actionlen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int str_found = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int len = 0, nlen = 0, plen = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *ptr = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *actionstr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *nbuf = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char line[MAX_CANON];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat dastat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ON)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk actionstr = DA_ON_STR;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk actionstr = DA_OFF_STR;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk actionlen = strlen(actionstr);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dafd = fileno(dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (fstat(dafd, &dastat) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* check the old device_allocate for on/off string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ptr = fgets(line, MAX_CANON, dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (ptr != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((strcmp(line, DA_ON_STR) == 0) ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strcmp(line, DA_OFF_STR) == 0)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk str_found = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nsize = dastat.st_size;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!ptr || !str_found) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * the file never had either the on or the off string;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * make room for it.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk str_found = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nsize = dastat.st_size + actionlen + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((nbuf = (char *)malloc(nsize + 1)) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nbuf[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* put the on/off string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strcpy(nbuf, actionstr);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = strlen(nbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen = nlen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (ptr && !str_found) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* now put the first line that we read in fgets */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = plen + strlen(line) + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk len = snprintf(nbuf + plen, nlen - plen, "%s", line);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len >= nsize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(nbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen += len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* now get the rest of the old file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (fgets(line, MAX_CANON, dafp) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = plen + strlen(line) + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk len = snprintf(nbuf + plen, nlen - plen, "%s", line);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len >= nsize) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(nbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen += len;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk len = strlen(nbuf) + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (len < nsize)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nbuf[len] = '\n';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* write the on/off str + the old device_allocate to the temp file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (fwrite(nbuf, nsize, nitems, tafp) < nitems) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(nbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(nbuf);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_update_defattrs -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes default attributes to devalloc_defaults
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_update_defattrs(da_args *dargs)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rc = 0, lockfd = 0, tmpfd = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *defpath = DEFATTRS;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *tmpdefpath = TMPATTRS;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk FILE *tmpfp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat dstat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *head_defent = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((lockfd = _da_lock_devdb(NULL)) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tmpfd = open(tmpdefpath, O_RDWR|O_CREAT, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fchown(tmpfd, DA_UID, DA_GID);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tmpfp = fdopen(tmpfd, "r+")) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tmpfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(tmpdefpath);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * examine all entries, remove an old one if required, check
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * if a new one needs to be added.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (stat(defpath, &dstat) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((rc = _build_defattrs(dargs, &head_defent)) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tmpfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(tmpdefpath);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * write back any existing entries.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _write_defattrs(tmpfp, head_defent);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD && !(dargs->optflag & DA_NO_OVERRIDE)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* add new entries */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = _write_new_defattrs(tmpfp, dargs);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(tmpfp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(tmpfp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rename(tmpdefpath, defpath) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(tmpdefpath);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_update_device -
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Writes existing entries and the SINGLE change requested by da_args,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * to device_allocate and device_maps.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_update_device(da_args *dargs)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int rc;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int tafd = -1, tmfd = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int lockfd = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *rootdir = NULL;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj char *apathp = NULL, *mpathp = NULL;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj char *dapathp = NULL, *dmpathp = NULL;
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj char apath[MAXPATHLEN], mpath[MAXPATHLEN];
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj char dapath[MAXPATHLEN], dmpath[MAXPATHLEN];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk FILE *tafp = NULL, *tmfp = NULL, *dafp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat dastat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo_t *devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *head_devmapp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strentry_t *head_devallocp = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rootdir = dargs->rootdir;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo = dargs->devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * adding/removing entries should be done in both
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device_allocate and device_maps. updates can be
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * done in both or either of the files.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD || dargs->optflag & DA_REMOVE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ALLOC_ONLY ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dargs->optflag & DA_MAPS_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * name, type and list are required fields for adding a new
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((dargs->optflag & DA_ADD) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk ((devinfo->devname == NULL) ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devtype == NULL) ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devlist == NULL))) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rootdir != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(apath, sizeof (apath), "%s%s", rootdir,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk TMPALLOC) >= sizeof (apath))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk apathp = apath;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(dapath, sizeof (dapath), "%s%s", rootdir,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DEVALLOC) >= sizeof (dapath))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dapathp = dapath;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(dargs->optflag & DA_ALLOC_ONLY)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(mpath, sizeof (mpath), "%s%s", rootdir,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk TMPMAP) >= sizeof (mpath))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mpathp = mpath;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (snprintf(dmpath, sizeof (dmpath), "%s%s", rootdir,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DEVMAP) >= sizeof (dmpath))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dmpathp = dmpath;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk apathp = TMPALLOC;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dapathp = DEVALLOC;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mpathp = TMPMAP;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dmpathp = DEVMAP;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_MAPS_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto dmap_only;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Check if we are here just to record on/off status of
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device_allocation.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ON || dargs->optflag & DA_OFF)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lockfd = da_open_devdb(dargs->rootdir, &dafp, NULL,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DA_RDONLY|DA_ALLOC_ONLY);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lockfd = _da_lock_devdb(rootdir);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (lockfd == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tafd = open(apathp, O_RDWR|O_CREAT, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fchown(tafd, DA_UID, DA_GID);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tafp = fdopen(tafd, "r+")) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tafd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(apathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * We don't need to parse the file if we are here just to record
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * on/off status of device_allocation.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ON || dargs->optflag & DA_OFF) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_record_on_off(dargs, tafp, dafp) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tafd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(apathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(dafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto out;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * If reacting to a hotplug, read the file entries,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * figure out what dname (tname + a new number) goes to the
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * device being added/removed, and create a good head_devallocp and
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * head_devmapp with everything good still in it (_rebuild_lists)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Else examine all the entries, remove an old one if it is
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * a duplicate with a device being added, returning the
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * remaining list (_build_lists.)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * We need to do this only if the file exists already.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Once we have built these lists, we need to free the strings
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * in the head_* arrays before returning.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (stat(dapathp, &dastat) == 0) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* for device allocation, the /etc files are the "master" */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((dargs->optflag & (DA_ADD| DA_EVENT)) &&
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (!(dargs->optflag & DA_FORCE)))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel rc = _rebuild_lists(dargs, &head_devallocp,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel &head_devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel else
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel rc = _build_lists(dargs, &head_devallocp,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel &head_devmapp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (rc != 0 && rc != 1) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) close(tafd);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) unlink(apathp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) close(lockfd);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel } else
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel rc = 0;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((dargs->optflag & DA_REMOVE) && (rc == 0)) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) close(tafd);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) unlink(apathp);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel (void) close(lockfd);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * TODO: clean up the workings of DA_UPDATE.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Due to da_match looking at fields that are missing
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * in dargs for DA_UPDATE, the da_match call returns no match,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * but due to the way _da2str combines the devalloc_t info with
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * the *dargs info, the DA_ADD_ZONE and DA_REMOVE_ZONE work.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * This would not scale if any type of update was ever needed
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * from the daemon.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Write out devallocp along with the devalloc on/off string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _write_device_allocate(dapathp, tafp, head_devallocp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ALLOC_ONLY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto out;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkdmap_only:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tmfd = open(mpathp, O_RDWR|O_CREAT, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tafd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(apathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fchown(tmfd, DA_UID, DA_GID);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tmfp = fdopen(tmfd, "r+")) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tafd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(apathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(tmfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(mpathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Write back any non-removed pre-existing entries.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (head_devmapp != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk _write_device_maps(tmfp, head_devmapp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkout:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Add any new entries here.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD && !(dargs->optflag & DA_NO_OVERRIDE)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* add any new entries */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = _write_new_entry(tafp, dargs, DA_ALLOC_ONLY);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(tafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = _write_new_entry(tmfp, dargs, DA_MAPS_ONLY);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(tmfp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (tafp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(tafp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (tmfp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fclose(tmfp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(dargs->optflag & DA_MAPS_ONLY)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rename(apathp, dapathp) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(apathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(dargs->optflag & DA_ALLOC_ONLY)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rename(mpathp, dmpathp) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = -1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) unlink(mpathp);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) close(lockfd);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (rc);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_add_list -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * adds new /dev link name to the linked list of devices.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 if link added successfully, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_add_list(devlist_t *dlist, char *link, int new_instance, int flag)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int instance;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int nlen, plen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int new_entry = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *dtype, *dexec, *tname, *kval;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *minstr = NULL, *maxstr = NULL;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel char dname[DA_MAXNAME + 1];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk kva_t *kva;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk deventry_t *dentry = NULL, *nentry = NULL, *pentry = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk da_defs_t *da_defs;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dlist == NULL || link == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dname[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_AUDIO) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->audio;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tname = DA_AUDIO_NAME;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dtype = DA_AUDIO_TYPE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dexec = DA_DEFAULT_AUDIO_CLEAN;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (flag & DA_CD) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->cd;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tname = DA_CD_NAME;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dtype = DA_CD_TYPE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dexec = DA_DEFAULT_DISK_CLEAN;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (flag & DA_FLOPPY) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->floppy;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tname = DA_FLOPPY_NAME;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dtype = DA_FLOPPY_TYPE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dexec = DA_DEFAULT_DISK_CLEAN;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (flag & DA_TAPE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->tape;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tname = DA_TAPE_NAME;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dtype = DA_TAPE_TYPE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dexec = DA_DEFAULT_TAPE_CLEAN;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else if (flag & DA_RMDISK) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->rmdisk;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk tname = DA_RMDISK_NAME;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dtype = DA_RMDISK_TYPE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dexec = DA_DEFAULT_DISK_CLEAN;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (nentry = dentry; nentry != NULL; nentry = nentry->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk pentry = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) sscanf(nentry->devinfo.devname, "%*[a-z]%d", &instance);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (nentry->devinfo.instance == new_instance)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Add the new link name to the list of links
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * that the device 'dname' has.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (nentry == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Either this is the first entry ever, or no matching entry
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * was found. Create a new one and add to the list.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dentry == NULL) /* first entry ever */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk instance = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else /* no matching entry */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk instance++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(dname, sizeof (dname), "%s%d", tname, instance);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((nentry = (deventry_t *)malloc(sizeof (deventry_t))) ==
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (pentry != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk pentry->next = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk new_entry = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devname = strdup(dname);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devtype = dtype;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devauths = DEFAULT_DEV_ALLOC_AUTH;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devexec = dexec;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.instance = new_instance;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Look for default label range, authorizations and cleaning
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * program in devalloc_defaults. If label range is not
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * specified in devalloc_defaults, assume it to be admin_low
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * to admin_high.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk minstr = DA_DEFAULT_MIN;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk maxstr = DA_DEFAULT_MAX;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk setdadefent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (da_defs = getdadeftype(nentry->devinfo.devtype)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk kva = da_defs->devopts;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((kval = kva_match(kva, DAOPT_MINLABEL)) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk minstr = strdup(kval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((kval = kva_match(kva, DAOPT_MAXLABEL)) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk maxstr = strdup(kval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((kval = kva_match(kva, DAOPT_AUTHS)) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devauths = strdup(kval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((kval = kva_match(kva, DAOPT_CSCRIPT)) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devexec = strdup(kval);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk freedadefent(da_defs);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk enddadefent();
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk kval = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = strlen(DAOPT_MINLABEL) + strlen(KV_ASSIGN) +
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strlen(minstr) + strlen(KV_TOKEN_DELIMIT) +
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strlen(DAOPT_MAXLABEL) + strlen(KV_ASSIGN) + strlen(maxstr)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk + 1; /* +1 for terminator */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (kval = (char *)malloc(nlen))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(kval, nlen, "%s%s%s%s%s%s%s",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DAOPT_MINLABEL, KV_ASSIGN, minstr, KV_TOKEN_DELIMIT,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk DAOPT_MAXLABEL, KV_ASSIGN, maxstr);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devopts = kval;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->devinfo.devlist = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nentry->next = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = strlen(link) + 1; /* +1 terminator */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (nentry->devinfo.devlist) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen = strlen(nentry->devinfo.devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = nlen + plen + 1; /* +1 for blank to separate entries */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((nentry->devinfo.devlist =
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (char *)realloc(nentry->devinfo.devlist, nlen)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (new_entry) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(nentry->devinfo.devname);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(nentry);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (pentry != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk pentry->next = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (plen == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(nentry->devinfo.devlist, nlen, "%s", link);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(nentry->devinfo.devlist + plen, nlen - plen,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk " %s", link);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (pentry == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * This is the first entry of this device type.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_AUDIO)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->audio = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_CD)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->cd = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_FLOPPY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->floppy = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_TAPE)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->tape = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_RMDISK)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->rmdisk = nentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_remove_list -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * removes a /dev link name from the linked list of devices.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns type of device if link for that device removed
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * successfully, else returns -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * if all links for a device are removed, stores that device
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * name in devname.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_remove_list(devlist_t *dlist, char *link, int type, char *devname, int size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int flag;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int remove_dev = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int nlen, plen, slen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *lasts, *lname, *oldlist;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk struct stat rmstat;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk deventry_t *dentry, *current, *prev;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (type != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk flag = type;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (link == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (strstr(link, DA_AUDIO_NAME) || strstr(link, DA_SOUND_NAME))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk flag = DA_AUDIO;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (strstr(link, "dsk") || strstr(link, "rdsk") ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strstr(link, "sr") || strstr(link, "rsr"))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk flag = DA_CD;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (strstr(link, "fd") || strstr(link, "rfd") ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk strstr(link, "diskette") || strstr(link, "rdiskette"))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk flag = DA_FLOPPY;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (strstr(link, DA_TAPE_NAME))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk flag = DA_TAPE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk flag = DA_RMDISK;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk switch (type) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case DA_AUDIO:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->audio;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case DA_CD:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->cd;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case DA_FLOPPY:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->floppy;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case DA_TAPE:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->tape;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case DA_RMDISK:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = dlist->rmdisk;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk default:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((type != NULL) && (link == NULL)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (current = dentry, prev = dentry; current != NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current = current->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk oldlist = strdup(current->devinfo.devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (lname = strtok_r(oldlist, " ", &lasts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lname != NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lname = strtok_r(NULL, " ", &lasts)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (stat(lname, &rmstat) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk remove_dev = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk goto remove_dev;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk prev = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (current = dentry, prev = dentry; current != NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current = current->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen = strlen(current->devinfo.devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = strlen(link);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (plen == nlen) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(current->devinfo.devlist, link) == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* last name in the list */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk remove_dev = 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strstr(current->devinfo.devlist, link)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = plen - nlen + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk oldlist = strdup(current->devinfo.devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((current->devinfo.devlist =
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (char *)realloc(current->devinfo.devlist,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(oldlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current->devinfo.devlist[0] = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = plen = slen = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (lname = strtok_r(oldlist, " ", &lasts);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lname != NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk lname = strtok_r(NULL, " ", &lasts)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(lname, link) == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = strlen(lname) + plen + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (plen == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen =
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk snprintf(current->devinfo.devlist,
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj nlen, "%s", lname);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen =
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk snprintf(current->devinfo.devlist +
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj plen, nlen - plen, " %s", lname);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk plen = plen + slen + 1;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(oldlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk prev = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkremove_dev:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (remove_dev == 1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcpy(devname, current->devinfo.devname, size);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(current->devinfo.devname);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(current->devinfo.devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current->devinfo.devname = current->devinfo.devlist = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk prev->next = current->next;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk free(current);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((remove_dev == 1) && (prev->devinfo.devname == NULL)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (prev->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * what we removed above was the first entry
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * in the list. make the next entry to be the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * first.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current = prev->next;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk } else {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * the matching entry was the only entry in the list
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * for this type.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_AUDIO)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->audio = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_CD)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->cd = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_FLOPPY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->floppy = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_TAPE)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->tape = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_RMDISK)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dlist->rmdisk = current;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (flag);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel/*
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * da_rm_list_entry -
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * The adding of devnames to a devlist and the removal of a
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * device are not symmetrical -- hot_cleanup gives a /devices
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * name which is used to remove the dentry whose links all point to
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * that /devices entry.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * The link argument is present if available to make debugging
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * easier.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * da_rm_list_entry removes an entry from the linked list of devices.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Returns 1 if the devname was removed successfully,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * 0 if not found, -1 for error.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel/*ARGSUSED*/
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelint
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelda_rm_list_entry(devlist_t *dlist, char *link, int type, char *devname)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel{
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel int retval = 0;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel deventry_t **dentry, *current, *prev;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel switch (type) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel case DA_AUDIO:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dentry = &(dlist->audio);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel case DA_CD:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dentry = &(dlist->cd);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel case DA_FLOPPY:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dentry = &(dlist->floppy);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel case DA_TAPE:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dentry = &(dlist->tape);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel case DA_RMDISK:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel dentry = &(dlist->rmdisk);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel default:
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (-1);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* Presumably in daemon mode, no need to remove entry, list is empty */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (*dentry == (deventry_t *)NULL)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (0);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel prev = NULL;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel for (current = *dentry; current != NULL;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel prev = current, current = current->next) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (strcmp(devname, current->devinfo.devname))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel continue;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel retval = 1;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel break;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel }
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (retval == 0)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (0);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(current->devinfo.devname);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (current->devinfo.devlist != NULL)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(current->devinfo.devlist);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (current->devinfo.devopts != NULL)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(current->devinfo.devopts);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (prev == NULL)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel *dentry = current->next;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel else
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel prev->next = current->next;
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel free(current);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (retval);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel}
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_is_on -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * checks if device allocation feature is turned on.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 1 if on, 0 if off, -1 if status string not
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * found in device_allocate.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkint
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_is_on()
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (getdaon());
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_print_device -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * debug routine to print device entries.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkvoid
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_print_device(int flag, devlist_t *devlist)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk deventry_t *entry, *dentry;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo_t *devinfo;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (flag & DA_AUDIO)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = devlist->audio;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_CD)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = devlist->cd;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_FLOPPY)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = devlist->floppy;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_TAPE)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = devlist->tape;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (flag & DA_RMDISK)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk dentry = devlist->rmdisk;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (entry = dentry; entry != NULL; entry = entry->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk devinfo = &(entry->devinfo);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(stdout, "name: %s\n", devinfo->devname);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(stdout, "type: %s\n", devinfo->devtype);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(stdout, "auth: %s\n", devinfo->devauths);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(stdout, "exec: %s\n", devinfo->devexec);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(stdout, "list: %s\n\n", devinfo->devlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}