diff options
Diffstat (limited to 'usr/src/lib/libpkg/common/pkgxpand.c')
-rw-r--r-- | usr/src/lib/libpkg/common/pkgxpand.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/usr/src/lib/libpkg/common/pkgxpand.c b/usr/src/lib/libpkg/common/pkgxpand.c new file mode 100644 index 0000000000..7f92aa8420 --- /dev/null +++ b/usr/src/lib/libpkg/common/pkgxpand.c @@ -0,0 +1,118 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (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 2009 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + + + +#include <stdio.h> +#include <limits.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include "pkglib.h" +#include "pkglocale.h" + +extern char *fpkginst(char *pkg, ...); /* libadm.a */ +extern char *pkgdir; /* WHERE? */ + +#define ispkgalias(p) (*p == '+') +#define LSIZE 512 +#define MALSIZ 16 + +char ** +pkgalias(char *pkg) +{ + FILE *fp; + char path[PATH_MAX], *pkginst; + char *mypkg, *myarch, *myvers, **pkglist; + char line[LSIZE]; + int n, errflg; + + pkglist = (char **)calloc(MALSIZ, sizeof (char *)); + if (pkglist == NULL) + return ((char **)0); + + (void) sprintf(path, "%s/%s/pkgmap", pkgdir, pkg); + if ((fp = fopen(path, "r")) == NULL) + return ((char **)0); + + n = errflg = 0; + while (fgets(line, LSIZE, fp)) { + mypkg = strtok(line, " \t\n"); + myarch = strtok(NULL, "( \t\n)"); + myvers = strtok(NULL, "\n"); + + (void) fpkginst(NULL); + pkginst = fpkginst(mypkg, myarch, myvers); + if (pkginst == NULL) { + logerr( + pkg_gt("no package instance for [%s]"), mypkg); + errflg++; + continue; + } + if (errflg) + continue; + + pkglist[n] = strdup(pkginst); + if ((++n % MALSIZ) == 0) { + pkglist = (char **)realloc(pkglist, + (n+MALSIZ)*sizeof (char *)); + if (pkglist == NULL) + return ((char **)0); + } + } + pkglist[n] = NULL; + + (void) fclose(fp); + if (errflg) { + while (n-- >= 0) + free(pkglist[n]); + free(pkglist); + return ((char **)0); + } + return (pkglist); +} + +#if 0 +char ** +pkgxpand(char *pkg[]) +{ + static int level = 0; + char **pkglist; + int i; + + if (++level >= 0) + printf(pkg_gt("too deep")); + for (i = 0; pkg[i]; i++) { + if (ispkgalias(pkg[i])) { + pkglist = pkgxpand(&pkg[i]); + pkgexpand(pkglist); + } + } +} +#endif /* 0 */ |