diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libadm/common/devattr.c | |
download | illumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libadm/common/devattr.c')
-rw-r--r-- | usr/src/lib/libadm/common/devattr.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/usr/src/lib/libadm/common/devattr.c b/usr/src/lib/libadm/common/devattr.c new file mode 100644 index 0000000000..c64a589ea9 --- /dev/null +++ b/usr/src/lib/libadm/common/devattr.c @@ -0,0 +1,181 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + + +/* + * Copyright (c) 1997, by Sun Microsystems, Inc. + * All rights reserved. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.2 */ + +/*LINTLIBRARY*/ + +/* + * devattr.c + * + * Contents: + * devattr() Get the value of a attribute for a specific device + */ + +/* + * Header files needed + * <sys/types.h> System Data Types + * <stdio.h> Standard I/O Definitions + * <errno.h> Error-value definitions + * <string.h> String function and constant definitions + * <devmgmt.h> Device table definitions available to the world + * "devtab.h" Local device table definitions + */ + +#include <sys/types.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> +#include <devmgmt.h> +#include "devtab.h" + +/* + * Local constant definitions + */ + + +/* + * Local static data + */ + +/* + * char *devattr(device, attr) + * + * This function searches the device table, looking for the device + * specified by <device>. If it finds a record corresponding to that + * device (see below for a definition of that correspondence), it + * extracts the value of the field <attr> from that record, if any. + * It returns a pointer to that value, or (char *) NULL if none. + * + * Arguments: + * device Pointer to the character-string that describes the + * device whose record is to be looked for + * attr The device's attribute to be looked for + * + * Returns: char * + * A pointer to the character-string containing the value of the + * attribute <attr> for the device <device>, or (char *) NULL if none + * was found. If the function returns (char *) NULL and the error was + * detected by this function, it sets "errno" to indicate the problem. + * + * "errno" Values: + * EPERM Permissions deny reading access of the device-table + * file + * ENOENT The specified device-table file could not be found + * ENODEV Device not found in the device table + * EINVAL The device does not have that attribute defined + * ENOMEM No memory available + */ + +char * +devattr( + char *device, /* The device ) we're to look for */ + char *attribute) /* The attribute to extract */ +{ + /* Automatic data */ + struct devtabent *record; /* Retrieved record */ + struct attrval *p; /* attr/val records */ + char *val; /* Extracted value */ + char *rtnval; /* Value to return */ + int found; /* TRUE if attribute found */ + + + /* Get the record for the specified device */ + if (!(record = _getdevrec(device))) { + _enddevtab(); + return (NULL); + } + + /* Search the record for the specified attribute */ + found = FALSE; + + /* Did they ask for the device alias? */ + if (strcmp(attribute, DTAB_ALIAS) == 0) { + val = (record->alias != NULL) ? record->alias : ""; + found = TRUE; + } + + /* Did they ask for the character-special device? */ + else if (strcmp(attribute, DTAB_CDEVICE) == 0) { + val = (record->cdevice != NULL) ? record->cdevice : ""; + found = TRUE; + } + + /* Did they ask for the block-special device? */ + else if (strcmp(attribute, DTAB_BDEVICE) == 0) { + val = (record->bdevice != NULL) ? record->bdevice : ""; + found = TRUE; + } + + /* Did they ask for the pathname? */ + else if (strcmp(attribute, DTAB_PATHNAME) == 0) { + val = (record->pathname != NULL) ? record->pathname : ""; + found = TRUE; + } + + else { + + /* + * Didn't ask for one of the easy ones, search the attr/val + * structure + */ + + p = record->attrlist; + while (!found && (p)) { + if (strcmp(p->attr, attribute) == 0) { + val = p->val; + found = TRUE; + } else p = p->next; + } + } + + /* + * If the attribute was found, copy it into malloc()ed space. + * If not, set errno appropriately; we'll return NULL + */ + + if (found) { + if (rtnval = malloc(strlen(val)+1)) + (void) strcpy(rtnval, val); + else errno = ENOMEM; + } else { + rtnval = NULL; + errno = EINVAL; + } + + /* Free the space allocated to the struct devtabent structure */ + _freedevtabent(record); + + _enddevtab(); + + /* Fini */ + return (rtnval); +} |