OpenSolaris_b135/lib/libadm/common/listdgrp.c

Compare this file to the similar file:
Show the results in this format:

/*
 * 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.1 */
/*LINTLIBRARY*/

/*
 *  listdgrp.c
 *
 *  Contents:
 *	listdgrp()	List devices that belong to a device group.
 */

/*
 * Header files referenced:
 *	<sys/types.h>	System Data Types
 *	<errno.h>	UNIX and C error definitions
 *	<string.h>	String handling definitions
 *	<devmgmt.h>	Device management definitions
 *	"devtab.h"	Local device table definitions
 */

#include	<sys/types.h>
#include	<errno.h>
#include	<string.h>
#include	<stdlib.h>
#include	<devmgmt.h>
#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);
}