15c51f124SMoriah Waterland /*
25c51f124SMoriah Waterland * CDDL HEADER START
35c51f124SMoriah Waterland *
45c51f124SMoriah Waterland * The contents of this file are subject to the terms of the
55c51f124SMoriah Waterland * Common Development and Distribution License (the "License").
65c51f124SMoriah Waterland * You may not use this file except in compliance with the License.
75c51f124SMoriah Waterland *
85c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing.
105c51f124SMoriah Waterland * See the License for the specific language governing permissions
115c51f124SMoriah Waterland * and limitations under the License.
125c51f124SMoriah Waterland *
135c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
145c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the
165c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
175c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
185c51f124SMoriah Waterland *
195c51f124SMoriah Waterland * CDDL HEADER END
205c51f124SMoriah Waterland */
215c51f124SMoriah Waterland
225c51f124SMoriah Waterland /*
232e10def1SPeter Tribble * Copyright (c) 2017 Peter Tribble.
242e10def1SPeter Tribble */
252e10def1SPeter Tribble
262e10def1SPeter Tribble /*
275c51f124SMoriah Waterland * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
285c51f124SMoriah Waterland * Use is subject to license terms.
295c51f124SMoriah Waterland */
305c51f124SMoriah Waterland
315c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
325c51f124SMoriah Waterland /* All Rights Reserved */
335c51f124SMoriah Waterland
345c51f124SMoriah Waterland
355c51f124SMoriah Waterland #include <stdio.h>
365c51f124SMoriah Waterland #include <stdlib.h>
375c51f124SMoriah Waterland #include <unistd.h>
385c51f124SMoriah Waterland #include <string.h>
395c51f124SMoriah Waterland #include <utmpx.h>
405c51f124SMoriah Waterland #include <dirent.h>
415c51f124SMoriah Waterland #include <sys/types.h>
425c51f124SMoriah Waterland #include <pkgstrct.h>
435c51f124SMoriah Waterland #include <locale.h>
445c51f124SMoriah Waterland #include <libintl.h>
455c51f124SMoriah Waterland #include "install.h"
465c51f124SMoriah Waterland #include <pkglib.h>
475c51f124SMoriah Waterland #include "libadm.h"
485c51f124SMoriah Waterland #include "libinst.h"
495c51f124SMoriah Waterland #include "messages.h"
505c51f124SMoriah Waterland
515c51f124SMoriah Waterland extern struct admin adm;
525c51f124SMoriah Waterland
535c51f124SMoriah Waterland extern char pkgloc[], *pkginst, *msgtext;
545c51f124SMoriah Waterland
555c51f124SMoriah Waterland static boolean_t preremoveCheck = B_FALSE;
565c51f124SMoriah Waterland static char *zoneName = (char *)NULL;
575c51f124SMoriah Waterland
585c51f124SMoriah Waterland
595c51f124SMoriah Waterland void
rcksetPreremoveCheck(boolean_t a_preremoveCheck)605c51f124SMoriah Waterland rcksetPreremoveCheck(boolean_t a_preremoveCheck)
615c51f124SMoriah Waterland {
625c51f124SMoriah Waterland preremoveCheck = a_preremoveCheck;
635c51f124SMoriah Waterland }
645c51f124SMoriah Waterland
655c51f124SMoriah Waterland void
rcksetZoneName(char * a_zoneName)665c51f124SMoriah Waterland rcksetZoneName(char *a_zoneName)
675c51f124SMoriah Waterland {
685c51f124SMoriah Waterland zoneName = a_zoneName;
695c51f124SMoriah Waterland }
705c51f124SMoriah Waterland
715c51f124SMoriah Waterland int
rckrunlevel(void)725c51f124SMoriah Waterland rckrunlevel(void)
735c51f124SMoriah Waterland {
745c51f124SMoriah Waterland struct utmpx utmpx;
755c51f124SMoriah Waterland struct utmpx *putmpx;
765c51f124SMoriah Waterland char ans[MAX_INPUT];
775c51f124SMoriah Waterland char *pt;
785c51f124SMoriah Waterland char *rstates;
795c51f124SMoriah Waterland int n;
805c51f124SMoriah Waterland char *uxstate;
815c51f124SMoriah Waterland
825c51f124SMoriah Waterland if (ADM(runlevel, "nocheck")) {
835c51f124SMoriah Waterland return (0);
845c51f124SMoriah Waterland }
855c51f124SMoriah Waterland
865c51f124SMoriah Waterland pt = getenv("RSTATES");
875c51f124SMoriah Waterland if (pt == NULL) {
885c51f124SMoriah Waterland return (0);
895c51f124SMoriah Waterland }
905c51f124SMoriah Waterland
915c51f124SMoriah Waterland utmpx.ut_type = RUN_LVL;
925c51f124SMoriah Waterland putmpx = getutxid(&utmpx);
935c51f124SMoriah Waterland if (putmpx == NULL) {
945c51f124SMoriah Waterland progerr(ERR_RUNSTATE);
955c51f124SMoriah Waterland return (99);
965c51f124SMoriah Waterland }
975c51f124SMoriah Waterland uxstate = strtok(&putmpx->ut_line[10], " \t\n");
985c51f124SMoriah Waterland
995c51f124SMoriah Waterland rstates = qstrdup(pt);
1005c51f124SMoriah Waterland if ((pt = strtok(pt, " \t\n, ")) == NULL)
1015c51f124SMoriah Waterland return (0); /* no list is no list */
1025c51f124SMoriah Waterland do {
103*c57b7750SToomas Soome if (strcmp(pt, uxstate) == 0) {
1045c51f124SMoriah Waterland free(rstates);
1055c51f124SMoriah Waterland return (0);
1065c51f124SMoriah Waterland }
1075c51f124SMoriah Waterland } while (pt = strtok(NULL, " \t\n, "));
1085c51f124SMoriah Waterland
1095c51f124SMoriah Waterland if (preremoveCheck == B_FALSE) {
1105c51f124SMoriah Waterland msgtext = MSG_PKGREMOVE_RUNLEVEL;
1115c51f124SMoriah Waterland ptext(stderr, msgtext, uxstate);
1125c51f124SMoriah Waterland } else {
1135c51f124SMoriah Waterland (void) fprintf(stdout, "runlevel=%s", uxstate);
1145c51f124SMoriah Waterland }
1155c51f124SMoriah Waterland
1165c51f124SMoriah Waterland pt = strtok(rstates, " \t\n, ");
1175c51f124SMoriah Waterland do {
1185c51f124SMoriah Waterland if (preremoveCheck == B_FALSE) {
1195c51f124SMoriah Waterland ptext(stderr, "\\t%s", pt);
1205c51f124SMoriah Waterland } else {
1215c51f124SMoriah Waterland (void) fprintf(stdout, ":%s", pt);
1225c51f124SMoriah Waterland }
1235c51f124SMoriah Waterland } while (pt = strtok(NULL, " \t\n, "));
1245c51f124SMoriah Waterland
1255c51f124SMoriah Waterland if (preremoveCheck == B_TRUE) {
1265c51f124SMoriah Waterland (void) fprintf(stdout, "\n");
1275c51f124SMoriah Waterland }
1285c51f124SMoriah Waterland
1295c51f124SMoriah Waterland free(rstates);
1305c51f124SMoriah Waterland
1315c51f124SMoriah Waterland if (ADM(runlevel, "quit")) {
1325c51f124SMoriah Waterland return (4);
1335c51f124SMoriah Waterland }
1345c51f124SMoriah Waterland
1355c51f124SMoriah Waterland if (echoGetFlag() == B_FALSE) {
1365c51f124SMoriah Waterland return (5);
1375c51f124SMoriah Waterland }
1385c51f124SMoriah Waterland
1395c51f124SMoriah Waterland msgtext = NULL;
1405c51f124SMoriah Waterland
1415c51f124SMoriah Waterland n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_RUNLEVEL,
1425c51f124SMoriah Waterland ASK_PKGREMOVE_CONTINUE);
1435c51f124SMoriah Waterland
1445c51f124SMoriah Waterland if (n != 0) {
1455c51f124SMoriah Waterland return (n);
1465c51f124SMoriah Waterland }
1475c51f124SMoriah Waterland
1485c51f124SMoriah Waterland if (strchr("yY", *ans) == NULL) {
1495c51f124SMoriah Waterland return (3);
1505c51f124SMoriah Waterland }
1515c51f124SMoriah Waterland
1525c51f124SMoriah Waterland return (0);
1535c51f124SMoriah Waterland }
1545c51f124SMoriah Waterland
1555c51f124SMoriah Waterland int
rckdepend(void)1565c51f124SMoriah Waterland rckdepend(void)
1575c51f124SMoriah Waterland {
1585c51f124SMoriah Waterland int n;
1595c51f124SMoriah Waterland char ans[MAX_INPUT];
1605c51f124SMoriah Waterland
1615c51f124SMoriah Waterland if (ADM(rdepend, "nocheck")) {
1625c51f124SMoriah Waterland return (0);
1635c51f124SMoriah Waterland }
1645c51f124SMoriah Waterland
1655c51f124SMoriah Waterland if (zoneName == (char *)NULL) {
1665c51f124SMoriah Waterland echo(MSG_CHECKREMOVE_PKG_IN_GZ, pkginst);
1675c51f124SMoriah Waterland } else {
1685c51f124SMoriah Waterland echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
1695c51f124SMoriah Waterland }
1705c51f124SMoriah Waterland
1715c51f124SMoriah Waterland if (dockdeps(pkginst, 1, preremoveCheck)) {
1725c51f124SMoriah Waterland msgtext = MSG_PKGREMOVE_DEPEND;
1735c51f124SMoriah Waterland
1745c51f124SMoriah Waterland if (preremoveCheck == B_FALSE) {
1755c51f124SMoriah Waterland echo(msgtext);
1765c51f124SMoriah Waterland }
1775c51f124SMoriah Waterland
1785c51f124SMoriah Waterland if (ADM(rdepend, "quit")) {
1795c51f124SMoriah Waterland return (4);
1805c51f124SMoriah Waterland }
1815c51f124SMoriah Waterland
1825c51f124SMoriah Waterland if (echoGetFlag() == B_FALSE) {
1835c51f124SMoriah Waterland return (5);
1845c51f124SMoriah Waterland }
1855c51f124SMoriah Waterland
1865c51f124SMoriah Waterland msgtext = NULL;
1875c51f124SMoriah Waterland
1885c51f124SMoriah Waterland n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_DEPEND,
1895c51f124SMoriah Waterland ASK_PKGREMOVE_CONTINUE);
1905c51f124SMoriah Waterland
1915c51f124SMoriah Waterland if (n != 0) {
1925c51f124SMoriah Waterland return (n);
1935c51f124SMoriah Waterland }
1945c51f124SMoriah Waterland
1955c51f124SMoriah Waterland if (strchr("yY", *ans) == NULL) {
1965c51f124SMoriah Waterland return (3);
1975c51f124SMoriah Waterland }
1985c51f124SMoriah Waterland }
1995c51f124SMoriah Waterland
2005c51f124SMoriah Waterland return (0);
2015c51f124SMoriah Waterland }
2025c51f124SMoriah Waterland
2035c51f124SMoriah Waterland int
rckpriv(void)2045c51f124SMoriah Waterland rckpriv(void)
2055c51f124SMoriah Waterland {
2065c51f124SMoriah Waterland struct dirent *dp;
2075c51f124SMoriah Waterland DIR *dirfp;
2085c51f124SMoriah Waterland int n;
2095c51f124SMoriah Waterland char found;
2105c51f124SMoriah Waterland char ans[MAX_INPUT];
2115c51f124SMoriah Waterland char path[PATH_MAX];
2125c51f124SMoriah Waterland
2135c51f124SMoriah Waterland if (ADM(action, "nocheck")) {
2145c51f124SMoriah Waterland return (0);
2155c51f124SMoriah Waterland }
2165c51f124SMoriah Waterland
2175c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/install", pkgloc);
2185c51f124SMoriah Waterland if ((dirfp = opendir(path)) == NULL)
2195c51f124SMoriah Waterland return (0);
2205c51f124SMoriah Waterland
2215c51f124SMoriah Waterland found = 0;
2225c51f124SMoriah Waterland while ((dp = readdir(dirfp)) != NULL) {
223*c57b7750SToomas Soome if ((strcmp(dp->d_name, "preremove") == 0) ||
224*c57b7750SToomas Soome (strcmp(dp->d_name, "postremove") == 0) ||
225*c57b7750SToomas Soome (strncmp(dp->d_name, "r.", 2) == 0)) {
2265c51f124SMoriah Waterland found++;
2275c51f124SMoriah Waterland break;
2285c51f124SMoriah Waterland }
2295c51f124SMoriah Waterland }
2305c51f124SMoriah Waterland (void) closedir(dirfp);
2315c51f124SMoriah Waterland
2325c51f124SMoriah Waterland if (found) {
2335c51f124SMoriah Waterland if (preremoveCheck == B_FALSE) {
2345c51f124SMoriah Waterland ptext(stderr, MSG_PKGREMOVE_PRIV);
2355c51f124SMoriah Waterland }
2365c51f124SMoriah Waterland msgtext = MSG_PKGSCRIPTS_FOUND;
2375c51f124SMoriah Waterland
2385c51f124SMoriah Waterland if (ADM(action, "quit")) {
2395c51f124SMoriah Waterland return (4);
2405c51f124SMoriah Waterland }
2415c51f124SMoriah Waterland
2425c51f124SMoriah Waterland if (echoGetFlag() == B_FALSE) {
2435c51f124SMoriah Waterland return (5);
2445c51f124SMoriah Waterland }
2455c51f124SMoriah Waterland
2465c51f124SMoriah Waterland msgtext = NULL;
2475c51f124SMoriah Waterland
2485c51f124SMoriah Waterland n = ckyorn(ans, NULL, NULL, HLP_PKGREMOVE_PRIV,
2495c51f124SMoriah Waterland ASK_PKGREMOVE_CONTINUE);
2505c51f124SMoriah Waterland
2515c51f124SMoriah Waterland if (n != 0) {
2525c51f124SMoriah Waterland return (n);
2535c51f124SMoriah Waterland }
2545c51f124SMoriah Waterland
2555c51f124SMoriah Waterland if (strchr("yY", *ans) == NULL) {
2565c51f124SMoriah Waterland return (3);
2575c51f124SMoriah Waterland }
2585c51f124SMoriah Waterland }
2595c51f124SMoriah Waterland
2605c51f124SMoriah Waterland return (0);
2615c51f124SMoriah Waterland }
262