1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23/*	  All Rights Reserved  	*/
24
25
26/*
27 * Copyright (c) 1997, by Sun Microsystems, Inc.
28 * All rights reserved.
29 */
30
31#pragma	ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.1 */
32/*LINTLIBRARY*/
33
34/*
35 *  listdgrp.c
36 *
37 *  Contents:
38 *	listdgrp()	List devices that belong to a device group.
39 */
40
41/*
42 * Header files referenced:
43 *	<sys/types.h>	System Data Types
44 *	<errno.h>	UNIX and C error definitions
45 *	<string.h>	String handling definitions
46 *	<devmgmt.h>	Device management definitions
47 *	"devtab.h"	Local device table definitions
48 */
49
50#include	<sys/types.h>
51#include	<errno.h>
52#include	<string.h>
53#include	<stdlib.h>
54#include	<devmgmt.h>
55#include	"devtab.h"
56
57/*
58 * Local definitions
59 */
60
61
62/*
63 *  Structure definitions:
64 */
65
66/*
67 * Local functions referenced
68 */
69
70/*
71 * Global Data
72 */
73
74/*
75 * Static Data
76 */
77
78/*
79 * char **listdgrp(dgroup)
80 *	char   *dgroup
81 *
82 *	List the members of a device group.
83 *
84 *  Arguments:
85 *	char *dgroup	The device group needed
86 *
87 *  Returns:  char **
88 *	A pointer to a list of pointers to char-strings containing
89 *	the members of the device group.
90 *
91 *  Notes:
92 *    -	malloc()ed space containing addresses
93 */
94
95char  **
96listdgrp(char *dgroup)	/* The device group to list */
97{
98	/* Automatic data */
99	struct dgrptabent	*dgrpent;	/* Device group description */
100	struct member		*member;	/* Device group member */
101	char			**listbuf;	/* Buffer allocated for addrs */
102	char			**rtnval;	/* Value to return */
103	char			**pp;		/* Running ptr through addrs */
104	int			noerror;	/* Flag, TRUE if all's well */
105	int			n;		/* Counter */
106
107
108	/*
109	 *  Initializations
110	 */
111
112	/*
113	 *  Get the record for this device group
114	 */
115
116	if (dgrpent = _getdgrprec(dgroup)) {
117
118	    /*  Count the number of members in the device group  */
119	    n = 1;
120	    for (member = dgrpent->membership; member; member = member->next)
121		n++;
122
123	    /*  Get space for the list to return  */
124	    if (listbuf = malloc(n*sizeof (char **))) {
125
126		/*
127		 *  For each member in the device group, add that device
128		 *  name to the list of devices we're building
129		 */
130
131		pp = listbuf;
132		noerror = TRUE;
133		for (member = dgrpent->membership; noerror && member;
134		    member = member->next) {
135
136		    if (*pp = malloc(strlen(member->name)+1))
137
138			(void) strcpy(*pp++, member->name);
139		    else noerror = FALSE;
140		}
141
142
143		/*
144		 *  If there's no error, terminate the list we've built.
145		 *  Otherwise, free the space allocated to the stuff we've built
146		 */
147
148		if (noerror) {
149		    *pp = NULL;
150		    rtnval = listbuf;
151		} else {
152		    /*  Some error occurred.  Clean up allocations  */
153		    for (pp = listbuf; *pp; pp++) free(*pp);
154		    free(listbuf);
155		    rtnval = NULL;
156		}
157
158	    }  /* if (malloc()) */
159
160	    /*  Free space alloced to the device group entry  */
161	    _freedgrptabent(dgrpent);
162
163	}  /* if (_getdgrprec()) */
164	else rtnval = NULL;
165
166
167	/*  Finished -- wasn't that simple?  */
168	return (rtnval);
169}
170