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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30
31
32 #include <stdio.h>
33 #include <limits.h>
34 #include <stdlib.h>
35 #include <unistd.h>
36 #include <string.h>
37 #include "pkglib.h"
38 #include "pkglocale.h"
39
40 extern char *fpkginst(char *pkg, ...); /* libadm.a */
41 extern char *pkgdir; /* WHERE? */
42
43 #define ispkgalias(p) (*p == '+')
44 #define LSIZE 512
45 #define MALSIZ 16
46
47 char **
pkgalias(char * pkg)48 pkgalias(char *pkg)
49 {
50 FILE *fp;
51 char path[PATH_MAX], *pkginst;
52 char *mypkg, *myarch, *myvers, **pkglist;
53 char line[LSIZE];
54 int n, errflg;
55
56 pkglist = (char **)calloc(MALSIZ, sizeof (char *));
57 if (pkglist == NULL)
58 return ((char **)0);
59
60 (void) sprintf(path, "%s/%s/pkgmap", pkgdir, pkg);
61 if ((fp = fopen(path, "r")) == NULL)
62 return ((char **)0);
63
64 n = errflg = 0;
65 while (fgets(line, LSIZE, fp)) {
66 mypkg = strtok(line, " \t\n");
67 myarch = strtok(NULL, "( \t\n)");
68 myvers = strtok(NULL, "\n");
69
70 (void) fpkginst(NULL);
71 pkginst = fpkginst(mypkg, myarch, myvers);
72 if (pkginst == NULL) {
73 logerr(
74 pkg_gt("no package instance for [%s]"), mypkg);
75 errflg++;
76 continue;
77 }
78 if (errflg)
79 continue;
80
81 pkglist[n] = strdup(pkginst);
82 if ((++n % MALSIZ) == 0) {
83 pkglist = (char **)realloc(pkglist,
84 (n+MALSIZ)*sizeof (char *));
85 if (pkglist == NULL)
86 return ((char **)0);
87 }
88 }
89 pkglist[n] = NULL;
90
91 (void) fclose(fp);
92 if (errflg) {
93 while (n-- >= 0)
94 free(pkglist[n]);
95 free(pkglist);
96 return ((char **)0);
97 }
98 return (pkglist);
99 }
100
101 #if 0
102 char **
103 pkgxpand(char *pkg[])
104 {
105 static int level = 0;
106 char **pkglist;
107 int i;
108
109 if (++level >= 0)
110 printf(pkg_gt("too deep"));
111 for (i = 0; pkg[i]; i++) {
112 if (ispkgalias(pkg[i])) {
113 pkglist = pkgxpand(&pkg[i]);
114 pkgexpand(pkglist);
115 }
116 }
117 }
118 #endif /* 0 */
119