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

198 lines
4.6 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 "@(#)listdev.c 1.3 92/07/14 SMI" /* SVr4.0 1.2 */
/*LINTLIBRARY*/
/*
* listdev.c
*
* Contains:
* listdev() List attributes defined for a device
*/
/*
* Header files needed:
* <sys/types.h> System Data Types
* <string.h> Standard string definitions
* <devmgmt.h> Device management definitions
* "devtab.h" Local device table definitions
*/
#include <sys/types.h>
#include <string.h>
#include <devmgmt.h>
#include "devtab.h"
/*
* Externals Referenced:
* malloc() Allocate a chunk of main memory
* free() Free malloc()ed memory
*/
extern void *malloc();
extern void free();
/*
* Local Definitions:
*/
/*
* Local, Static data:
*/
/*
* void sortlist(list)
* char **list
*
* This function sorts a list of character strings
* so that the list is ordered alphabetically.
*
* Arguments:
* list The list to be sorted
*
* Returns: void
*/
static void
sortlist(list)
char **list; /* List to be sorted */
{
char **pp; /* Pointer to item being sorted */
char **qq;
char **rr;
char *t; /* Temp for swapping pointers */
/* If the list isn't empty ... */
if (*list) {
/* Find the last item in the list */
for (pp = list ; *pp ; pp++) ;
--pp;
/*
* Sort 'em by sorting larger and larger portions
* of the list (my CSC101 fails me, I forget what
* this sort is called!) [Where I come from, CS
* is Crop Science...]
*/
while (pp != list) {
qq = pp;
rr = --pp;
while (*qq && (strcmp(*rr, *qq) > 0)) {
t = *rr;
*rr++ = *qq;
*qq++ = t;
}
}
}
}
/*
* char **listdev(device)
* char *device;
*
* Generate an alphabetized list of attribute names of the
* attributes defined for the device <device>.
*
* Arguments:
* device Device who's attributes are to be listed
*
* Returns: char **
* List of attribute names of the attributes defined for this
* device. (Never empty since all devices have the "alias"
* attribute defined.)
*/
char **
listdev(device)
char *device; /* Device to describe */
{
/* Automatic data */
struct devtabent *devtabent; /* Ptr to devtab entry */
struct attrval *attrval; /* Ptr to attr val pair */
char **list; /* Ptr to alloc'd list */
char **rtnval; /* Value to return */
char **pp; /* Ptr to current val in list */
int noerror; /* FLAG, TRUE if :-) */
int n; /* Temp counter */
/* If the device <device> is defined ... */
if (devtabent = _getdevrec(device)) {
/*
* Count the number of attributes defined for the device
* being sure to count the (char *) NULL that terminates
* the list
*/
n = 1;
if (devtabent->alias) n++; /* Alias, if defined */
if (devtabent->cdevice) n++; /* Char spcl, if defined */
if (devtabent->bdevice) n++; /* Blk spcl, if defined */
if (devtabent->pathname) n++; /* Pathname, if defined */
/* Other attributes, if any */
if (attrval = devtabent->attrlist) {
do
n++;
while (attrval = attrval->next);
}
noerror = TRUE;
if (list = (char **) malloc((unsigned) n*sizeof(char *))) {
pp = list;
if (devtabent->alias) {
if (*pp = (char *) malloc((unsigned) strlen(DTAB_ALIAS)+1))
(void) strcpy(*pp++, DTAB_ALIAS);
else noerror = FALSE;
}
if (noerror && devtabent->bdevice) {
if (*pp = (char *) malloc((unsigned) strlen(DTAB_BDEVICE)+1))
(void) strcpy(*pp++, DTAB_BDEVICE);
else noerror = FALSE;
}
if (noerror && devtabent->cdevice) {
if (*pp = (char *) malloc((unsigned) strlen(DTAB_CDEVICE)+1))
(void) strcpy(*pp++, DTAB_CDEVICE);
else noerror = FALSE;
}
if (noerror && devtabent->pathname) {
if (*pp = (char *) malloc((unsigned) strlen(DTAB_PATHNAME)+1))
(void) strcpy(*pp++, DTAB_PATHNAME);
else noerror = FALSE;
}
if (noerror && (attrval = devtabent->attrlist)) {
do {
if (*pp = (char *) malloc((unsigned) strlen(attrval->attr)+1))
(void) strcpy(*pp++, attrval->attr);
else noerror = FALSE;
} while (noerror && (attrval = attrval->next));
}
if (noerror) {
*pp = (char *) NULL;
sortlist(list);
rtnval = list;
}
else {
for (pp = list ; *pp ; pp++) free(*pp);
free((char *) list);
rtnval = (char **) NULL;
}
} else rtnval = (char **) NULL;
} else rtnval = (char **) NULL;
_enddevtab();
/* Fini */
return(rtnval);
}