xref: /onnv-gate/usr/src/cmd/svr4pkg/pkgremove/check.c (revision 9781:ccf49524d5dc)
1*9781SMoriah.Waterland@Sun.COM /*
2*9781SMoriah.Waterland@Sun.COM  * CDDL HEADER START
3*9781SMoriah.Waterland@Sun.COM  *
4*9781SMoriah.Waterland@Sun.COM  * The contents of this file are subject to the terms of the
5*9781SMoriah.Waterland@Sun.COM  * Common Development and Distribution License (the "License").
6*9781SMoriah.Waterland@Sun.COM  * You may not use this file except in compliance with the License.
7*9781SMoriah.Waterland@Sun.COM  *
8*9781SMoriah.Waterland@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9781SMoriah.Waterland@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*9781SMoriah.Waterland@Sun.COM  * See the License for the specific language governing permissions
11*9781SMoriah.Waterland@Sun.COM  * and limitations under the License.
12*9781SMoriah.Waterland@Sun.COM  *
13*9781SMoriah.Waterland@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*9781SMoriah.Waterland@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9781SMoriah.Waterland@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*9781SMoriah.Waterland@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*9781SMoriah.Waterland@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9781SMoriah.Waterland@Sun.COM  *
19*9781SMoriah.Waterland@Sun.COM  * CDDL HEADER END
20*9781SMoriah.Waterland@Sun.COM  */
21*9781SMoriah.Waterland@Sun.COM 
22*9781SMoriah.Waterland@Sun.COM /*
23*9781SMoriah.Waterland@Sun.COM  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
24*9781SMoriah.Waterland@Sun.COM  * Use is subject to license terms.
25*9781SMoriah.Waterland@Sun.COM  */
26*9781SMoriah.Waterland@Sun.COM 
27*9781SMoriah.Waterland@Sun.COM /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28*9781SMoriah.Waterland@Sun.COM /* All Rights Reserved */
29*9781SMoriah.Waterland@Sun.COM 
30*9781SMoriah.Waterland@Sun.COM 
31*9781SMoriah.Waterland@Sun.COM #include <stdio.h>
32*9781SMoriah.Waterland@Sun.COM #include <stdlib.h>
33*9781SMoriah.Waterland@Sun.COM #include <unistd.h>
34*9781SMoriah.Waterland@Sun.COM #include <string.h>
35*9781SMoriah.Waterland@Sun.COM #ifndef SUNOS41
36*9781SMoriah.Waterland@Sun.COM #include <utmpx.h>
37*9781SMoriah.Waterland@Sun.COM #endif
38*9781SMoriah.Waterland@Sun.COM #include <dirent.h>
39*9781SMoriah.Waterland@Sun.COM #include <sys/types.h>
40*9781SMoriah.Waterland@Sun.COM #include <pkgstrct.h>
41*9781SMoriah.Waterland@Sun.COM #include <locale.h>
42*9781SMoriah.Waterland@Sun.COM #include <libintl.h>
43*9781SMoriah.Waterland@Sun.COM #include "install.h"
44*9781SMoriah.Waterland@Sun.COM #include <pkglib.h>
45*9781SMoriah.Waterland@Sun.COM #include "libadm.h"
46*9781SMoriah.Waterland@Sun.COM #include "libinst.h"
47*9781SMoriah.Waterland@Sun.COM #include "wsreg_pkgrm.h"
48*9781SMoriah.Waterland@Sun.COM #include "messages.h"
49*9781SMoriah.Waterland@Sun.COM 
50*9781SMoriah.Waterland@Sun.COM extern struct admin adm;
51*9781SMoriah.Waterland@Sun.COM /* extern struct cfent **eptlist; */
52*9781SMoriah.Waterland@Sun.COM 
53*9781SMoriah.Waterland@Sun.COM extern char	pkgloc[], *pkginst, *msgtext;
54*9781SMoriah.Waterland@Sun.COM 
55*9781SMoriah.Waterland@Sun.COM static boolean_t	preremoveCheck = B_FALSE;
56*9781SMoriah.Waterland@Sun.COM static char		*zoneName = (char *)NULL;
57*9781SMoriah.Waterland@Sun.COM 
58*9781SMoriah.Waterland@Sun.COM 
59*9781SMoriah.Waterland@Sun.COM void
rcksetPreremoveCheck(boolean_t a_preremoveCheck)60*9781SMoriah.Waterland@Sun.COM rcksetPreremoveCheck(boolean_t a_preremoveCheck)
61*9781SMoriah.Waterland@Sun.COM {
62*9781SMoriah.Waterland@Sun.COM 	preremoveCheck = a_preremoveCheck;
63*9781SMoriah.Waterland@Sun.COM }
64*9781SMoriah.Waterland@Sun.COM 
65*9781SMoriah.Waterland@Sun.COM void
rcksetZoneName(char * a_zoneName)66*9781SMoriah.Waterland@Sun.COM rcksetZoneName(char *a_zoneName)
67*9781SMoriah.Waterland@Sun.COM {
68*9781SMoriah.Waterland@Sun.COM 	zoneName = a_zoneName;
69*9781SMoriah.Waterland@Sun.COM }
70*9781SMoriah.Waterland@Sun.COM 
71*9781SMoriah.Waterland@Sun.COM int
rckrunlevel(void)72*9781SMoriah.Waterland@Sun.COM rckrunlevel(void)
73*9781SMoriah.Waterland@Sun.COM {
74*9781SMoriah.Waterland@Sun.COM 	struct utmpx utmpx;
75*9781SMoriah.Waterland@Sun.COM 	struct utmpx *putmpx;
76*9781SMoriah.Waterland@Sun.COM 	char	ans[MAX_INPUT];
77*9781SMoriah.Waterland@Sun.COM 	char	*pt;
78*9781SMoriah.Waterland@Sun.COM 	char	*rstates;
79*9781SMoriah.Waterland@Sun.COM 	int	n;
80*9781SMoriah.Waterland@Sun.COM 	char	*uxstate;
81*9781SMoriah.Waterland@Sun.COM 
82*9781SMoriah.Waterland@Sun.COM 	if (ADM(runlevel, "nocheck")) {
83*9781SMoriah.Waterland@Sun.COM 		return (0);
84*9781SMoriah.Waterland@Sun.COM 	}
85*9781SMoriah.Waterland@Sun.COM 
86*9781SMoriah.Waterland@Sun.COM 	pt = getenv("RSTATES");
87*9781SMoriah.Waterland@Sun.COM 	if (pt == NULL) {
88*9781SMoriah.Waterland@Sun.COM 		return (0);
89*9781SMoriah.Waterland@Sun.COM 	}
90*9781SMoriah.Waterland@Sun.COM 
91*9781SMoriah.Waterland@Sun.COM 	utmpx.ut_type = RUN_LVL;
92*9781SMoriah.Waterland@Sun.COM 	putmpx = getutxid(&utmpx);
93*9781SMoriah.Waterland@Sun.COM 	if (putmpx == NULL) {
94*9781SMoriah.Waterland@Sun.COM 		progerr(ERR_RUNSTATE);
95*9781SMoriah.Waterland@Sun.COM 		return (99);
96*9781SMoriah.Waterland@Sun.COM 	}
97*9781SMoriah.Waterland@Sun.COM 	uxstate = strtok(&putmpx->ut_line[10], " \t\n");
98*9781SMoriah.Waterland@Sun.COM 
99*9781SMoriah.Waterland@Sun.COM 	rstates = qstrdup(pt);
100*9781SMoriah.Waterland@Sun.COM 	if ((pt = strtok(pt, " \t\n, ")) == NULL)
101*9781SMoriah.Waterland@Sun.COM 		return (0); /* no list is no list */
102*9781SMoriah.Waterland@Sun.COM 	do {
103*9781SMoriah.Waterland@Sun.COM 		if (strcmp(pt, uxstate) == NULL) {
104*9781SMoriah.Waterland@Sun.COM 			free(rstates);
105*9781SMoriah.Waterland@Sun.COM 			return (0);
106*9781SMoriah.Waterland@Sun.COM 		}
107*9781SMoriah.Waterland@Sun.COM 	} while (pt = strtok(NULL, " \t\n, "));
108*9781SMoriah.Waterland@Sun.COM 
109*9781SMoriah.Waterland@Sun.COM 	if (preremoveCheck == B_FALSE) {
110*9781SMoriah.Waterland@Sun.COM 		msgtext = MSG_PKGREMOVE_RUNLEVEL;
111*9781SMoriah.Waterland@Sun.COM 		ptext(stderr, msgtext, uxstate);
112*9781SMoriah.Waterland@Sun.COM 	} else {
113*9781SMoriah.Waterland@Sun.COM 		(void) fprintf(stdout, "runlevel=%s", uxstate);
114*9781SMoriah.Waterland@Sun.COM 	}
115*9781SMoriah.Waterland@Sun.COM 
116*9781SMoriah.Waterland@Sun.COM 	pt = strtok(rstates, " \t\n, ");
117*9781SMoriah.Waterland@Sun.COM 	do {
118*9781SMoriah.Waterland@Sun.COM 		if (preremoveCheck == B_FALSE) {
119*9781SMoriah.Waterland@Sun.COM 			ptext(stderr, "\\t%s", pt);
120*9781SMoriah.Waterland@Sun.COM 		} else {
121*9781SMoriah.Waterland@Sun.COM 			(void) fprintf(stdout, ":%s", pt);
122*9781SMoriah.Waterland@Sun.COM 		}
123*9781SMoriah.Waterland@Sun.COM 	} while (pt = strtok(NULL, " \t\n, "));
124*9781SMoriah.Waterland@Sun.COM 
125*9781SMoriah.Waterland@Sun.COM 	if (preremoveCheck == B_TRUE) {
126*9781SMoriah.Waterland@Sun.COM 		(void) fprintf(stdout, "\n");
127*9781SMoriah.Waterland@Sun.COM 	}
128*9781SMoriah.Waterland@Sun.COM 
129*9781SMoriah.Waterland@Sun.COM 	free(rstates);
130*9781SMoriah.Waterland@Sun.COM 
131*9781SMoriah.Waterland@Sun.COM 	if (ADM(runlevel, "quit")) {
132*9781SMoriah.Waterland@Sun.COM 		return (4);
133*9781SMoriah.Waterland@Sun.COM 	}
134*9781SMoriah.Waterland@Sun.COM 
135*9781SMoriah.Waterland@Sun.COM 	if (echoGetFlag() == B_FALSE) {
136*9781SMoriah.Waterland@Sun.COM 		return (5);
137*9781SMoriah.Waterland@Sun.COM 	}
138*9781SMoriah.Waterland@Sun.COM 
139*9781SMoriah.Waterland@Sun.COM 	msgtext = NULL;
140*9781SMoriah.Waterland@Sun.COM 
141*9781SMoriah.Waterland@Sun.COM 	n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_RUNLEVEL,
142*9781SMoriah.Waterland@Sun.COM 	    ASK_PKGREMOVE_CONTINUE);
143*9781SMoriah.Waterland@Sun.COM 
144*9781SMoriah.Waterland@Sun.COM 	if (n != 0) {
145*9781SMoriah.Waterland@Sun.COM 		return (n);
146*9781SMoriah.Waterland@Sun.COM 	}
147*9781SMoriah.Waterland@Sun.COM 
148*9781SMoriah.Waterland@Sun.COM 	if (strchr("yY", *ans) == NULL) {
149*9781SMoriah.Waterland@Sun.COM 		return (3);
150*9781SMoriah.Waterland@Sun.COM 	}
151*9781SMoriah.Waterland@Sun.COM 
152*9781SMoriah.Waterland@Sun.COM 	return (0);
153*9781SMoriah.Waterland@Sun.COM }
154*9781SMoriah.Waterland@Sun.COM 
155*9781SMoriah.Waterland@Sun.COM int
rckpatchpkg(char * p,char * pt)156*9781SMoriah.Waterland@Sun.COM rckpatchpkg(char *p, char *pt)
157*9781SMoriah.Waterland@Sun.COM {
158*9781SMoriah.Waterland@Sun.COM 	int n;
159*9781SMoriah.Waterland@Sun.COM 	char ans[MAX_INPUT];
160*9781SMoriah.Waterland@Sun.COM 
161*9781SMoriah.Waterland@Sun.COM 	ptext(stderr, WRN_PKGREMOVE_PATCHES, p, p, p, pt);
162*9781SMoriah.Waterland@Sun.COM 
163*9781SMoriah.Waterland@Sun.COM 	n = ckyorn(ans, NULL, NULL, NULL, ASK_PKGREMOVE_CONTINUE);
164*9781SMoriah.Waterland@Sun.COM 
165*9781SMoriah.Waterland@Sun.COM 	if (n != 0) {
166*9781SMoriah.Waterland@Sun.COM 		return (n);
167*9781SMoriah.Waterland@Sun.COM 	}
168*9781SMoriah.Waterland@Sun.COM 
169*9781SMoriah.Waterland@Sun.COM 	if (strchr("yY", *ans) == NULL) {
170*9781SMoriah.Waterland@Sun.COM 		return (3);
171*9781SMoriah.Waterland@Sun.COM 	}
172*9781SMoriah.Waterland@Sun.COM 
173*9781SMoriah.Waterland@Sun.COM 	return (0);
174*9781SMoriah.Waterland@Sun.COM }
175*9781SMoriah.Waterland@Sun.COM 
176*9781SMoriah.Waterland@Sun.COM int
rckdepend(void)177*9781SMoriah.Waterland@Sun.COM rckdepend(void)
178*9781SMoriah.Waterland@Sun.COM {
179*9781SMoriah.Waterland@Sun.COM 	int	n;
180*9781SMoriah.Waterland@Sun.COM 	char	ans[MAX_INPUT];
181*9781SMoriah.Waterland@Sun.COM 	char	**id, **name;
182*9781SMoriah.Waterland@Sun.COM 
183*9781SMoriah.Waterland@Sun.COM 	if (ADM(rdepend, "nocheck")) {
184*9781SMoriah.Waterland@Sun.COM 		return (0);
185*9781SMoriah.Waterland@Sun.COM 	}
186*9781SMoriah.Waterland@Sun.COM 
187*9781SMoriah.Waterland@Sun.COM 	if (zoneName == (char *)NULL) {
188*9781SMoriah.Waterland@Sun.COM 		echo(MSG_CHECKREMOVE_PKG_IN_GZ, pkginst);
189*9781SMoriah.Waterland@Sun.COM 	} else {
190*9781SMoriah.Waterland@Sun.COM 		echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
191*9781SMoriah.Waterland@Sun.COM 	}
192*9781SMoriah.Waterland@Sun.COM 
193*9781SMoriah.Waterland@Sun.COM 	if (wsreg_pkgrm_check(get_inst_root(), pkginst, &id, &name) > 0) {
194*9781SMoriah.Waterland@Sun.COM 		int i;
195*9781SMoriah.Waterland@Sun.COM 
196*9781SMoriah.Waterland@Sun.COM 		if (ADM(rdepend, "quit")) {
197*9781SMoriah.Waterland@Sun.COM 			return (4);
198*9781SMoriah.Waterland@Sun.COM 		}
199*9781SMoriah.Waterland@Sun.COM 
200*9781SMoriah.Waterland@Sun.COM 		if (echoGetFlag() == B_FALSE) {
201*9781SMoriah.Waterland@Sun.COM 			return (5);
202*9781SMoriah.Waterland@Sun.COM 		}
203*9781SMoriah.Waterland@Sun.COM 
204*9781SMoriah.Waterland@Sun.COM 		msgtext = MSG_PKGREMOVE_WSDEPEND;
205*9781SMoriah.Waterland@Sun.COM 		echo(msgtext);
206*9781SMoriah.Waterland@Sun.COM 
207*9781SMoriah.Waterland@Sun.COM 		(void) printf("%-36s  %s", MSG_PKGREMOVE_ID_STR,
208*9781SMoriah.Waterland@Sun.COM 		    MSG_PKGREMOVE_NAME_STR);
209*9781SMoriah.Waterland@Sun.COM 		(void) printf("\n------------------------------------  "
210*9781SMoriah.Waterland@Sun.COM 		    "--------------------------------------\n");
211*9781SMoriah.Waterland@Sun.COM 
212*9781SMoriah.Waterland@Sun.COM 		for (i = 0; id[i] != NULL; i++) {
213*9781SMoriah.Waterland@Sun.COM 			(void) printf("%-36s  %s\n", id[i],
214*9781SMoriah.Waterland@Sun.COM 			    (name[i])?(name[i]):"");
215*9781SMoriah.Waterland@Sun.COM 			free(id[i]);
216*9781SMoriah.Waterland@Sun.COM 			if (name[i]) {
217*9781SMoriah.Waterland@Sun.COM 				free(name[i]);
218*9781SMoriah.Waterland@Sun.COM 			}
219*9781SMoriah.Waterland@Sun.COM 		}
220*9781SMoriah.Waterland@Sun.COM 
221*9781SMoriah.Waterland@Sun.COM 		free(id);
222*9781SMoriah.Waterland@Sun.COM 		free(name);
223*9781SMoriah.Waterland@Sun.COM 
224*9781SMoriah.Waterland@Sun.COM 		msgtext = NULL;
225*9781SMoriah.Waterland@Sun.COM 
226*9781SMoriah.Waterland@Sun.COM 		n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_WSDEPEND,
227*9781SMoriah.Waterland@Sun.COM 		    ASK_PKGREMOVE_CONTINUE);
228*9781SMoriah.Waterland@Sun.COM 
229*9781SMoriah.Waterland@Sun.COM 		if (n != 0) {
230*9781SMoriah.Waterland@Sun.COM 			return (n);
231*9781SMoriah.Waterland@Sun.COM 		}
232*9781SMoriah.Waterland@Sun.COM 
233*9781SMoriah.Waterland@Sun.COM 		if (strchr("yY", *ans) == NULL) {
234*9781SMoriah.Waterland@Sun.COM 			return (3);
235*9781SMoriah.Waterland@Sun.COM 		}
236*9781SMoriah.Waterland@Sun.COM 	}
237*9781SMoriah.Waterland@Sun.COM 
238*9781SMoriah.Waterland@Sun.COM 	if (dockdeps(pkginst, 1, preremoveCheck)) {
239*9781SMoriah.Waterland@Sun.COM 		msgtext = MSG_PKGREMOVE_DEPEND;
240*9781SMoriah.Waterland@Sun.COM 
241*9781SMoriah.Waterland@Sun.COM 		if (preremoveCheck == B_FALSE) {
242*9781SMoriah.Waterland@Sun.COM 			echo(msgtext);
243*9781SMoriah.Waterland@Sun.COM 		}
244*9781SMoriah.Waterland@Sun.COM 
245*9781SMoriah.Waterland@Sun.COM 		if (ADM(rdepend, "quit")) {
246*9781SMoriah.Waterland@Sun.COM 			return (4);
247*9781SMoriah.Waterland@Sun.COM 		}
248*9781SMoriah.Waterland@Sun.COM 
249*9781SMoriah.Waterland@Sun.COM 		if (echoGetFlag() == B_FALSE) {
250*9781SMoriah.Waterland@Sun.COM 			return (5);
251*9781SMoriah.Waterland@Sun.COM 		}
252*9781SMoriah.Waterland@Sun.COM 
253*9781SMoriah.Waterland@Sun.COM 		msgtext = NULL;
254*9781SMoriah.Waterland@Sun.COM 
255*9781SMoriah.Waterland@Sun.COM 		n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_DEPEND,
256*9781SMoriah.Waterland@Sun.COM 		    ASK_PKGREMOVE_CONTINUE);
257*9781SMoriah.Waterland@Sun.COM 
258*9781SMoriah.Waterland@Sun.COM 		if (n != 0) {
259*9781SMoriah.Waterland@Sun.COM 			return (n);
260*9781SMoriah.Waterland@Sun.COM 		}
261*9781SMoriah.Waterland@Sun.COM 
262*9781SMoriah.Waterland@Sun.COM 		if (strchr("yY", *ans) == NULL) {
263*9781SMoriah.Waterland@Sun.COM 			return (3);
264*9781SMoriah.Waterland@Sun.COM 		}
265*9781SMoriah.Waterland@Sun.COM 	}
266*9781SMoriah.Waterland@Sun.COM 
267*9781SMoriah.Waterland@Sun.COM 	return (0);
268*9781SMoriah.Waterland@Sun.COM }
269*9781SMoriah.Waterland@Sun.COM 
270*9781SMoriah.Waterland@Sun.COM int
rckpriv(void)271*9781SMoriah.Waterland@Sun.COM rckpriv(void)
272*9781SMoriah.Waterland@Sun.COM {
273*9781SMoriah.Waterland@Sun.COM 	struct dirent	*dp;
274*9781SMoriah.Waterland@Sun.COM 	DIR		*dirfp;
275*9781SMoriah.Waterland@Sun.COM 	int		n;
276*9781SMoriah.Waterland@Sun.COM 	char		found;
277*9781SMoriah.Waterland@Sun.COM 	char		ans[MAX_INPUT];
278*9781SMoriah.Waterland@Sun.COM 	char		path[PATH_MAX];
279*9781SMoriah.Waterland@Sun.COM 
280*9781SMoriah.Waterland@Sun.COM 	if (ADM(action, "nocheck")) {
281*9781SMoriah.Waterland@Sun.COM 		return (0);
282*9781SMoriah.Waterland@Sun.COM 	}
283*9781SMoriah.Waterland@Sun.COM 
284*9781SMoriah.Waterland@Sun.COM 	(void) snprintf(path, sizeof (path), "%s/install", pkgloc);
285*9781SMoriah.Waterland@Sun.COM 	if ((dirfp = opendir(path)) == NULL)
286*9781SMoriah.Waterland@Sun.COM 		return (0);
287*9781SMoriah.Waterland@Sun.COM 
288*9781SMoriah.Waterland@Sun.COM 	found = 0;
289*9781SMoriah.Waterland@Sun.COM 	while ((dp = readdir(dirfp)) != NULL) {
290*9781SMoriah.Waterland@Sun.COM 		if ((strcmp(dp->d_name, "preremove") == NULL) ||
291*9781SMoriah.Waterland@Sun.COM 		    (strcmp(dp->d_name, "postremove") == NULL) ||
292*9781SMoriah.Waterland@Sun.COM 		    (strncmp(dp->d_name, "r.", 2) == NULL)) {
293*9781SMoriah.Waterland@Sun.COM 			found++;
294*9781SMoriah.Waterland@Sun.COM 			break;
295*9781SMoriah.Waterland@Sun.COM 		}
296*9781SMoriah.Waterland@Sun.COM 	}
297*9781SMoriah.Waterland@Sun.COM 	(void) closedir(dirfp);
298*9781SMoriah.Waterland@Sun.COM 
299*9781SMoriah.Waterland@Sun.COM 	if (found) {
300*9781SMoriah.Waterland@Sun.COM 		if (preremoveCheck == B_FALSE) {
301*9781SMoriah.Waterland@Sun.COM 			ptext(stderr, MSG_PKGREMOVE_PRIV);
302*9781SMoriah.Waterland@Sun.COM 		}
303*9781SMoriah.Waterland@Sun.COM 		msgtext = MSG_PKGSCRIPTS_FOUND;
304*9781SMoriah.Waterland@Sun.COM 
305*9781SMoriah.Waterland@Sun.COM 		if (ADM(action, "quit")) {
306*9781SMoriah.Waterland@Sun.COM 			return (4);
307*9781SMoriah.Waterland@Sun.COM 		}
308*9781SMoriah.Waterland@Sun.COM 
309*9781SMoriah.Waterland@Sun.COM 		if (echoGetFlag() == B_FALSE) {
310*9781SMoriah.Waterland@Sun.COM 			return (5);
311*9781SMoriah.Waterland@Sun.COM 		}
312*9781SMoriah.Waterland@Sun.COM 
313*9781SMoriah.Waterland@Sun.COM 		msgtext = NULL;
314*9781SMoriah.Waterland@Sun.COM 
315*9781SMoriah.Waterland@Sun.COM 		n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_PRIV,
316*9781SMoriah.Waterland@Sun.COM 		    ASK_PKGREMOVE_CONTINUE);
317*9781SMoriah.Waterland@Sun.COM 
318*9781SMoriah.Waterland@Sun.COM 		if (n != 0) {
319*9781SMoriah.Waterland@Sun.COM 			return (n);
320*9781SMoriah.Waterland@Sun.COM 		}
321*9781SMoriah.Waterland@Sun.COM 
322*9781SMoriah.Waterland@Sun.COM 		if (strchr("yY", *ans) == NULL) {
323*9781SMoriah.Waterland@Sun.COM 			return (3);
324*9781SMoriah.Waterland@Sun.COM 		}
325*9781SMoriah.Waterland@Sun.COM 	}
326*9781SMoriah.Waterland@Sun.COM 
327*9781SMoriah.Waterland@Sun.COM 	return (0);
328*9781SMoriah.Waterland@Sun.COM }
329