/* * 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*/ /* * listdev.c * * Contains: * listdev() List attributes defined for a device */ /* * Header files needed: * System Data Types * Standard string definitions * Device management definitions * "devtab.h" Local device table definitions */ #include #include #include #include "devtab.h" #include /* * 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(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 . * * 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(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 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) != NULL) { do n++; while ((attrval = attrval->next) != NULL); } noerror = TRUE; if (list = malloc(n*sizeof (char *))) { pp = list; if (devtabent->alias) { if (*pp = malloc(strlen(DTAB_ALIAS)+1)) (void) strcpy(*pp++, DTAB_ALIAS); else noerror = FALSE; } if (noerror && devtabent->bdevice) { if (*pp = malloc(strlen(DTAB_BDEVICE)+1)) (void) strcpy(*pp++, DTAB_BDEVICE); else noerror = FALSE; } if (noerror && devtabent->cdevice) { if (*pp = malloc(strlen(DTAB_CDEVICE)+1)) (void) strcpy(*pp++, DTAB_CDEVICE); else noerror = FALSE; } if (noerror && devtabent->pathname) { if (*pp = malloc(strlen(DTAB_PATHNAME)+1)) (void) strcpy(*pp++, DTAB_PATHNAME); else noerror = FALSE; } if (noerror && (attrval = devtabent->attrlist)) { do { if (*pp = malloc(strlen(attrval->attr)+1)) (void) strcpy(*pp++, attrval->attr); else noerror = FALSE; } while (noerror && (attrval = attrval->next)); } if (noerror) { *pp = NULL; sortlist(list); rtnval = list; } else { for (pp = list; *pp; pp++) free(*pp); free(list); rtnval = NULL; } } else rtnval = NULL; } else rtnval = NULL; _enddevtab(); /* Fini */ return (rtnval); }