/* * 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. */ /*LINTLIBRARY*/ /* * listdgrp.c * * Contents: * listdgrp() List devices that belong to a device group. */ /* * Header files referenced: * System Data Types * UNIX and C error definitions * String handling definitions * Device management definitions * "devtab.h" Local device table definitions */ #include #include #include #include #include #include "devtab.h" /* * Local definitions */ /* * Structure definitions: */ /* * Local functions referenced */ /* * Global Data */ /* * Static Data */ /* * char **listdgrp(dgroup) * char *dgroup * * List the members of a device group. * * Arguments: * char *dgroup The device group needed * * Returns: char ** * A pointer to a list of pointers to char-strings containing * the members of the device group. * * Notes: * - malloc()ed space containing addresses */ char ** listdgrp(char *dgroup) /* The device group to list */ { /* Automatic data */ struct dgrptabent *dgrpent; /* Device group description */ struct member *member; /* Device group member */ char **listbuf; /* Buffer allocated for addrs */ char **rtnval; /* Value to return */ char **pp; /* Running ptr through addrs */ int noerror; /* Flag, TRUE if all's well */ int n; /* Counter */ /* * Initializations */ /* * Get the record for this device group */ if (dgrpent = _getdgrprec(dgroup)) { /* Count the number of members in the device group */ n = 1; for (member = dgrpent->membership; member; member = member->next) n++; /* Get space for the list to return */ if (listbuf = malloc(n*sizeof (char **))) { /* * For each member in the device group, add that device * name to the list of devices we're building */ pp = listbuf; noerror = TRUE; for (member = dgrpent->membership; noerror && member; member = member->next) { if (*pp = malloc(strlen(member->name)+1)) (void) strcpy(*pp++, member->name); else noerror = FALSE; } /* * If there's no error, terminate the list we've built. * Otherwise, free the space allocated to the stuff we've built */ if (noerror) { *pp = NULL; rtnval = listbuf; } else { /* Some error occurred. Clean up allocations */ for (pp = listbuf; *pp; pp++) free(*pp); free(listbuf); rtnval = NULL; } } /* if (malloc()) */ /* Free space alloced to the device group entry */ _freedgrptabent(dgrpent); } /* if (_getdgrprec()) */ else rtnval = NULL; /* Finished -- wasn't that simple? */ return (rtnval); }