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 (c) 2017 Peter Tribble.
24 */
25
26 /*
27 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
28 * Use is subject to license terms.
29 */
30
31 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
32 /* All Rights Reserved */
33
34
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <unistd.h>
38 #include <string.h>
39 #include <utmpx.h>
40 #include <dirent.h>
41 #include <sys/types.h>
42 #include <pkgstrct.h>
43 #include <locale.h>
44 #include <libintl.h>
45 #include "install.h"
46 #include <pkglib.h>
47 #include "libadm.h"
48 #include "libinst.h"
49 #include "messages.h"
50
51 extern struct admin adm;
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) == 0) {
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
rckdepend(void)156 rckdepend(void)
157 {
158 int n;
159 char ans[MAX_INPUT];
160
161 if (ADM(rdepend, "nocheck")) {
162 return (0);
163 }
164
165 if (zoneName == (char *)NULL) {
166 echo(MSG_CHECKREMOVE_PKG_IN_GZ, pkginst);
167 } else {
168 echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
169 }
170
171 if (dockdeps(pkginst, 1, preremoveCheck)) {
172 msgtext = MSG_PKGREMOVE_DEPEND;
173
174 if (preremoveCheck == B_FALSE) {
175 echo(msgtext);
176 }
177
178 if (ADM(rdepend, "quit")) {
179 return (4);
180 }
181
182 if (echoGetFlag() == B_FALSE) {
183 return (5);
184 }
185
186 msgtext = NULL;
187
188 n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_DEPEND,
189 ASK_PKGREMOVE_CONTINUE);
190
191 if (n != 0) {
192 return (n);
193 }
194
195 if (strchr("yY", *ans) == NULL) {
196 return (3);
197 }
198 }
199
200 return (0);
201 }
202
203 int
rckpriv(void)204 rckpriv(void)
205 {
206 struct dirent *dp;
207 DIR *dirfp;
208 int n;
209 char found;
210 char ans[MAX_INPUT];
211 char path[PATH_MAX];
212
213 if (ADM(action, "nocheck")) {
214 return (0);
215 }
216
217 (void) snprintf(path, sizeof (path), "%s/install", pkgloc);
218 if ((dirfp = opendir(path)) == NULL)
219 return (0);
220
221 found = 0;
222 while ((dp = readdir(dirfp)) != NULL) {
223 if ((strcmp(dp->d_name, "preremove") == 0) ||
224 (strcmp(dp->d_name, "postremove") == 0) ||
225 (strncmp(dp->d_name, "r.", 2) == 0)) {
226 found++;
227 break;
228 }
229 }
230 (void) closedir(dirfp);
231
232 if (found) {
233 if (preremoveCheck == B_FALSE) {
234 ptext(stderr, MSG_PKGREMOVE_PRIV);
235 }
236 msgtext = MSG_PKGSCRIPTS_FOUND;
237
238 if (ADM(action, "quit")) {
239 return (4);
240 }
241
242 if (echoGetFlag() == B_FALSE) {
243 return (5);
244 }
245
246 msgtext = NULL;
247
248 n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_PRIV,
249 ASK_PKGREMOVE_CONTINUE);
250
251 if (n != 0) {
252 return (n);
253 }
254
255 if (strchr("yY", *ans) == NULL) {
256 return (3);
257 }
258 }
259
260 return (0);
261 }
262