Files
Arquivotheca.Solaris-2.5/lib/libadm/devattr.c
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

172 lines
4.3 KiB
C
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ident "@(#)devattr.c 1.3 92/07/14 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 <devmgmt.h>
#include "devtab.h"
/*
* Externals referenced
* malloc() Allocates space from main memory
* oam_devtab FILE * to the opened device table
*/
extern void *malloc();
extern FILE *oam_devtab;
/*
* 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(device, attribute)
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((char *) 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 != (char *) NULL) ? record->alias : "" ;
found = TRUE;
}
/* Did they ask for the character-special device? */
else if (strcmp(attribute, DTAB_CDEVICE) == 0) {
val = (record->cdevice != (char *) NULL) ? record->cdevice : "" ;
found = TRUE;
}
/* Did they ask for the block-special device? */
else if (strcmp(attribute, DTAB_BDEVICE) == 0)
{
val = (record->bdevice != (char *) NULL) ? record->bdevice : "" ;
found = TRUE;
}
/* Did they ask for the pathname? */
else if (strcmp(attribute, DTAB_PATHNAME) == 0)
{
val = (record->pathname != (char *) 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 = (char *) malloc((unsigned) strlen(val)+1))
(void) strcpy(rtnval, val);
else errno = ENOMEM;
} else {
rtnval = (char *) NULL;
errno = EINVAL;
}
/* Free the space allocated to the struct devtabent structure */
_freedevtabent(record);
_enddevtab();
/* Fini */
return(rtnval);
}