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
rcksetPreremoveCheck(boolean_t a_preremoveCheck)60 rcksetPreremoveCheck(boolean_t a_preremoveCheck)
61 {
62 preremoveCheck = a_preremoveCheck;
63 }
64
65 void
rcksetZoneName(char * a_zoneName)66 rcksetZoneName(char *a_zoneName)
67 {
68 zoneName = a_zoneName;
69 }
70
71 int
rckrunlevel(void)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
rckpatchpkg(char * p,char * pt)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
rckdepend(void)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
rckpriv(void)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