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