45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * See the License for the specific language governing permissions
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and limitations under the License.
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 * CDDL HEADER END
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
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);
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);
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 * 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 * check if /etc/logindevperm exists and get its size
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * read and parse /etc/logindevperm
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue; /* ignore blank lines */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* invalid entry */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((ptr = strtok_r(NULL, field_delims, &lasts)) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* empty device list */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * check if devname exists in /etc/logindevperm
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device and devname may be one of these types -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* all wildcard types */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (1);
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_da_read_file(char *fname, char **fbuf, time_t *ftime, rwlock_t *flock,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* check the size and the time stamp on the file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
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 return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * verify that the file did not change just after we read it.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _update_zonename -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * add/remove current zone's name to the given devalloc_t.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (newsize == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If zone name was the only key/value pair,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * put 'reserved' in the empty slot.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (i = 0, j = 0; i < oldsize; i++) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _dmap2str -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * converts a device_map entry into a printable string
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*ARGSUSED*/
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel_dmap2str(devmap_t *dmp, char *buf, int size, const char *sep)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = snprintf(buf, size, "%s%s", dmp->dmap_devname, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _dmap2strentry -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * calls dmap2str to break given devmap_t into printable entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns pointer to decoded entry, NULL on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((sep = (strentry_t *)malloc(sizeof (strentry_t))) == NULL)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (_dmap2str(devmapp, sep->se_str, sizeof (sep->se_str),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fix_optstr -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * removes trailing ':' from buf.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *p = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _da2str -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * converts a device_allocate entry into a printable string
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_da2str(da_args *dargs, devalloc_t *dap, char *buf, int size, const char *sep,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk const char *osep)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (dnames = dargs->devnames; *dnames != NULL; dnames++) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = snprintf(buf, size, "%s%s", dap->da_devname, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((dap->da_devopts == NULL) || ((dap->da_devopts->length == 1) &&
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (strcmp(dap->da_devopts->data->key, DA_RESERVED) == 0))) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_kva2str(dap->da_devopts, buf + length, size - length,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _da2strentry -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * calls da2str to break given devalloc_t into printable entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns pointer to decoded entry, NULL on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((sep = (strentry_t *)malloc(sizeof (strentry_t))) == 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 * _def2str
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * converts da_defs_t into a printable string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_def2str(da_defs_t *da_defs, char *buf, int size, const char *sep)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk length = snprintf(buf, size, "%s%s", da_defs->devtype, sep);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_kva2str(da_defs->devopts, buf + length, size - length,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _def2strentry
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * calls _def2str to break given da_defs_t into printable entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns pointer decoded entry, NULL on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((sep = (strentry_t *)malloc(sizeof (strentry_t))) == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (_def2str(da_defs, sep->se_str, sizeof (sep->se_str),
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_build_defattrs(da_args *dargs, strentry_t **head_defent)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rc = !(strcmp(da_defs->devtype, dargs->devinfo->devtype));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * During DA_ADD, we keep an existing entry unless
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * we have DA_FORCE set to override that entry.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* retaining defattr entry: tmp_str->se_str */
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 * buf must be a buffer of size DA_MAX_NAME + 1
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* check safely for sizes */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_AUDIO_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_FLOPPY_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_FLOPPY_TYPE, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_TAPE_NAME, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_TAPE_TYPE, DA_MAXNAME);
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) strlcpy(namebuf, DA_RMDISK_NAME, DA_MAXNAME);
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 return (-1);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * _rebuild_lists -
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 * 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 * 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.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * It is an error for it to already be there, if it is allocatable.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Returns 0 if successful and 2 on error.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Returns 0 if not found, 1 if found, 2 on error.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel_rebuild_lists(da_args *dargs, strentry_t **head_devallocp,
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel char defname[DA_MAXNAME + 1]; /* default name for type */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel char errmsg[DA_MAXNAME + 1 + (PATH_MAX * 2) + 80];
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (dargs->optflag & (DA_MAPS_ONLY | DA_ALLOC_ONLY))
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* read both files, maps first so we can compare actual devices */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* build device_maps */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((rc = dmap_matchtype(devmapp, dargs->devinfo->devtype))
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* if need to free and safe to free */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel continue; /* don't retain */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Need to know which suffixes are in use
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if (rc == 0) {
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Same type, different device. Record
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * device suffix already in use, if
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * applicable.
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel * Match allocatable on add is an error
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * or mapping attempt returned error
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel "Cannot add %s on node %s",
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* add other transaction types as needed */
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 "Cannot add %s on node %s type %s",
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* retaining devmap entry: tmp_str->se_str */
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.
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 /* Future: support more than 64 hotplug devices per type? */
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 (strncmp(dargs->devinfo->devname, defname, len) == 0)) {
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel (void) snprintf(new_devname, DA_MAXNAME + 1, "%s%u",
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* if need to free and safe to free */
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 /* logging is on if DA_EVENT is set */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel "%s and %s out of sync,"
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel "%s only in %s.",
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* make list w/o this entry */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* retaining devalloc entry: tmp_str->se_str */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* the caller needs to know if a remove needs to rewrite files */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (0); /* Successful DA_ADD */
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_build_lists(da_args *dargs, strentry_t **head_devallocp,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* build device_allocate */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* if in _build_lists and DA_ADD is set, so is DA_FORCE */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* retaining devalloc entry: tmp_str->se_str */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* build device_maps */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (rc == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (2);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* retaining devmap entry: tmp_str->se_str */
399f067736e659e2754e97190952abea40f1d0d6Jan Parcel /* later code cleanup may cause the use of "found" in other cases */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_defattrs
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes current entries to devalloc_defaults.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_device_allocate -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes current entries in the list to device_allocate.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * frees the strings
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk_write_device_allocate(char *odevalloc, FILE *dafp, strentry_t *head_devallocp)
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 * _write_device_maps -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes current entries in the list to device_maps.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * and frees the strings
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic void
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * _write_new_defattrs
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes the new entry to devalloc_defaults.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s", (devinfo->devtype ? devinfo->devtype : ""),
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((tokp = (char *)malloc(strlen(devinfo->devopts) +1)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tok = strtok_r(tokp, KV_DELIMITER, &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while ((tok = strtok_r(NULL, KV_DELIMITER, &lasts)) != NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
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 return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devname ? devinfo->devname : ""), KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devtype ? devinfo->devtype : ""), KV_DELIMITER);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel if ((tokp = (char *)malloc(strlen(devinfo->devopts) + 1))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(fp, "%s%s\\\n\t", DA_RESERVED, KV_DELIMITER);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devname ? devinfo->devname : ""), KV_TOKEN_DELIMIT);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devtype ? devinfo->devtype : ""), KV_TOKEN_DELIMIT);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (devinfo->devlist ? devinfo->devlist : KV_TOKEN_DELIMIT));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
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 if (snprintf(path, size, "%s%s", rootdir, DA_DB_LOCK) >= size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((lockfd = open(lockfile, O_RDWR | O_CREAT, 0600)) == -1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* cannot open lock file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* cannot position lock file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj while (retry > 0) {
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj if (ret == 0) {
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj /* cannot set lock */
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj return (-1);
10ddde3aee60d88fa580028fcf7642a87e80a2c6aj return (-1);
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.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_open_devdb(char *rootdir, FILE **dafp, FILE **dmfp, int flag)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * open the device allocation file
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * open the device map file
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
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 return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* check the old device_allocate for on/off string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * the file never had either the on or the off string;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * make room for it.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* put the on/off string */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* now put the first line that we read in fgets */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* now get the rest of the old file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* write the on/off str + the old device_allocate to the temp file */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_update_defattrs -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * writes default attributes to devalloc_defaults
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * returns 0 on success, -1 on error.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tmpfd = open(tmpdefpath, O_RDWR|O_CREAT, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * examine all entries, remove an old one if required, check
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * if a new one needs to be added.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * write back any existing entries.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD && !(dargs->optflag & DA_NO_OVERRIDE)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* add new entries */
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 return (0);
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 if (dargs->optflag & DA_ADD || dargs->optflag & DA_REMOVE) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * name, type and list are required fields for adding a new
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Check if we are here just to record on/off status of
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * device_allocation.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tafd = open(apathp, O_RDWR|O_CREAT, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * We don't need to parse the file if we are here just to record
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * on/off status of device_allocation.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ON || dargs->optflag & DA_OFF) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
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 * 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 * We need to do this only if the file exists already.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Once we have built these lists, we need to free the strings
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * in the head_* arrays before returning.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* for device allocation, the /etc files are the "master" */
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (-1);
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 * This would not scale if any type of update was ever needed
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * from the daemon.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Write out devallocp along with the devalloc on/off string.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((tmfd = open(mpathp, O_RDWR|O_CREAT, DA_DBMODE)) == -1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Write back any non-removed pre-existing entries.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Add any new entries here.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (dargs->optflag & DA_ADD && !(dargs->optflag & DA_NO_OVERRIDE)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* add any new entries */
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.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_add_list(devlist_t *dlist, char *link, int new_instance, int flag)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk deventry_t *dentry = NULL, *nentry = NULL, *pentry = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (nentry = dentry; nentry != NULL; nentry = nentry->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) sscanf(nentry->devinfo.devname, "%*[a-z]%d", &instance);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Add the new link name to the list of links
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * that the device 'dname' has.
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 else /* no matching entry */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(dname, sizeof (dname), "%s%d", tname, instance);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((nentry = (deventry_t *)malloc(sizeof (deventry_t))) ==
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
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 strlen(DAOPT_MAXLABEL) + strlen(KV_ASSIGN) + strlen(maxstr)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nlen = nlen + plen + 1; /* +1 for blank to separate entries */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (char *)realloc(nentry->devinfo.devlist, nlen)) == NULL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(nentry->devinfo.devlist, nlen, "%s", link);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) snprintf(nentry->devinfo.devlist + plen, nlen - plen,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * This is the first entry of this device type.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (0);
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.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkda_remove_list(devlist_t *dlist, char *link, int type, char *devname, int size)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk else if (strstr(link, DA_AUDIO_NAME) || strstr(link, DA_SOUND_NAME))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk switch (type) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* last name in the list */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (-1);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (plen == 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) strlcpy(devname, current->devinfo.devname, size);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk current->devinfo.devname = current->devinfo.devlist = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((remove_dev == 1) && (prev->devinfo.devname == NULL)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * what we removed above was the first entry
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * in the list. make the next entry to be the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * the matching entry was the only entry in the list
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * for this type.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * da_rm_list_entry -
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 * The link argument is present if available to make debugging
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * da_rm_list_entry removes an entry from the linked list of devices.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * Returns 1 if the devname was removed successfully,
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel * 0 if not found, -1 for error.
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcelda_rm_list_entry(devlist_t *dlist, char *link, int type, char *devname)
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel return (-1);
7e3e5701c73b753fb9dd17a0cbe0568b4cdda39eJan Parcel /* Presumably in daemon mode, no need to remove entry, list is empty */
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 return (getdaon());
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * da_print_device -
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * debug routine to print device entries.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (entry = dentry; entry != NULL; entry = entry->next) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (void) fprintf(stdout, "auth: %s\n", devinfo->devauths);