diff options
Diffstat (limited to 'usr/src/lib/libadm/common/listdgrp.c')
-rw-r--r-- | usr/src/lib/libadm/common/listdgrp.c | 169 |
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); +} |