xref: /titanic_44/usr/src/cmd/svr4pkg/libinst/dockdeps.c (revision 5c51f1241dbbdf2656d0e10011981411ed0c9673)
1*5c51f124SMoriah Waterland /*
2*5c51f124SMoriah Waterland  * CDDL HEADER START
3*5c51f124SMoriah Waterland  *
4*5c51f124SMoriah Waterland  * The contents of this file are subject to the terms of the
5*5c51f124SMoriah Waterland  * Common Development and Distribution License (the "License").
6*5c51f124SMoriah Waterland  * You may not use this file except in compliance with the License.
7*5c51f124SMoriah Waterland  *
8*5c51f124SMoriah Waterland  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5c51f124SMoriah Waterland  * or http://www.opensolaris.org/os/licensing.
10*5c51f124SMoriah Waterland  * See the License for the specific language governing permissions
11*5c51f124SMoriah Waterland  * and limitations under the License.
12*5c51f124SMoriah Waterland  *
13*5c51f124SMoriah Waterland  * When distributing Covered Code, include this CDDL HEADER in each
14*5c51f124SMoriah Waterland  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5c51f124SMoriah Waterland  * If applicable, add the following below this CDDL HEADER, with the
16*5c51f124SMoriah Waterland  * fields enclosed by brackets "[]" replaced with your own identifying
17*5c51f124SMoriah Waterland  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5c51f124SMoriah Waterland  *
19*5c51f124SMoriah Waterland  * CDDL HEADER END
20*5c51f124SMoriah Waterland  */
21*5c51f124SMoriah Waterland 
22*5c51f124SMoriah Waterland /*
23*5c51f124SMoriah Waterland  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24*5c51f124SMoriah Waterland  * Use is subject to license terms.
25*5c51f124SMoriah Waterland  */
26*5c51f124SMoriah Waterland 
27*5c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28*5c51f124SMoriah Waterland /* All Rights Reserved */
29*5c51f124SMoriah Waterland 
30*5c51f124SMoriah Waterland 
31*5c51f124SMoriah Waterland 
32*5c51f124SMoriah Waterland #include <stdio.h>
33*5c51f124SMoriah Waterland #include <errno.h>
34*5c51f124SMoriah Waterland #include <limits.h>
35*5c51f124SMoriah Waterland #include <stdlib.h>
36*5c51f124SMoriah Waterland #include <unistd.h>
37*5c51f124SMoriah Waterland #include <string.h>
38*5c51f124SMoriah Waterland #include <ctype.h>
39*5c51f124SMoriah Waterland #include <dirent.h>
40*5c51f124SMoriah Waterland #include <sys/types.h>
41*5c51f124SMoriah Waterland #include <pkgstrct.h>
42*5c51f124SMoriah Waterland #include <pkginfo.h>
43*5c51f124SMoriah Waterland #include <locale.h>
44*5c51f124SMoriah Waterland #include <libintl.h>
45*5c51f124SMoriah Waterland #include <pkglib.h>
46*5c51f124SMoriah Waterland #include "libinst.h"
47*5c51f124SMoriah Waterland #include "libadm.h"
48*5c51f124SMoriah Waterland #include "messages.h"
49*5c51f124SMoriah Waterland 
50*5c51f124SMoriah Waterland #define	LSIZE	256
51*5c51f124SMoriah Waterland #define	NVERS	50
52*5c51f124SMoriah Waterland 
53*5c51f124SMoriah Waterland /*
54*5c51f124SMoriah Waterland  * internal global variables
55*5c51f124SMoriah Waterland  */
56*5c51f124SMoriah Waterland 
57*5c51f124SMoriah Waterland static struct pkginfo info;
58*5c51f124SMoriah Waterland 
59*5c51f124SMoriah Waterland static char	type;
60*5c51f124SMoriah Waterland static char	*alist[NVERS];
61*5c51f124SMoriah Waterland static char	*rmpkginst;
62*5c51f124SMoriah Waterland static char	*vlist[NVERS];
63*5c51f124SMoriah Waterland static char	file[128];
64*5c51f124SMoriah Waterland static char	name[128];
65*5c51f124SMoriah Waterland static char	rmpkg[PKGSIZ+1];
66*5c51f124SMoriah Waterland static char	wabbrev[128];
67*5c51f124SMoriah Waterland 
68*5c51f124SMoriah Waterland static int	errflg = 0;
69*5c51f124SMoriah Waterland static int	nlist;
70*5c51f124SMoriah Waterland static int	pkgexist;
71*5c51f124SMoriah Waterland static int	pkgokay;
72*5c51f124SMoriah Waterland static int	is_update;
73*5c51f124SMoriah Waterland static int	is_patch_update;
74*5c51f124SMoriah Waterland 
75*5c51f124SMoriah Waterland /*
76*5c51f124SMoriah Waterland  * IMPORTANT NOTE: THE SIZE OF 'abbrev' IS HARD CODED INTO THE CHARACTER
77*5c51f124SMoriah Waterland  * ARRAY SSCANF_FORMAT -- YOU MUST UPDATE BOTH VALUES AT THE SAME TIME!!
78*5c51f124SMoriah Waterland  */
79*5c51f124SMoriah Waterland 
80*5c51f124SMoriah Waterland static char	abbrev[128+1];
81*5c51f124SMoriah Waterland static char	*SSCANF_FORMAT = "%c %128s %[^\n]";
82*5c51f124SMoriah Waterland 
83*5c51f124SMoriah Waterland /*
84*5c51f124SMoriah Waterland  * forward declarations
85*5c51f124SMoriah Waterland  */
86*5c51f124SMoriah Waterland 
87*5c51f124SMoriah Waterland static void	ckrdeps(boolean_t a_preinstallCheck);
88*5c51f124SMoriah Waterland static void	ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck);
89*5c51f124SMoriah Waterland static void	deponme(char *pkginst, char *pkgname,
90*5c51f124SMoriah Waterland 				boolean_t a_preinstallCheck);
91*5c51f124SMoriah Waterland static void	prereq(char *pkginst, char *pkgname,
92*5c51f124SMoriah Waterland 				boolean_t a_preinstallCheck);
93*5c51f124SMoriah Waterland static void	incompat(char *pkginst, char *pkgname,
94*5c51f124SMoriah Waterland 				boolean_t a_preinstallCheck);
95*5c51f124SMoriah Waterland static int	getline(FILE *fp);
96*5c51f124SMoriah Waterland 
97*5c51f124SMoriah Waterland /*
98*5c51f124SMoriah Waterland  * *****************************************************************************
99*5c51f124SMoriah Waterland  * global external (public) functions
100*5c51f124SMoriah Waterland  * *****************************************************************************
101*5c51f124SMoriah Waterland  */
102*5c51f124SMoriah Waterland 
103*5c51f124SMoriah Waterland int
104*5c51f124SMoriah Waterland dockdeps(char *a_depfile, int a_removeFlag, boolean_t a_preinstallCheck)
105*5c51f124SMoriah Waterland {
106*5c51f124SMoriah Waterland 	FILE	*fp;
107*5c51f124SMoriah Waterland 	int	i;
108*5c51f124SMoriah Waterland 	char	*inst;
109*5c51f124SMoriah Waterland 
110*5c51f124SMoriah Waterland 	if (a_removeFlag) {
111*5c51f124SMoriah Waterland 		/* check removal dependencies */
112*5c51f124SMoriah Waterland 		rmpkginst = a_depfile;
113*5c51f124SMoriah Waterland 		(void) strncpy(rmpkg, rmpkginst, PKGSIZ);
114*5c51f124SMoriah Waterland 		(void) strtok(rmpkg, ".");
115*5c51f124SMoriah Waterland 		(void) snprintf(file, sizeof (file),
116*5c51f124SMoriah Waterland 				"%s/%s/%s", pkgdir, rmpkginst, DEPEND_FILE);
117*5c51f124SMoriah Waterland 		if ((fp = fopen(file, "r")) == NULL)
118*5c51f124SMoriah Waterland 			goto done;
119*5c51f124SMoriah Waterland 	} else {
120*5c51f124SMoriah Waterland 		if ((fp = fopen(a_depfile, "r")) == NULL) {
121*5c51f124SMoriah Waterland 			progerr(ERR_CANNOT_OPEN_DEPEND_FILE, a_depfile,
122*5c51f124SMoriah Waterland 					strerror(errno));
123*5c51f124SMoriah Waterland 			quit(99);
124*5c51f124SMoriah Waterland 		}
125*5c51f124SMoriah Waterland 	}
126*5c51f124SMoriah Waterland 
127*5c51f124SMoriah Waterland 	while (getline(fp)) {
128*5c51f124SMoriah Waterland 		switch (type) {
129*5c51f124SMoriah Waterland 		    case 'I':
130*5c51f124SMoriah Waterland 		    case 'P':
131*5c51f124SMoriah Waterland 			if (a_removeFlag) {
132*5c51f124SMoriah Waterland 				continue;
133*5c51f124SMoriah Waterland 			}
134*5c51f124SMoriah Waterland 			break;
135*5c51f124SMoriah Waterland 
136*5c51f124SMoriah Waterland 		    case 'R':
137*5c51f124SMoriah Waterland 			if (!a_removeFlag) {
138*5c51f124SMoriah Waterland 				continue;
139*5c51f124SMoriah Waterland 			}
140*5c51f124SMoriah Waterland 			break;
141*5c51f124SMoriah Waterland 
142*5c51f124SMoriah Waterland 		    default:
143*5c51f124SMoriah Waterland 			errflg++;
144*5c51f124SMoriah Waterland 			progerr(ERR_UNKNOWN_DEPENDENCY, type);
145*5c51f124SMoriah Waterland 			break;
146*5c51f124SMoriah Waterland 		}
147*5c51f124SMoriah Waterland 
148*5c51f124SMoriah Waterland 		/* check to see if any versions listed are installed */
149*5c51f124SMoriah Waterland 		pkgexist = pkgokay = 0;
150*5c51f124SMoriah Waterland 		i = 0;
151*5c51f124SMoriah Waterland 		if (strchr(abbrev, '.')) {
152*5c51f124SMoriah Waterland 			progerr(ERR_PKGABRV, abbrev);
153*5c51f124SMoriah Waterland 		}
154*5c51f124SMoriah Waterland 		(void) snprintf(wabbrev, sizeof (wabbrev), "%s.*", abbrev);
155*5c51f124SMoriah Waterland 
156*5c51f124SMoriah Waterland 		do {
157*5c51f124SMoriah Waterland 			inst = fpkginst(wabbrev, alist[i], vlist[i]);
158*5c51f124SMoriah Waterland 			if (inst && (pkginfo(&info, inst, NULL, NULL) == 0)) {
159*5c51f124SMoriah Waterland 				pkgexist++;
160*5c51f124SMoriah Waterland 				if ((info.status == PI_INSTALLED) ||
161*5c51f124SMoriah Waterland 				    (info.status == PI_PRESVR4))
162*5c51f124SMoriah Waterland 					pkgokay++;
163*5c51f124SMoriah Waterland 			}
164*5c51f124SMoriah Waterland 		} while (++i < nlist);
165*5c51f124SMoriah Waterland 		(void) fpkginst(NULL); 	/* force closing/rewind of files */
166*5c51f124SMoriah Waterland 
167*5c51f124SMoriah Waterland 		if (!info.name) {
168*5c51f124SMoriah Waterland 			info.name = name;
169*5c51f124SMoriah Waterland 		}
170*5c51f124SMoriah Waterland 
171*5c51f124SMoriah Waterland 		switch (type) {
172*5c51f124SMoriah Waterland 		    case 'I':
173*5c51f124SMoriah Waterland 			incompat(abbrev, info.name, a_preinstallCheck);
174*5c51f124SMoriah Waterland 			break;
175*5c51f124SMoriah Waterland 
176*5c51f124SMoriah Waterland 		    case 'P':
177*5c51f124SMoriah Waterland 			prereq(abbrev, name, a_preinstallCheck);
178*5c51f124SMoriah Waterland 			break;
179*5c51f124SMoriah Waterland 
180*5c51f124SMoriah Waterland 		    case 'R':
181*5c51f124SMoriah Waterland 			deponme(abbrev, info.name, a_preinstallCheck);
182*5c51f124SMoriah Waterland 		}
183*5c51f124SMoriah Waterland 	}
184*5c51f124SMoriah Waterland 	(void) fclose(fp);
185*5c51f124SMoriah Waterland 
186*5c51f124SMoriah Waterland done:
187*5c51f124SMoriah Waterland 	if (a_removeFlag) {
188*5c51f124SMoriah Waterland 		ckrdeps(a_preinstallCheck);
189*5c51f124SMoriah Waterland 	}
190*5c51f124SMoriah Waterland 
191*5c51f124SMoriah Waterland 	return (errflg);
192*5c51f124SMoriah Waterland }
193*5c51f124SMoriah Waterland 
194*5c51f124SMoriah Waterland void
195*5c51f124SMoriah Waterland setPatchUpdate(void)
196*5c51f124SMoriah Waterland {
197*5c51f124SMoriah Waterland 	is_patch_update = 1;
198*5c51f124SMoriah Waterland }
199*5c51f124SMoriah Waterland 
200*5c51f124SMoriah Waterland int
201*5c51f124SMoriah Waterland isPatchUpdate(void)
202*5c51f124SMoriah Waterland {
203*5c51f124SMoriah Waterland 	return ((is_patch_update) ? 1 : 0);
204*5c51f124SMoriah Waterland }
205*5c51f124SMoriah Waterland 
206*5c51f124SMoriah Waterland void
207*5c51f124SMoriah Waterland setUpdate(void)
208*5c51f124SMoriah Waterland {
209*5c51f124SMoriah Waterland 	is_update = 1;
210*5c51f124SMoriah Waterland }
211*5c51f124SMoriah Waterland 
212*5c51f124SMoriah Waterland int
213*5c51f124SMoriah Waterland isUpdate(void)
214*5c51f124SMoriah Waterland {
215*5c51f124SMoriah Waterland 	return ((is_update) ? 1 : 0);
216*5c51f124SMoriah Waterland }
217*5c51f124SMoriah Waterland 
218*5c51f124SMoriah Waterland /*
219*5c51f124SMoriah Waterland  * *****************************************************************************
220*5c51f124SMoriah Waterland  * static internal (private) functions
221*5c51f124SMoriah Waterland  * *****************************************************************************
222*5c51f124SMoriah Waterland  */
223*5c51f124SMoriah Waterland 
224*5c51f124SMoriah Waterland static void
225*5c51f124SMoriah Waterland incompat(char *pkginst, char *pkgname, boolean_t a_preinstallCheck)
226*5c51f124SMoriah Waterland {
227*5c51f124SMoriah Waterland 	char buf[512];
228*5c51f124SMoriah Waterland 
229*5c51f124SMoriah Waterland 	if (!pkgexist)
230*5c51f124SMoriah Waterland 		return;
231*5c51f124SMoriah Waterland 
232*5c51f124SMoriah Waterland 	errflg++;
233*5c51f124SMoriah Waterland 	if (a_preinstallCheck == B_TRUE) {
234*5c51f124SMoriah Waterland 		(void) fprintf(stdout, "incompat=%s\n", pkginst);
235*5c51f124SMoriah Waterland 		return;
236*5c51f124SMoriah Waterland 	}
237*5c51f124SMoriah Waterland 
238*5c51f124SMoriah Waterland 	logerr(ERR_WARNING);
239*5c51f124SMoriah Waterland 	(void) snprintf(buf, sizeof (buf), ERR_INCOMP_VERS, pkginst, pkgname);
240*5c51f124SMoriah Waterland 	puttext(stderr, buf, 4, 0);
241*5c51f124SMoriah Waterland 	(void) putc('\n', stderr);
242*5c51f124SMoriah Waterland }
243*5c51f124SMoriah Waterland 
244*5c51f124SMoriah Waterland static void
245*5c51f124SMoriah Waterland prereq(char *pkginst, char *pkgname, boolean_t a_preinstallCheck)
246*5c51f124SMoriah Waterland {
247*5c51f124SMoriah Waterland 	register int i;
248*5c51f124SMoriah Waterland 	char buf[512];
249*5c51f124SMoriah Waterland 
250*5c51f124SMoriah Waterland 	if (pkgokay) {
251*5c51f124SMoriah Waterland 		return;
252*5c51f124SMoriah Waterland 	}
253*5c51f124SMoriah Waterland 
254*5c51f124SMoriah Waterland 	errflg++;
255*5c51f124SMoriah Waterland 
256*5c51f124SMoriah Waterland 	if (a_preinstallCheck == B_TRUE) {
257*5c51f124SMoriah Waterland 		if (pkgexist) {
258*5c51f124SMoriah Waterland 			(void) fprintf(stdout,
259*5c51f124SMoriah Waterland 				"prerequisite-incomplete=%s\n", pkginst);
260*5c51f124SMoriah Waterland 		} else {
261*5c51f124SMoriah Waterland 			(void) fprintf(stdout,
262*5c51f124SMoriah Waterland 				"prerequisite-installed=%s\n", pkginst);
263*5c51f124SMoriah Waterland 		}
264*5c51f124SMoriah Waterland 		return;
265*5c51f124SMoriah Waterland 	}
266*5c51f124SMoriah Waterland 
267*5c51f124SMoriah Waterland 	logerr(ERR_WARNING);
268*5c51f124SMoriah Waterland 	if (pkgexist) {
269*5c51f124SMoriah Waterland 		(void) snprintf(buf, sizeof (buf), ERR_PRENCI, pkginst,
270*5c51f124SMoriah Waterland 					pkgname);
271*5c51f124SMoriah Waterland 		puttext(stderr, buf, 4, 0);
272*5c51f124SMoriah Waterland 		(void) putc('\n', stderr);
273*5c51f124SMoriah Waterland 	} else {
274*5c51f124SMoriah Waterland 		(void) snprintf(buf, sizeof (buf), ERR_PREREQ, pkginst,
275*5c51f124SMoriah Waterland 					pkgname);
276*5c51f124SMoriah Waterland 		if (nlist) {
277*5c51f124SMoriah Waterland 			(void) strcat(buf, ERR_VALINST);
278*5c51f124SMoriah Waterland 		}
279*5c51f124SMoriah Waterland 		puttext(stderr, buf, 4, 0);
280*5c51f124SMoriah Waterland 		(void) putc('\n', stderr);
281*5c51f124SMoriah Waterland 		for (i = 0; i < nlist; i++) {
282*5c51f124SMoriah Waterland 			(void) printf("          ");
283*5c51f124SMoriah Waterland 			if (alist[i])
284*5c51f124SMoriah Waterland 				(void) printf("(%s) ", alist[i]);
285*5c51f124SMoriah Waterland 			if (vlist[i])
286*5c51f124SMoriah Waterland 				(void) printf("%s", vlist[i]);
287*5c51f124SMoriah Waterland 			(void) printf("\n");
288*5c51f124SMoriah Waterland 		}
289*5c51f124SMoriah Waterland 	}
290*5c51f124SMoriah Waterland }
291*5c51f124SMoriah Waterland 
292*5c51f124SMoriah Waterland static void
293*5c51f124SMoriah Waterland deponme(char *pkginst, char *pkgname, boolean_t a_preinstallCheck)
294*5c51f124SMoriah Waterland {
295*5c51f124SMoriah Waterland 	char buf[512];
296*5c51f124SMoriah Waterland 
297*5c51f124SMoriah Waterland 	if (!pkgexist)
298*5c51f124SMoriah Waterland 		return;
299*5c51f124SMoriah Waterland 
300*5c51f124SMoriah Waterland 	errflg++;
301*5c51f124SMoriah Waterland 
302*5c51f124SMoriah Waterland 	if (a_preinstallCheck == B_TRUE) {
303*5c51f124SMoriah Waterland 		if (!pkgname || !pkgname[0]) {
304*5c51f124SMoriah Waterland 			(void) snprintf(buf, sizeof (buf),
305*5c51f124SMoriah Waterland 					"dependonme=%s", pkginst);
306*5c51f124SMoriah Waterland 		} else {
307*5c51f124SMoriah Waterland 			(void) snprintf(buf, sizeof (buf),
308*5c51f124SMoriah Waterland 				"dependsonme=%s:%s", pkginst, pkgname);
309*5c51f124SMoriah Waterland 		}
310*5c51f124SMoriah Waterland 		(void) fprintf(stdout, "%s\n", buf);
311*5c51f124SMoriah Waterland 		return;
312*5c51f124SMoriah Waterland 	}
313*5c51f124SMoriah Waterland 
314*5c51f124SMoriah Waterland 	logerr(ERR_WARNING);
315*5c51f124SMoriah Waterland 	if (!pkgname || !pkgname[0]) {
316*5c51f124SMoriah Waterland 		(void) snprintf(buf, sizeof (buf), ERR_DEPONME, pkginst);
317*5c51f124SMoriah Waterland 	} else {
318*5c51f124SMoriah Waterland 		(void) snprintf(buf, sizeof (buf), ERR_DEPNAM, pkginst,
319*5c51f124SMoriah Waterland 				pkgname);
320*5c51f124SMoriah Waterland 	}
321*5c51f124SMoriah Waterland 	puttext(stderr, buf, 4, 0);
322*5c51f124SMoriah Waterland 	(void) putc('\n', stderr);
323*5c51f124SMoriah Waterland }
324*5c51f124SMoriah Waterland 
325*5c51f124SMoriah Waterland static int
326*5c51f124SMoriah Waterland getline(FILE *fp)
327*5c51f124SMoriah Waterland {
328*5c51f124SMoriah Waterland 	register int i, c, found;
329*5c51f124SMoriah Waterland 	char *pt, *new, line[LSIZE];
330*5c51f124SMoriah Waterland 
331*5c51f124SMoriah Waterland 	abbrev[0] = name[0] = type = '\0';
332*5c51f124SMoriah Waterland 
333*5c51f124SMoriah Waterland 	for (i = 0; i < nlist; i++) {
334*5c51f124SMoriah Waterland 		if (alist[i]) {
335*5c51f124SMoriah Waterland 			free(alist[i]);
336*5c51f124SMoriah Waterland 			alist[i] = NULL;
337*5c51f124SMoriah Waterland 		}
338*5c51f124SMoriah Waterland 		if (vlist[i]) {
339*5c51f124SMoriah Waterland 			free(vlist[i]);
340*5c51f124SMoriah Waterland 			vlist[i] = NULL;
341*5c51f124SMoriah Waterland 		}
342*5c51f124SMoriah Waterland 	}
343*5c51f124SMoriah Waterland 	alist[0] = vlist[0] = NULL;
344*5c51f124SMoriah Waterland 
345*5c51f124SMoriah Waterland 	found = (-1);
346*5c51f124SMoriah Waterland 	nlist = 0;
347*5c51f124SMoriah Waterland 	while ((c = getc(fp)) != EOF) {
348*5c51f124SMoriah Waterland 		(void) ungetc(c, fp);
349*5c51f124SMoriah Waterland 		if ((found >= 0) && !isspace(c))
350*5c51f124SMoriah Waterland 			return (1);
351*5c51f124SMoriah Waterland 
352*5c51f124SMoriah Waterland 		if (!fgets(line, LSIZE, fp))
353*5c51f124SMoriah Waterland 			break;
354*5c51f124SMoriah Waterland 
355*5c51f124SMoriah Waterland 		for (pt = line; isspace(*pt); /* void */)
356*5c51f124SMoriah Waterland 			pt++;
357*5c51f124SMoriah Waterland 		if (!*pt || (*pt == '#'))
358*5c51f124SMoriah Waterland 			continue;
359*5c51f124SMoriah Waterland 
360*5c51f124SMoriah Waterland 		if (pt == line) {
361*5c51f124SMoriah Waterland 			/* begin new definition */
362*5c51f124SMoriah Waterland 			/* LINTED variable format specifier to sscanf(): */
363*5c51f124SMoriah Waterland 			(void) sscanf(line, SSCANF_FORMAT, &type, abbrev, name);
364*5c51f124SMoriah Waterland 			found++;
365*5c51f124SMoriah Waterland 			continue;
366*5c51f124SMoriah Waterland 		}
367*5c51f124SMoriah Waterland 		if (found < 0)
368*5c51f124SMoriah Waterland 			return (0);
369*5c51f124SMoriah Waterland 
370*5c51f124SMoriah Waterland 		if (*pt == '(') {
371*5c51f124SMoriah Waterland 			/* architecture is specified */
372*5c51f124SMoriah Waterland 			if (new = strchr(pt, ')'))
373*5c51f124SMoriah Waterland 				*new++ = '\0';
374*5c51f124SMoriah Waterland 			else
375*5c51f124SMoriah Waterland 				return (-1); /* bad specification */
376*5c51f124SMoriah Waterland 			alist[found] = qstrdup(pt+1);
377*5c51f124SMoriah Waterland 			pt = new;
378*5c51f124SMoriah Waterland 		}
379*5c51f124SMoriah Waterland 		while (isspace(*pt))
380*5c51f124SMoriah Waterland 			pt++;
381*5c51f124SMoriah Waterland 		if (*pt) {
382*5c51f124SMoriah Waterland 			vlist[found] = qstrdup(pt);
383*5c51f124SMoriah Waterland 			if (pt = strchr(vlist[found], '\n'))
384*5c51f124SMoriah Waterland 				*pt = '\0';
385*5c51f124SMoriah Waterland 		}
386*5c51f124SMoriah Waterland 		found++;
387*5c51f124SMoriah Waterland 		nlist++;
388*5c51f124SMoriah Waterland 	}
389*5c51f124SMoriah Waterland 	return ((found >= 0) ? 1 : 0);
390*5c51f124SMoriah Waterland }
391*5c51f124SMoriah Waterland 
392*5c51f124SMoriah Waterland static void
393*5c51f124SMoriah Waterland ckrdeps(boolean_t a_preinstallCheck)
394*5c51f124SMoriah Waterland {
395*5c51f124SMoriah Waterland 	struct dirent *drp;
396*5c51f124SMoriah Waterland 	DIR	*dirfp;
397*5c51f124SMoriah Waterland 	FILE	*fp;
398*5c51f124SMoriah Waterland 	char	depfile[PATH_MAX+1];
399*5c51f124SMoriah Waterland 
400*5c51f124SMoriah Waterland 	if ((dirfp = opendir(pkgdir)) == NULL)
401*5c51f124SMoriah Waterland 		return;
402*5c51f124SMoriah Waterland 
403*5c51f124SMoriah Waterland 	while ((drp = readdir(dirfp)) != NULL) {
404*5c51f124SMoriah Waterland 		if (drp->d_name[0] == '.')
405*5c51f124SMoriah Waterland 			continue;
406*5c51f124SMoriah Waterland 
407*5c51f124SMoriah Waterland 		if (strcmp(drp->d_name, rmpkginst) == 0)
408*5c51f124SMoriah Waterland 			continue; /* others don't include me */
409*5c51f124SMoriah Waterland 		(void) snprintf(depfile, sizeof (depfile),
410*5c51f124SMoriah Waterland 				"%s/%s/%s", pkgdir, drp->d_name, DEPEND_FILE);
411*5c51f124SMoriah Waterland 		if ((fp = fopen(depfile, "r")) == NULL)
412*5c51f124SMoriah Waterland 			continue;
413*5c51f124SMoriah Waterland 
414*5c51f124SMoriah Waterland 		ckpreq(fp, drp->d_name, a_preinstallCheck);
415*5c51f124SMoriah Waterland 	}
416*5c51f124SMoriah Waterland 	(void) closedir(dirfp);
417*5c51f124SMoriah Waterland }
418*5c51f124SMoriah Waterland 
419*5c51f124SMoriah Waterland static void
420*5c51f124SMoriah Waterland ckpreq(FILE *fp, char *dname, boolean_t a_preinstallCheck)
421*5c51f124SMoriah Waterland {
422*5c51f124SMoriah Waterland 	register int i;
423*5c51f124SMoriah Waterland 	char	*inst;
424*5c51f124SMoriah Waterland 
425*5c51f124SMoriah Waterland 	while (getline(fp)) {
426*5c51f124SMoriah Waterland 		if (type != 'P')
427*5c51f124SMoriah Waterland 			continue;
428*5c51f124SMoriah Waterland 
429*5c51f124SMoriah Waterland 		if (strcmp(abbrev, rmpkg))
430*5c51f124SMoriah Waterland 			continue;
431*5c51f124SMoriah Waterland 
432*5c51f124SMoriah Waterland 		/* see if package is installed */
433*5c51f124SMoriah Waterland 		i = 0;
434*5c51f124SMoriah Waterland 		if (strchr(abbrev, '.') == 0) {
435*5c51f124SMoriah Waterland 			(void) strcat(abbrev, ".*");
436*5c51f124SMoriah Waterland 		}
437*5c51f124SMoriah Waterland 		pkgexist = 1;
438*5c51f124SMoriah Waterland 
439*5c51f124SMoriah Waterland 		do {
440*5c51f124SMoriah Waterland 			if (inst = fpkginst(abbrev, alist[i], vlist[i])) {
441*5c51f124SMoriah Waterland 				if (strcmp(inst, rmpkginst) == 0) {
442*5c51f124SMoriah Waterland 					deponme(dname, "", a_preinstallCheck);
443*5c51f124SMoriah Waterland 					(void) fclose(fp);
444*5c51f124SMoriah Waterland 					(void) fpkginst(NULL);
445*5c51f124SMoriah Waterland 					return;
446*5c51f124SMoriah Waterland 				}
447*5c51f124SMoriah Waterland 			}
448*5c51f124SMoriah Waterland 		} while (++i < nlist);
449*5c51f124SMoriah Waterland 		(void) fpkginst(NULL);
450*5c51f124SMoriah Waterland 	}
451*5c51f124SMoriah Waterland 	(void) fclose(fp);
452*5c51f124SMoriah Waterland }
453