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