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