summaryrefslogtreecommitdiff
path: root/usr/src/lib/libadm/common/listdgrp.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libadm/common/listdgrp.c')
-rw-r--r--usr/src/lib/libadm/common/listdgrp.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/usr/src/lib/libadm/common/listdgrp.c b/usr/src/lib/libadm/common/listdgrp.c
new file mode 100644
index 0000000000..fd7747919e
--- /dev/null
+++ b/usr/src/lib/libadm/common/listdgrp.c
@@ -0,0 +1,169 @@
+/*
+ * 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);
+}