xref: /titanic_54/usr/src/cmd/svr4pkg/pkgremove/check.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 2003 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 #include <stdio.h>
32*5c51f124SMoriah Waterland #include <stdlib.h>
33*5c51f124SMoriah Waterland #include <unistd.h>
34*5c51f124SMoriah Waterland #include <string.h>
35*5c51f124SMoriah Waterland #ifndef SUNOS41
36*5c51f124SMoriah Waterland #include <utmpx.h>
37*5c51f124SMoriah Waterland #endif
38*5c51f124SMoriah Waterland #include <dirent.h>
39*5c51f124SMoriah Waterland #include <sys/types.h>
40*5c51f124SMoriah Waterland #include <pkgstrct.h>
41*5c51f124SMoriah Waterland #include <locale.h>
42*5c51f124SMoriah Waterland #include <libintl.h>
43*5c51f124SMoriah Waterland #include "install.h"
44*5c51f124SMoriah Waterland #include <pkglib.h>
45*5c51f124SMoriah Waterland #include "libadm.h"
46*5c51f124SMoriah Waterland #include "libinst.h"
47*5c51f124SMoriah Waterland #include "wsreg_pkgrm.h"
48*5c51f124SMoriah Waterland #include "messages.h"
49*5c51f124SMoriah Waterland 
50*5c51f124SMoriah Waterland extern struct admin adm;
51*5c51f124SMoriah Waterland /* extern struct cfent **eptlist; */
52*5c51f124SMoriah Waterland 
53*5c51f124SMoriah Waterland extern char	pkgloc[], *pkginst, *msgtext;
54*5c51f124SMoriah Waterland 
55*5c51f124SMoriah Waterland static boolean_t	preremoveCheck = B_FALSE;
56*5c51f124SMoriah Waterland static char		*zoneName = (char *)NULL;
57*5c51f124SMoriah Waterland 
58*5c51f124SMoriah Waterland 
59*5c51f124SMoriah Waterland void
60*5c51f124SMoriah Waterland rcksetPreremoveCheck(boolean_t a_preremoveCheck)
61*5c51f124SMoriah Waterland {
62*5c51f124SMoriah Waterland 	preremoveCheck = a_preremoveCheck;
63*5c51f124SMoriah Waterland }
64*5c51f124SMoriah Waterland 
65*5c51f124SMoriah Waterland void
66*5c51f124SMoriah Waterland rcksetZoneName(char *a_zoneName)
67*5c51f124SMoriah Waterland {
68*5c51f124SMoriah Waterland 	zoneName = a_zoneName;
69*5c51f124SMoriah Waterland }
70*5c51f124SMoriah Waterland 
71*5c51f124SMoriah Waterland int
72*5c51f124SMoriah Waterland rckrunlevel(void)
73*5c51f124SMoriah Waterland {
74*5c51f124SMoriah Waterland 	struct utmpx utmpx;
75*5c51f124SMoriah Waterland 	struct utmpx *putmpx;
76*5c51f124SMoriah Waterland 	char	ans[MAX_INPUT];
77*5c51f124SMoriah Waterland 	char	*pt;
78*5c51f124SMoriah Waterland 	char	*rstates;
79*5c51f124SMoriah Waterland 	int	n;
80*5c51f124SMoriah Waterland 	char	*uxstate;
81*5c51f124SMoriah Waterland 
82*5c51f124SMoriah Waterland 	if (ADM(runlevel, "nocheck")) {
83*5c51f124SMoriah Waterland 		return (0);
84*5c51f124SMoriah Waterland 	}
85*5c51f124SMoriah Waterland 
86*5c51f124SMoriah Waterland 	pt = getenv("RSTATES");
87*5c51f124SMoriah Waterland 	if (pt == NULL) {
88*5c51f124SMoriah Waterland 		return (0);
89*5c51f124SMoriah Waterland 	}
90*5c51f124SMoriah Waterland 
91*5c51f124SMoriah Waterland 	utmpx.ut_type = RUN_LVL;
92*5c51f124SMoriah Waterland 	putmpx = getutxid(&utmpx);
93*5c51f124SMoriah Waterland 	if (putmpx == NULL) {
94*5c51f124SMoriah Waterland 		progerr(ERR_RUNSTATE);
95*5c51f124SMoriah Waterland 		return (99);
96*5c51f124SMoriah Waterland 	}
97*5c51f124SMoriah Waterland 	uxstate = strtok(&putmpx->ut_line[10], " \t\n");
98*5c51f124SMoriah Waterland 
99*5c51f124SMoriah Waterland 	rstates = qstrdup(pt);
100*5c51f124SMoriah Waterland 	if ((pt = strtok(pt, " \t\n, ")) == NULL)
101*5c51f124SMoriah Waterland 		return (0); /* no list is no list */
102*5c51f124SMoriah Waterland 	do {
103*5c51f124SMoriah Waterland 		if (strcmp(pt, uxstate) == NULL) {
104*5c51f124SMoriah Waterland 			free(rstates);
105*5c51f124SMoriah Waterland 			return (0);
106*5c51f124SMoriah Waterland 		}
107*5c51f124SMoriah Waterland 	} while (pt = strtok(NULL, " \t\n, "));
108*5c51f124SMoriah Waterland 
109*5c51f124SMoriah Waterland 	if (preremoveCheck == B_FALSE) {
110*5c51f124SMoriah Waterland 		msgtext = MSG_PKGREMOVE_RUNLEVEL;
111*5c51f124SMoriah Waterland 		ptext(stderr, msgtext, uxstate);
112*5c51f124SMoriah Waterland 	} else {
113*5c51f124SMoriah Waterland 		(void) fprintf(stdout, "runlevel=%s", uxstate);
114*5c51f124SMoriah Waterland 	}
115*5c51f124SMoriah Waterland 
116*5c51f124SMoriah Waterland 	pt = strtok(rstates, " \t\n, ");
117*5c51f124SMoriah Waterland 	do {
118*5c51f124SMoriah Waterland 		if (preremoveCheck == B_FALSE) {
119*5c51f124SMoriah Waterland 			ptext(stderr, "\\t%s", pt);
120*5c51f124SMoriah Waterland 		} else {
121*5c51f124SMoriah Waterland 			(void) fprintf(stdout, ":%s", pt);
122*5c51f124SMoriah Waterland 		}
123*5c51f124SMoriah Waterland 	} while (pt = strtok(NULL, " \t\n, "));
124*5c51f124SMoriah Waterland 
125*5c51f124SMoriah Waterland 	if (preremoveCheck == B_TRUE) {
126*5c51f124SMoriah Waterland 		(void) fprintf(stdout, "\n");
127*5c51f124SMoriah Waterland 	}
128*5c51f124SMoriah Waterland 
129*5c51f124SMoriah Waterland 	free(rstates);
130*5c51f124SMoriah Waterland 
131*5c51f124SMoriah Waterland 	if (ADM(runlevel, "quit")) {
132*5c51f124SMoriah Waterland 		return (4);
133*5c51f124SMoriah Waterland 	}
134*5c51f124SMoriah Waterland 
135*5c51f124SMoriah Waterland 	if (echoGetFlag() == B_FALSE) {
136*5c51f124SMoriah Waterland 		return (5);
137*5c51f124SMoriah Waterland 	}
138*5c51f124SMoriah Waterland 
139*5c51f124SMoriah Waterland 	msgtext = NULL;
140*5c51f124SMoriah Waterland 
141*5c51f124SMoriah Waterland 	n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_RUNLEVEL,
142*5c51f124SMoriah Waterland 	    ASK_PKGREMOVE_CONTINUE);
143*5c51f124SMoriah Waterland 
144*5c51f124SMoriah Waterland 	if (n != 0) {
145*5c51f124SMoriah Waterland 		return (n);
146*5c51f124SMoriah Waterland 	}
147*5c51f124SMoriah Waterland 
148*5c51f124SMoriah Waterland 	if (strchr("yY", *ans) == NULL) {
149*5c51f124SMoriah Waterland 		return (3);
150*5c51f124SMoriah Waterland 	}
151*5c51f124SMoriah Waterland 
152*5c51f124SMoriah Waterland 	return (0);
153*5c51f124SMoriah Waterland }
154*5c51f124SMoriah Waterland 
155*5c51f124SMoriah Waterland int
156*5c51f124SMoriah Waterland rckpatchpkg(char *p, char *pt)
157*5c51f124SMoriah Waterland {
158*5c51f124SMoriah Waterland 	int n;
159*5c51f124SMoriah Waterland 	char ans[MAX_INPUT];
160*5c51f124SMoriah Waterland 
161*5c51f124SMoriah Waterland 	ptext(stderr, WRN_PKGREMOVE_PATCHES, p, p, p, pt);
162*5c51f124SMoriah Waterland 
163*5c51f124SMoriah Waterland 	n = ckyorn(ans, NULL, NULL, NULL, ASK_PKGREMOVE_CONTINUE);
164*5c51f124SMoriah Waterland 
165*5c51f124SMoriah Waterland 	if (n != 0) {
166*5c51f124SMoriah Waterland 		return (n);
167*5c51f124SMoriah Waterland 	}
168*5c51f124SMoriah Waterland 
169*5c51f124SMoriah Waterland 	if (strchr("yY", *ans) == NULL) {
170*5c51f124SMoriah Waterland 		return (3);
171*5c51f124SMoriah Waterland 	}
172*5c51f124SMoriah Waterland 
173*5c51f124SMoriah Waterland 	return (0);
174*5c51f124SMoriah Waterland }
175*5c51f124SMoriah Waterland 
176*5c51f124SMoriah Waterland int
177*5c51f124SMoriah Waterland rckdepend(void)
178*5c51f124SMoriah Waterland {
179*5c51f124SMoriah Waterland 	int	n;
180*5c51f124SMoriah Waterland 	char	ans[MAX_INPUT];
181*5c51f124SMoriah Waterland 	char	**id, **name;
182*5c51f124SMoriah Waterland 
183*5c51f124SMoriah Waterland 	if (ADM(rdepend, "nocheck")) {
184*5c51f124SMoriah Waterland 		return (0);
185*5c51f124SMoriah Waterland 	}
186*5c51f124SMoriah Waterland 
187*5c51f124SMoriah Waterland 	if (zoneName == (char *)NULL) {
188*5c51f124SMoriah Waterland 		echo(MSG_CHECKREMOVE_PKG_IN_GZ, pkginst);
189*5c51f124SMoriah Waterland 	} else {
190*5c51f124SMoriah Waterland 		echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
191*5c51f124SMoriah Waterland 	}
192*5c51f124SMoriah Waterland 
193*5c51f124SMoriah Waterland 	if (wsreg_pkgrm_check(get_inst_root(), pkginst, &id, &name) > 0) {
194*5c51f124SMoriah Waterland 		int i;
195*5c51f124SMoriah Waterland 
196*5c51f124SMoriah Waterland 		if (ADM(rdepend, "quit")) {
197*5c51f124SMoriah Waterland 			return (4);
198*5c51f124SMoriah Waterland 		}
199*5c51f124SMoriah Waterland 
200*5c51f124SMoriah Waterland 		if (echoGetFlag() == B_FALSE) {
201*5c51f124SMoriah Waterland 			return (5);
202*5c51f124SMoriah Waterland 		}
203*5c51f124SMoriah Waterland 
204*5c51f124SMoriah Waterland 		msgtext = MSG_PKGREMOVE_WSDEPEND;
205*5c51f124SMoriah Waterland 		echo(msgtext);
206*5c51f124SMoriah Waterland 
207*5c51f124SMoriah Waterland 		(void) printf("%-36s  %s", MSG_PKGREMOVE_ID_STR,
208*5c51f124SMoriah Waterland 		    MSG_PKGREMOVE_NAME_STR);
209*5c51f124SMoriah Waterland 		(void) printf("\n------------------------------------  "
210*5c51f124SMoriah Waterland 		    "--------------------------------------\n");
211*5c51f124SMoriah Waterland 
212*5c51f124SMoriah Waterland 		for (i = 0; id[i] != NULL; i++) {
213*5c51f124SMoriah Waterland 			(void) printf("%-36s  %s\n", id[i],
214*5c51f124SMoriah Waterland 			    (name[i])?(name[i]):"");
215*5c51f124SMoriah Waterland 			free(id[i]);
216*5c51f124SMoriah Waterland 			if (name[i]) {
217*5c51f124SMoriah Waterland 				free(name[i]);
218*5c51f124SMoriah Waterland 			}
219*5c51f124SMoriah Waterland 		}
220*5c51f124SMoriah Waterland 
221*5c51f124SMoriah Waterland 		free(id);
222*5c51f124SMoriah Waterland 		free(name);
223*5c51f124SMoriah Waterland 
224*5c51f124SMoriah Waterland 		msgtext = NULL;
225*5c51f124SMoriah Waterland 
226*5c51f124SMoriah Waterland 		n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_WSDEPEND,
227*5c51f124SMoriah Waterland 		    ASK_PKGREMOVE_CONTINUE);
228*5c51f124SMoriah Waterland 
229*5c51f124SMoriah Waterland 		if (n != 0) {
230*5c51f124SMoriah Waterland 			return (n);
231*5c51f124SMoriah Waterland 		}
232*5c51f124SMoriah Waterland 
233*5c51f124SMoriah Waterland 		if (strchr("yY", *ans) == NULL) {
234*5c51f124SMoriah Waterland 			return (3);
235*5c51f124SMoriah Waterland 		}
236*5c51f124SMoriah Waterland 	}
237*5c51f124SMoriah Waterland 
238*5c51f124SMoriah Waterland 	if (dockdeps(pkginst, 1, preremoveCheck)) {
239*5c51f124SMoriah Waterland 		msgtext = MSG_PKGREMOVE_DEPEND;
240*5c51f124SMoriah Waterland 
241*5c51f124SMoriah Waterland 		if (preremoveCheck == B_FALSE) {
242*5c51f124SMoriah Waterland 			echo(msgtext);
243*5c51f124SMoriah Waterland 		}
244*5c51f124SMoriah Waterland 
245*5c51f124SMoriah Waterland 		if (ADM(rdepend, "quit")) {
246*5c51f124SMoriah Waterland 			return (4);
247*5c51f124SMoriah Waterland 		}
248*5c51f124SMoriah Waterland 
249*5c51f124SMoriah Waterland 		if (echoGetFlag() == B_FALSE) {
250*5c51f124SMoriah Waterland 			return (5);
251*5c51f124SMoriah Waterland 		}
252*5c51f124SMoriah Waterland 
253*5c51f124SMoriah Waterland 		msgtext = NULL;
254*5c51f124SMoriah Waterland 
255*5c51f124SMoriah Waterland 		n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_DEPEND,
256*5c51f124SMoriah Waterland 		    ASK_PKGREMOVE_CONTINUE);
257*5c51f124SMoriah Waterland 
258*5c51f124SMoriah Waterland 		if (n != 0) {
259*5c51f124SMoriah Waterland 			return (n);
260*5c51f124SMoriah Waterland 		}
261*5c51f124SMoriah Waterland 
262*5c51f124SMoriah Waterland 		if (strchr("yY", *ans) == NULL) {
263*5c51f124SMoriah Waterland 			return (3);
264*5c51f124SMoriah Waterland 		}
265*5c51f124SMoriah Waterland 	}
266*5c51f124SMoriah Waterland 
267*5c51f124SMoriah Waterland 	return (0);
268*5c51f124SMoriah Waterland }
269*5c51f124SMoriah Waterland 
270*5c51f124SMoriah Waterland int
271*5c51f124SMoriah Waterland rckpriv(void)
272*5c51f124SMoriah Waterland {
273*5c51f124SMoriah Waterland 	struct dirent	*dp;
274*5c51f124SMoriah Waterland 	DIR		*dirfp;
275*5c51f124SMoriah Waterland 	int		n;
276*5c51f124SMoriah Waterland 	char		found;
277*5c51f124SMoriah Waterland 	char		ans[MAX_INPUT];
278*5c51f124SMoriah Waterland 	char		path[PATH_MAX];
279*5c51f124SMoriah Waterland 
280*5c51f124SMoriah Waterland 	if (ADM(action, "nocheck")) {
281*5c51f124SMoriah Waterland 		return (0);
282*5c51f124SMoriah Waterland 	}
283*5c51f124SMoriah Waterland 
284*5c51f124SMoriah Waterland 	(void) snprintf(path, sizeof (path), "%s/install", pkgloc);
285*5c51f124SMoriah Waterland 	if ((dirfp = opendir(path)) == NULL)
286*5c51f124SMoriah Waterland 		return (0);
287*5c51f124SMoriah Waterland 
288*5c51f124SMoriah Waterland 	found = 0;
289*5c51f124SMoriah Waterland 	while ((dp = readdir(dirfp)) != NULL) {
290*5c51f124SMoriah Waterland 		if ((strcmp(dp->d_name, "preremove") == NULL) ||
291*5c51f124SMoriah Waterland 		    (strcmp(dp->d_name, "postremove") == NULL) ||
292*5c51f124SMoriah Waterland 		    (strncmp(dp->d_name, "r.", 2) == NULL)) {
293*5c51f124SMoriah Waterland 			found++;
294*5c51f124SMoriah Waterland 			break;
295*5c51f124SMoriah Waterland 		}
296*5c51f124SMoriah Waterland 	}
297*5c51f124SMoriah Waterland 	(void) closedir(dirfp);
298*5c51f124SMoriah Waterland 
299*5c51f124SMoriah Waterland 	if (found) {
300*5c51f124SMoriah Waterland 		if (preremoveCheck == B_FALSE) {
301*5c51f124SMoriah Waterland 			ptext(stderr, MSG_PKGREMOVE_PRIV);
302*5c51f124SMoriah Waterland 		}
303*5c51f124SMoriah Waterland 		msgtext = MSG_PKGSCRIPTS_FOUND;
304*5c51f124SMoriah Waterland 
305*5c51f124SMoriah Waterland 		if (ADM(action, "quit")) {
306*5c51f124SMoriah Waterland 			return (4);
307*5c51f124SMoriah Waterland 		}
308*5c51f124SMoriah Waterland 
309*5c51f124SMoriah Waterland 		if (echoGetFlag() == B_FALSE) {
310*5c51f124SMoriah Waterland 			return (5);
311*5c51f124SMoriah Waterland 		}
312*5c51f124SMoriah Waterland 
313*5c51f124SMoriah Waterland 		msgtext = NULL;
314*5c51f124SMoriah Waterland 
315*5c51f124SMoriah Waterland 		n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_PRIV,
316*5c51f124SMoriah Waterland 		    ASK_PKGREMOVE_CONTINUE);
317*5c51f124SMoriah Waterland 
318*5c51f124SMoriah Waterland 		if (n != 0) {
319*5c51f124SMoriah Waterland 			return (n);
320*5c51f124SMoriah Waterland 		}
321*5c51f124SMoriah Waterland 
322*5c51f124SMoriah Waterland 		if (strchr("yY", *ans) == NULL) {
323*5c51f124SMoriah Waterland 			return (3);
324*5c51f124SMoriah Waterland 		}
325*5c51f124SMoriah Waterland 	}
326*5c51f124SMoriah Waterland 
327*5c51f124SMoriah Waterland 	return (0);
328*5c51f124SMoriah Waterland }
329