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 /*
23*6e1ae2a3SGary Pennington * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
245c51f124SMoriah Waterland */
255c51f124SMoriah Waterland
265c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
275c51f124SMoriah Waterland /* All Rights Reserved */
285c51f124SMoriah Waterland
295c51f124SMoriah Waterland
305c51f124SMoriah Waterland /*
315c51f124SMoriah Waterland * System includes
325c51f124SMoriah Waterland */
335c51f124SMoriah Waterland
345c51f124SMoriah Waterland #include <stdio.h>
355c51f124SMoriah Waterland #include <stdlib.h>
365c51f124SMoriah Waterland #include <unistd.h>
375c51f124SMoriah Waterland #include <string.h>
385c51f124SMoriah Waterland #include <signal.h>
395c51f124SMoriah Waterland #include <errno.h>
405c51f124SMoriah Waterland #include <locale.h>
415c51f124SMoriah Waterland #include <libintl.h>
425c51f124SMoriah Waterland #include <pkgstrct.h>
435c51f124SMoriah Waterland #include <pkgdev.h>
445c51f124SMoriah Waterland #include <pkginfo.h>
455c51f124SMoriah Waterland #include <pkglocs.h>
465c51f124SMoriah Waterland #include <pkglib.h>
475c51f124SMoriah Waterland #include <assert.h>
485c51f124SMoriah Waterland
495c51f124SMoriah Waterland /*
505c51f124SMoriah Waterland * libinstzones includes
515c51f124SMoriah Waterland */
525c51f124SMoriah Waterland
535c51f124SMoriah Waterland #include <instzones_api.h>
545c51f124SMoriah Waterland
555c51f124SMoriah Waterland /*
565c51f124SMoriah Waterland * consolidation pkg command library includes
575c51f124SMoriah Waterland */
585c51f124SMoriah Waterland
595c51f124SMoriah Waterland #include <pkglib.h>
605c51f124SMoriah Waterland
615c51f124SMoriah Waterland /*
625c51f124SMoriah Waterland * local pkg command library includes
635c51f124SMoriah Waterland */
645c51f124SMoriah Waterland
655c51f124SMoriah Waterland #include "install.h"
665c51f124SMoriah Waterland #include "libinst.h"
675c51f124SMoriah Waterland #include "libadm.h"
685c51f124SMoriah Waterland #include "messages.h"
695c51f124SMoriah Waterland
705c51f124SMoriah Waterland /*
715c51f124SMoriah Waterland * pkgrm local includes
725c51f124SMoriah Waterland */
735c51f124SMoriah Waterland
745c51f124SMoriah Waterland #include "quit.h"
755c51f124SMoriah Waterland
765c51f124SMoriah Waterland /*
775c51f124SMoriah Waterland * exported global variables
785c51f124SMoriah Waterland */
795c51f124SMoriah Waterland
805c51f124SMoriah Waterland /* these globals are set by ckreturn and used by quit.c */
815c51f124SMoriah Waterland
825c51f124SMoriah Waterland int admnflag = 0; /* != 0 if any pkg op admin setting failure (4) */
835c51f124SMoriah Waterland int doreboot = 0; /* != 0 if reboot required after installation */
845c51f124SMoriah Waterland int failflag = 0; /* != 0 if fatal error has occurred (1) */
855c51f124SMoriah Waterland int intrflag = 0; /* != 0 if user selected quit (3) */
865c51f124SMoriah Waterland int ireboot = 0; /* != 0 if immediate reboot required */
875c51f124SMoriah Waterland int nullflag = 0; /* != 0 if admin interaction required (5) */
885c51f124SMoriah Waterland int warnflag = 0; /* != 0 if non-fatal error has occurred (2) */
895c51f124SMoriah Waterland
905c51f124SMoriah Waterland /* imported by quit.c */
915c51f124SMoriah Waterland int npkgs = 0; /* the number of packages yet to be installed */
925c51f124SMoriah Waterland
935c51f124SMoriah Waterland /* imported by presvr4.c */
945c51f124SMoriah Waterland int started = 0;
955c51f124SMoriah Waterland char *tmpdir = NULL; /* location to place temporary files */
965c51f124SMoriah Waterland
975c51f124SMoriah Waterland /* imported by various (many) */
985c51f124SMoriah Waterland struct admin adm; /* holds info about installation admin */
995c51f124SMoriah Waterland struct pkgdev pkgdev; /* holds info about the installation device */
1005c51f124SMoriah Waterland
1015c51f124SMoriah Waterland /*
1025c51f124SMoriah Waterland * internal global variables
1035c51f124SMoriah Waterland */
1045c51f124SMoriah Waterland
1055c51f124SMoriah Waterland static char *admnfile = NULL; /* file to use for installation admin */
1065c51f124SMoriah Waterland static char *pkginst = NULL; /* current pkg/src instance 2 process */
1075c51f124SMoriah Waterland static char *vfstab_file = NULL;
1085c51f124SMoriah Waterland static char *zoneTempDir = (char *)NULL;
1095c51f124SMoriah Waterland
1105c51f124SMoriah Waterland /* set by ckreturn() */
1115c51f124SMoriah Waterland
1125c51f124SMoriah Waterland static int interrupted = 0; /* last pkg op was quit (1,2,3,4,5) */
1135c51f124SMoriah Waterland
1145c51f124SMoriah Waterland static int nointeract = 0; /* non-zero - no user interaction */
1155c51f124SMoriah Waterland static int pkgrmremote = 0; /* remove pkg objs stored remotely */
1165c51f124SMoriah Waterland static int pkgverbose = 0; /* non-zero if verbose mode selected */
1175c51f124SMoriah Waterland
1185c51f124SMoriah Waterland /*
1195c51f124SMoriah Waterland * Assume the package complies with the standards as regards user
1205c51f124SMoriah Waterland * interaction during procedure scripts.
1215c51f124SMoriah Waterland */
1225c51f124SMoriah Waterland
1235c51f124SMoriah Waterland static int old_pkg = 0;
1245c51f124SMoriah Waterland static int old_symlinks = 0;
1255c51f124SMoriah Waterland static int no_map_client = 0;
1265c51f124SMoriah Waterland
1275c51f124SMoriah Waterland /* Set by -O nozones: do not process any zones */
1285c51f124SMoriah Waterland
1295c51f124SMoriah Waterland static boolean_t noZones = B_FALSE;
1305c51f124SMoriah Waterland
1315c51f124SMoriah Waterland /* Set by -O zonelist=<names...>: process only named zones */
1325c51f124SMoriah Waterland
1335c51f124SMoriah Waterland static boolean_t usedZoneList = B_FALSE;
1345c51f124SMoriah Waterland
1355c51f124SMoriah Waterland /* Set by -O debug: debug output is enabled? */
1365c51f124SMoriah Waterland
1375c51f124SMoriah Waterland static boolean_t debugFlag = B_FALSE;
1385c51f124SMoriah Waterland
1395c51f124SMoriah Waterland /*
1405c51f124SMoriah Waterland * imported (external) functions
1415c51f124SMoriah Waterland */
1425c51f124SMoriah Waterland
1435c51f124SMoriah Waterland /* check.c */
1445c51f124SMoriah Waterland
1455c51f124SMoriah Waterland extern int preremove_verify(char **a_pkgList, zoneList_t a_zlst,
1465c51f124SMoriah Waterland char *a_zoneTempDir);
1475c51f124SMoriah Waterland /* quit.c */
1485c51f124SMoriah Waterland
1495c51f124SMoriah Waterland extern void quitSetZonelist(zoneList_t a_zlst);
1505c51f124SMoriah Waterland
1515c51f124SMoriah Waterland /*
1525c51f124SMoriah Waterland * imported (external) variables
1535c51f124SMoriah Waterland */
1545c51f124SMoriah Waterland
1555c51f124SMoriah Waterland extern char *pkgdir;
1565c51f124SMoriah Waterland
1575c51f124SMoriah Waterland /* printable string - if string is null results in ??? */
1585c51f124SMoriah Waterland
1595c51f124SMoriah Waterland #define PSTR(STR) (((STR) == (char *)NULL) ? "???" : (STR))
1605c51f124SMoriah Waterland
1615c51f124SMoriah Waterland #define MAX_FDS 20
1625c51f124SMoriah Waterland
1635c51f124SMoriah Waterland #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
1645c51f124SMoriah Waterland #define TEXT_DOMAIN "SYS_TEST"
1655c51f124SMoriah Waterland #endif
1665c51f124SMoriah Waterland
1675c51f124SMoriah Waterland /*
1685c51f124SMoriah Waterland * forward declarations
1695c51f124SMoriah Waterland */
1705c51f124SMoriah Waterland
1715c51f124SMoriah Waterland static void ckreturn(int retcode);
1725c51f124SMoriah Waterland static void create_zone_adminfile(char **r_zoneAdminFile,
1735c51f124SMoriah Waterland char *a_zoneTempDir, char *a_admnfile);
1745c51f124SMoriah Waterland static void create_zone_tempdir(char **r_zoneTempDir,
1755c51f124SMoriah Waterland char *a_tmpdir);
1765c51f124SMoriah Waterland static int doRemove(int a_nodelete, char *a_altBinDir,
1775c51f124SMoriah Waterland int a_longestPkg, char *a_adminFile,
1785c51f124SMoriah Waterland char *a_zoneAdminFile, zoneList_t zlst);
1795c51f124SMoriah Waterland static int pkgRemove(int a_nodelete, char *a_altBinDir,
180*6e1ae2a3SGary Pennington char *a_adminFile);
181*6e1ae2a3SGary Pennington static int pkgZoneCheckRemove(char *a_zoneName, char *a_altBinDir,
1825c51f124SMoriah Waterland char *a_adminFile, char *a_stdoutPath,
18362224350SCasper H.S. Dik zone_state_t a_zoneState, boolean_t tmpzone);
184*6e1ae2a3SGary Pennington static int pkgZoneRemove(char *a_zoneName, int a_nodelete,
1855c51f124SMoriah Waterland char *a_altBinDir, char *a_adminFile,
18662224350SCasper H.S. Dik zone_state_t a_zoneState, boolean_t tmpzone);
1875c51f124SMoriah Waterland static void resetreturn();
1885c51f124SMoriah Waterland static void usage(void);
1895c51f124SMoriah Waterland static boolean_t check_applicability(char *a_packageDir,
1905c51f124SMoriah Waterland char *a_pkgInst, char *a_rootPath,
1915c51f124SMoriah Waterland CAF_T a_flags);
1925c51f124SMoriah Waterland static boolean_t check_packages(char **a_pkgList, char *a_packageDir);
1935c51f124SMoriah Waterland static boolean_t path_valid(char *path);
1945c51f124SMoriah Waterland static boolean_t remove_packages(char **a_pkgList, int a_nodelete,
1955c51f124SMoriah Waterland int a_longestPkg, int a_repeat,
1965c51f124SMoriah Waterland char *a_altBinDir, char *a_pkgdir,
1975c51f124SMoriah Waterland char *a_spoolDir, boolean_t a_noZones);
1985c51f124SMoriah Waterland static boolean_t remove_packages_from_spool_directory(char **a_pkgList,
1995c51f124SMoriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
2005c51f124SMoriah Waterland char *a_altBinDir);
2015c51f124SMoriah Waterland static boolean_t remove_packages_in_global_no_zones(char **a_pkgList,
2025c51f124SMoriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
2035c51f124SMoriah Waterland char *a_altBinDir);
2045c51f124SMoriah Waterland static boolean_t remove_packages_in_global_with_zones(char **a_pkgList,
2055c51f124SMoriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
2065c51f124SMoriah Waterland char *a_altBinDir, char *a_pkgdir,
2075c51f124SMoriah Waterland zoneList_t a_zlst);
2085c51f124SMoriah Waterland static boolean_t remove_packages_in_nonglobal_zone(char **a_pkgList,
2095c51f124SMoriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
2105c51f124SMoriah Waterland char *a_altBinDir, char *a_pkgdir);
2115c51f124SMoriah Waterland static boolean_t shall_we_continue(char *a_pkgInst, int a_npkgs);
2125c51f124SMoriah Waterland
2135c51f124SMoriah Waterland /*
2145c51f124SMoriah Waterland * *****************************************************************************
2155c51f124SMoriah Waterland * global external (public) functions
2165c51f124SMoriah Waterland * *****************************************************************************
2175c51f124SMoriah Waterland */
2185c51f124SMoriah Waterland
2195c51f124SMoriah Waterland /*
2205c51f124SMoriah Waterland * Name: main
2215c51f124SMoriah Waterland * Description: main entry point for pkgrm
2225c51f124SMoriah Waterland * Returns: int
2235c51f124SMoriah Waterland * 0 Successful completion
2245c51f124SMoriah Waterland * 1 Fatal error.
2255c51f124SMoriah Waterland * 2 Warning.
2265c51f124SMoriah Waterland * 3 Interruption.
2275c51f124SMoriah Waterland * 4 Administration.
2285c51f124SMoriah Waterland * 5 Administration. Interaction is required. Do not use pkgrm -n.
2295c51f124SMoriah Waterland * 10 Reboot after removal of all packages.
2305c51f124SMoriah Waterland * 20 Reboot after removal of this package.
2315c51f124SMoriah Waterland */
2325c51f124SMoriah Waterland
2335c51f124SMoriah Waterland int
main(int argc,char ** argv)2345c51f124SMoriah Waterland main(int argc, char **argv)
2355c51f124SMoriah Waterland {
2365c51f124SMoriah Waterland char **category = NULL;
2375c51f124SMoriah Waterland char *altBinDir = (char *)NULL;
2385c51f124SMoriah Waterland char *catg_arg = NULL;
2395c51f124SMoriah Waterland char *p;
2405c51f124SMoriah Waterland char *prog_full_name = NULL;
2415c51f124SMoriah Waterland char *spoolDir = 0;
2425c51f124SMoriah Waterland int c;
2435c51f124SMoriah Waterland int longestPkg = 0;
2445c51f124SMoriah Waterland int n;
2455c51f124SMoriah Waterland int nodelete = 0; /* dont rm files/run scripts */
2465c51f124SMoriah Waterland int pkgLgth = 0;
2475c51f124SMoriah Waterland int repeat;
2485c51f124SMoriah Waterland struct sigaction nact;
2495c51f124SMoriah Waterland struct sigaction oact;
2505c51f124SMoriah Waterland
2515c51f124SMoriah Waterland /* initialize locale environment */
2525c51f124SMoriah Waterland
2535c51f124SMoriah Waterland (void) setlocale(LC_ALL, "");
2545c51f124SMoriah Waterland (void) textdomain(TEXT_DOMAIN);
2555c51f124SMoriah Waterland
2565c51f124SMoriah Waterland /* initialize program name */
2575c51f124SMoriah Waterland
2585c51f124SMoriah Waterland prog_full_name = argv[0];
2595c51f124SMoriah Waterland (void) set_prog_name(argv[0]);
2605c51f124SMoriah Waterland
2615c51f124SMoriah Waterland /* tell spmi zones interface how to access package output functions */
2625c51f124SMoriah Waterland
2635c51f124SMoriah Waterland z_set_output_functions(echo, echoDebug, progerr);
2645c51f124SMoriah Waterland
2655c51f124SMoriah Waterland /* tell quit which ckreturn function to call */
2665c51f124SMoriah Waterland
2675c51f124SMoriah Waterland quitSetCkreturnFunc(&ckreturn);
2685c51f124SMoriah Waterland
2695c51f124SMoriah Waterland /* Read PKG_INSTALL_ROOT from the environment, if it's there. */
2705c51f124SMoriah Waterland
2715c51f124SMoriah Waterland if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
2725c51f124SMoriah Waterland progerr(ERR_ROOT_SET);
2735c51f124SMoriah Waterland exit(1);
2745c51f124SMoriah Waterland }
2755c51f124SMoriah Waterland
2765c51f124SMoriah Waterland if (z_running_in_global_zone() && !enable_local_fs()) {
2775c51f124SMoriah Waterland progerr(ERR_CANNOT_ENABLE_LOCAL_FS);
2785c51f124SMoriah Waterland }
2795c51f124SMoriah Waterland
28062224350SCasper H.S. Dik pkgserversetmode(DEFAULTMODE);
28162224350SCasper H.S. Dik
2825c51f124SMoriah Waterland /*
2835c51f124SMoriah Waterland * ********************************************************************
2845c51f124SMoriah Waterland * parse command line options
2855c51f124SMoriah Waterland * ********************************************************************
2865c51f124SMoriah Waterland */
2875c51f124SMoriah Waterland
2885c51f124SMoriah Waterland while ((c = getopt(argc, argv, "?Aa:b:FMnO:R:s:V:vY:Z")) != EOF) {
2895c51f124SMoriah Waterland switch (c) {
2905c51f124SMoriah Waterland /*
2915c51f124SMoriah Waterland * Public interface: Allow admin to remove objects
2925c51f124SMoriah Waterland * from a service area via a reference client.
2935c51f124SMoriah Waterland * Remove the package files from the client's file
2945c51f124SMoriah Waterland * system, absolutely. If a file is shared with other
2955c51f124SMoriah Waterland * packages, the default behavior is to not remove
2965c51f124SMoriah Waterland * the file from the client's file system.
2975c51f124SMoriah Waterland */
2985c51f124SMoriah Waterland case 'A':
2995c51f124SMoriah Waterland pkgrmremote++;
3005c51f124SMoriah Waterland break;
3015c51f124SMoriah Waterland
3025c51f124SMoriah Waterland /*
3035c51f124SMoriah Waterland * Public interface: Use the installation
3045c51f124SMoriah Waterland * administration file, admin, in place of the
3055c51f124SMoriah Waterland * default admin file. pkgrm first looks in the
3065c51f124SMoriah Waterland * current working directory for the administration
3075c51f124SMoriah Waterland * file. If the specified administration file is not
3085c51f124SMoriah Waterland * in the current working directory, pkgrm looks in
3095c51f124SMoriah Waterland * the /var/sadm/install/admin directory for the
3105c51f124SMoriah Waterland * administra- tion file.
3115c51f124SMoriah Waterland */
3125c51f124SMoriah Waterland case 'a':
3135c51f124SMoriah Waterland admnfile = flex_device(optarg, 0);
3145c51f124SMoriah Waterland break;
3155c51f124SMoriah Waterland
3165c51f124SMoriah Waterland /*
3175c51f124SMoriah Waterland * Not a public interface: location where package executables
3185c51f124SMoriah Waterland * can be found - default is /usr/sadm/install/bin.
3195c51f124SMoriah Waterland */
3205c51f124SMoriah Waterland case 'b':
3215c51f124SMoriah Waterland if (!path_valid(optarg)) {
3225c51f124SMoriah Waterland progerr(ERR_PATH, optarg);
3235c51f124SMoriah Waterland quit(1);
3245c51f124SMoriah Waterland }
3255c51f124SMoriah Waterland if (isdir(optarg) != 0) {
3265c51f124SMoriah Waterland p = strerror(errno);
3275c51f124SMoriah Waterland progerr(ERR_CANNOT_USE_DIR, optarg, p);
3285c51f124SMoriah Waterland quit(1);
3295c51f124SMoriah Waterland }
3305c51f124SMoriah Waterland altBinDir = optarg;
3315c51f124SMoriah Waterland break;
3325c51f124SMoriah Waterland
3335c51f124SMoriah Waterland /*
3345c51f124SMoriah Waterland * Not a public interface: pass -F option to
3355c51f124SMoriah Waterland * pkgremove which suppresses the removal of any
3365c51f124SMoriah Waterland * files and any class action scripts, and suppresses
3375c51f124SMoriah Waterland * the running of any class action scripts. The
3385c51f124SMoriah Waterland * package files remain but the package looks like it
3395c51f124SMoriah Waterland * is not installed. This is mainly for use by the
3405c51f124SMoriah Waterland * upgrade process.
3415c51f124SMoriah Waterland */
3425c51f124SMoriah Waterland case 'F':
3435c51f124SMoriah Waterland nodelete++;
3445c51f124SMoriah Waterland break;
3455c51f124SMoriah Waterland
3465c51f124SMoriah Waterland /*
3475c51f124SMoriah Waterland * Public interface: Instruct pkgrm not to use the
3485c51f124SMoriah Waterland * $root_path/etc/vfstab file for determining the
3495c51f124SMoriah Waterland * client's mount points. This option assumes the
3505c51f124SMoriah Waterland * mount points are correct on the server and it
3515c51f124SMoriah Waterland * behaves consistently with Solaris 2.5 and earlier
3525c51f124SMoriah Waterland * releases.
3535c51f124SMoriah Waterland */
3545c51f124SMoriah Waterland case 'M':
3555c51f124SMoriah Waterland no_map_client = 1;
3565c51f124SMoriah Waterland break;
3575c51f124SMoriah Waterland
3585c51f124SMoriah Waterland /*
3595c51f124SMoriah Waterland * Public interface: package removal occurs in
3605c51f124SMoriah Waterland * non-interactive mode. Suppress output of the list of
3615c51f124SMoriah Waterland * removed files. The default mode is interactive.
3625c51f124SMoriah Waterland */
3635c51f124SMoriah Waterland case 'n':
3645c51f124SMoriah Waterland nointeract++;
3655c51f124SMoriah Waterland (void) echoSetFlag(B_FALSE);
3665c51f124SMoriah Waterland break;
3675c51f124SMoriah Waterland
3685c51f124SMoriah Waterland /*
3695c51f124SMoriah Waterland * Not a public interface: the -O option allows the behavior
3705c51f124SMoriah Waterland * of the package tools to be modified. Recognized options:
3715c51f124SMoriah Waterland * -> debug
3725c51f124SMoriah Waterland * ---> enable debugging output
3735c51f124SMoriah Waterland * -> nozones
3745c51f124SMoriah Waterland * ---> act as though in global zone with no non-global zones
3755c51f124SMoriah Waterland * -> enable-hollow-package-support
3765c51f124SMoriah Waterland * --> Enable hollow package support. When specified, for any
3775c51f124SMoriah Waterland * --> package that has SUNW_PKG_HOLLOW=true:
3785c51f124SMoriah Waterland * --> Do not calculate and verify package size against target
3795c51f124SMoriah Waterland * --> Do not run any package procedure or class action scripts
3805c51f124SMoriah Waterland * --> Do not create or remove any target directories
3815c51f124SMoriah Waterland * --> Do not perform any script locking
3825c51f124SMoriah Waterland * --> Do not install or uninstall any components of any package
3835c51f124SMoriah Waterland * --> Do not output any status or database update messages
3845c51f124SMoriah Waterland * -> zonelist="<names...>"
3855c51f124SMoriah Waterland * ---> add package to space-separated list of zones only
3865c51f124SMoriah Waterland */
3875c51f124SMoriah Waterland
3885c51f124SMoriah Waterland case 'O':
3895c51f124SMoriah Waterland for (p = strtok(optarg, ","); p != (char *)NULL;
3905c51f124SMoriah Waterland p = strtok(NULL, ",")) {
3915c51f124SMoriah Waterland
3925c51f124SMoriah Waterland if (strcmp(p, "nozones") == 0) {
3935c51f124SMoriah Waterland noZones = B_TRUE;
3945c51f124SMoriah Waterland continue;
3955c51f124SMoriah Waterland }
3965c51f124SMoriah Waterland
3975c51f124SMoriah Waterland if (strcmp(p,
3985c51f124SMoriah Waterland "enable-hollow-package-support") == 0) {
3995c51f124SMoriah Waterland set_depend_pkginfo_DB(B_TRUE);
4005c51f124SMoriah Waterland continue;
4015c51f124SMoriah Waterland }
4025c51f124SMoriah Waterland
4035c51f124SMoriah Waterland if (strcmp(p, "debug") == 0) {
4045c51f124SMoriah Waterland /* set debug flag/enable debug output */
4055c51f124SMoriah Waterland debugFlag = B_TRUE;
4065c51f124SMoriah Waterland (void) echoDebugSetFlag(debugFlag);
4075c51f124SMoriah Waterland
4085c51f124SMoriah Waterland /* debug info on arguments to pkgadd */
4095c51f124SMoriah Waterland for (n = 0; n < argc && argv[n]; n++) {
4105c51f124SMoriah Waterland echoDebug(DBG_ARG, n, argv[n]);
4115c51f124SMoriah Waterland }
4125c51f124SMoriah Waterland
4135c51f124SMoriah Waterland continue;
4145c51f124SMoriah Waterland }
4155c51f124SMoriah Waterland
4165c51f124SMoriah Waterland if (strncmp(p, "zonelist=", 9) == 0) {
4175c51f124SMoriah Waterland if (z_set_zone_spec(p + 9) == -1)
4185c51f124SMoriah Waterland quit(1);
4195c51f124SMoriah Waterland usedZoneList = B_TRUE;
4205c51f124SMoriah Waterland continue;
4215c51f124SMoriah Waterland }
4225c51f124SMoriah Waterland
4235c51f124SMoriah Waterland /* -O option not recognized - issue warning */
4245c51f124SMoriah Waterland
4255c51f124SMoriah Waterland progerr(ERR_INVALID_O_OPTION, p);
4265c51f124SMoriah Waterland continue;
4275c51f124SMoriah Waterland }
4285c51f124SMoriah Waterland break;
4295c51f124SMoriah Waterland
4305c51f124SMoriah Waterland /*
4315c51f124SMoriah Waterland * Public interface: defines the full path name of a
4325c51f124SMoriah Waterland * directory to use as the root_path. All files,
4335c51f124SMoriah Waterland * including package system information files, are
4345c51f124SMoriah Waterland * relocated to a directory tree starting in the
4355c51f124SMoriah Waterland * specified root_path.
4365c51f124SMoriah Waterland */
4375c51f124SMoriah Waterland case 'R':
4385c51f124SMoriah Waterland if (!set_inst_root(optarg)) {
4395c51f124SMoriah Waterland progerr(ERR_ROOT_CMD);
4405c51f124SMoriah Waterland exit(1);
4415c51f124SMoriah Waterland }
4425c51f124SMoriah Waterland break;
4435c51f124SMoriah Waterland
4445c51f124SMoriah Waterland /*
4455c51f124SMoriah Waterland * Public interface: remove the specified package(s)
4465c51f124SMoriah Waterland * from the directory spool. The default directory
4475c51f124SMoriah Waterland * for spooled packages is /var/sadm/pkg.
4485c51f124SMoriah Waterland */
4495c51f124SMoriah Waterland case 's':
4505c51f124SMoriah Waterland spoolDir = flex_device(optarg, 1);
4515c51f124SMoriah Waterland break;
4525c51f124SMoriah Waterland
4535c51f124SMoriah Waterland /*
4545c51f124SMoriah Waterland * Public interface: Allow admin to establish the client
4555c51f124SMoriah Waterland * filesystem using a vfstab-like file of stable format.
4565c51f124SMoriah Waterland */
4575c51f124SMoriah Waterland case 'V':
4585c51f124SMoriah Waterland vfstab_file = flex_device(optarg, 2);
4595c51f124SMoriah Waterland no_map_client = 0;
4605c51f124SMoriah Waterland break;
4615c51f124SMoriah Waterland
4625c51f124SMoriah Waterland /*
4635c51f124SMoriah Waterland * Public interface: trace all of the scripts that
4645c51f124SMoriah Waterland * get executed by pkgrm, located in the
4655c51f124SMoriah Waterland * pkginst/install directory. This option is used for
4665c51f124SMoriah Waterland * debugging the procedural and non- procedural
4675c51f124SMoriah Waterland * scripts.
4685c51f124SMoriah Waterland */
4695c51f124SMoriah Waterland case 'v':
4705c51f124SMoriah Waterland pkgverbose++;
4715c51f124SMoriah Waterland break;
4725c51f124SMoriah Waterland
4735c51f124SMoriah Waterland /*
4745c51f124SMoriah Waterland * Public interface: remove packages based on the
4755c51f124SMoriah Waterland * CATEGORY variable from the installed/spooled
4765c51f124SMoriah Waterland * pkginfo file
4775c51f124SMoriah Waterland */
4785c51f124SMoriah Waterland case 'Y':
4795c51f124SMoriah Waterland catg_arg = strdup(optarg);
4805c51f124SMoriah Waterland
4815c51f124SMoriah Waterland if ((category = get_categories(catg_arg)) == NULL) {
4825c51f124SMoriah Waterland progerr(ERR_CAT_INV, catg_arg);
4835c51f124SMoriah Waterland exit(1);
4845c51f124SMoriah Waterland } else if (is_not_valid_category(category,
4855c51f124SMoriah Waterland get_prog_name())) {
4865c51f124SMoriah Waterland progerr(ERR_CAT_SYS);
4875c51f124SMoriah Waterland exit(1);
4885c51f124SMoriah Waterland } else if (is_not_valid_length(category)) {
4895c51f124SMoriah Waterland progerr(ERR_CAT_LNGTH);
4905c51f124SMoriah Waterland exit(1);
4915c51f124SMoriah Waterland }
4925c51f124SMoriah Waterland
4935c51f124SMoriah Waterland break;
4945c51f124SMoriah Waterland
4955c51f124SMoriah Waterland /*
4965c51f124SMoriah Waterland * unrecognized option
4975c51f124SMoriah Waterland */
4985c51f124SMoriah Waterland default:
4995c51f124SMoriah Waterland usage();
5005c51f124SMoriah Waterland /* NOTREACHED */
5015c51f124SMoriah Waterland }
5025c51f124SMoriah Waterland }
5035c51f124SMoriah Waterland
5045c51f124SMoriah Waterland /*
5055c51f124SMoriah Waterland * ********************************************************************
5065c51f124SMoriah Waterland * validate command line options
5075c51f124SMoriah Waterland * ********************************************************************
5085c51f124SMoriah Waterland */
5095c51f124SMoriah Waterland
5105c51f124SMoriah Waterland /* set "debug echo" flag according to setting of "-O debug" option */
5115c51f124SMoriah Waterland
5125c51f124SMoriah Waterland (void) echoDebugSetFlag(debugFlag);
5135c51f124SMoriah Waterland
5145c51f124SMoriah Waterland /* output entry debugging information */
5155c51f124SMoriah Waterland
5165c51f124SMoriah Waterland if (z_running_in_global_zone()) {
5175c51f124SMoriah Waterland echoDebug(DBG_ENTRY_IN_GZ, prog_full_name);
5185c51f124SMoriah Waterland } else {
5195c51f124SMoriah Waterland echoDebug(DBG_ENTRY_IN_LZ, prog_full_name, getzoneid(),
5205c51f124SMoriah Waterland z_get_zonename());
5215c51f124SMoriah Waterland }
5225c51f124SMoriah Waterland
5235c51f124SMoriah Waterland /* -s cannot be used with several */
5245c51f124SMoriah Waterland
5255c51f124SMoriah Waterland if (spoolDir != (char *)NULL) {
5265c51f124SMoriah Waterland if (admnfile != (char *)NULL) {
5275c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_AND_ADMNFILE);
5285c51f124SMoriah Waterland usage();
5295c51f124SMoriah Waterland /* NOTREACHED */
5305c51f124SMoriah Waterland }
5315c51f124SMoriah Waterland
5325c51f124SMoriah Waterland if (pkgrmremote != 0) {
5335c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_AND_PKGRMREMOTE);
5345c51f124SMoriah Waterland usage();
5355c51f124SMoriah Waterland /* NOTREACHED */
5365c51f124SMoriah Waterland }
5375c51f124SMoriah Waterland
5385c51f124SMoriah Waterland if (pkgverbose != 0) {
5395c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_AND_PKGVERBOSE);
5405c51f124SMoriah Waterland usage();
5415c51f124SMoriah Waterland /* NOTREACHED */
5425c51f124SMoriah Waterland }
5435c51f124SMoriah Waterland
5445c51f124SMoriah Waterland if (is_an_inst_root() != 0) {
5455c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_AND_INST_ROOT);
5465c51f124SMoriah Waterland usage();
5475c51f124SMoriah Waterland /* NOTREACHED */
5485c51f124SMoriah Waterland }
5495c51f124SMoriah Waterland }
5505c51f124SMoriah Waterland
5515c51f124SMoriah Waterland /* -V cannot be used with -A */
5525c51f124SMoriah Waterland
5535c51f124SMoriah Waterland if (no_map_client && pkgrmremote) {
5545c51f124SMoriah Waterland progerr(ERR_V_USED_AND_PKGRMREMOTE);
5555c51f124SMoriah Waterland usage();
5565c51f124SMoriah Waterland /* NOTREACHED */
5575c51f124SMoriah Waterland }
5585c51f124SMoriah Waterland
5595c51f124SMoriah Waterland /* -n used without pkg names or category */
5605c51f124SMoriah Waterland
5615c51f124SMoriah Waterland if (nointeract && (optind == argc) && (catg_arg == NULL)) {
5625c51f124SMoriah Waterland progerr(ERR_BAD_N_PKGRM);
5635c51f124SMoriah Waterland usage();
5645c51f124SMoriah Waterland /* NOTREACHED */
5655c51f124SMoriah Waterland }
5665c51f124SMoriah Waterland
5675c51f124SMoriah Waterland /* Error if specified zone list isn't valid on target */
5685c51f124SMoriah Waterland if (usedZoneList && z_verify_zone_spec() == -1)
5695c51f124SMoriah Waterland usage();
5705c51f124SMoriah Waterland
5715c51f124SMoriah Waterland /*
5725c51f124SMoriah Waterland * hook SIGINT and SIGHUP interrupts into quit.c's trap handler
5735c51f124SMoriah Waterland */
5745c51f124SMoriah Waterland
5755c51f124SMoriah Waterland /* hold SIGINT/SIGHUP interrupts */
5765c51f124SMoriah Waterland
5775c51f124SMoriah Waterland (void) sighold(SIGHUP);
5785c51f124SMoriah Waterland (void) sighold(SIGINT);
5795c51f124SMoriah Waterland
5805c51f124SMoriah Waterland /* connect quit.c:trap() to SIGINT */
5815c51f124SMoriah Waterland
5825c51f124SMoriah Waterland nact.sa_handler = quitGetTrapHandler();
5835c51f124SMoriah Waterland nact.sa_flags = SA_RESTART;
5845c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask);
5855c51f124SMoriah Waterland
5865c51f124SMoriah Waterland (void) sigaction(SIGINT, &nact, &oact);
5875c51f124SMoriah Waterland
5885c51f124SMoriah Waterland /* connect quit.c:trap() to SIGHUP */
5895c51f124SMoriah Waterland
5905c51f124SMoriah Waterland nact.sa_handler = quitGetTrapHandler();
5915c51f124SMoriah Waterland nact.sa_flags = SA_RESTART;
5925c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask);
5935c51f124SMoriah Waterland
5945c51f124SMoriah Waterland (void) sigaction(SIGHUP, &nact, &oact);
5955c51f124SMoriah Waterland
5965c51f124SMoriah Waterland /* release hold on signals */
5975c51f124SMoriah Waterland
5985c51f124SMoriah Waterland (void) sigrelse(SIGHUP);
5995c51f124SMoriah Waterland (void) sigrelse(SIGINT);
6005c51f124SMoriah Waterland
6015c51f124SMoriah Waterland /* establish temporary directory to use */
6025c51f124SMoriah Waterland
6035c51f124SMoriah Waterland tmpdir = getenv("TMPDIR");
6045c51f124SMoriah Waterland if (tmpdir == NULL) {
6055c51f124SMoriah Waterland tmpdir = P_tmpdir;
6065c51f124SMoriah Waterland }
6075c51f124SMoriah Waterland
6085c51f124SMoriah Waterland echoDebug(DBG_PKGRM_TMPDIR, tmpdir);
6095c51f124SMoriah Waterland
6105c51f124SMoriah Waterland /* initialize path parameters */
6115c51f124SMoriah Waterland
6125c51f124SMoriah Waterland set_PKGpaths(get_inst_root());
6135c51f124SMoriah Waterland
6145c51f124SMoriah Waterland /*
6155c51f124SMoriah Waterland * initialize installation admin parameters - if removing from a spool
6165c51f124SMoriah Waterland * directory then the admin file is ignore.
6175c51f124SMoriah Waterland */
6185c51f124SMoriah Waterland
6195c51f124SMoriah Waterland if (spoolDir == NULL) {
6205c51f124SMoriah Waterland echoDebug(DBG_PKGRM_ADMINFILE, admnfile ? admnfile : "");
6215c51f124SMoriah Waterland setadminFile(admnfile);
6225c51f124SMoriah Waterland }
6235c51f124SMoriah Waterland
6245c51f124SMoriah Waterland /*
6255c51f124SMoriah Waterland * if running in the global zone, and non-global zones exist, then
6265c51f124SMoriah Waterland * enable hollow package support so that any packages that are marked
6275c51f124SMoriah Waterland * SUNW_PKG_HOLLOW=true will be correctly removed in non-global zones
6285c51f124SMoriah Waterland * when removed directly in the global zone by the global zone admin.
6295c51f124SMoriah Waterland */
6305c51f124SMoriah Waterland
6315c51f124SMoriah Waterland if (is_depend_pkginfo_DB()) {
6325c51f124SMoriah Waterland echoDebug(DBG_PKGRM_HOLLOW_ENABLED);
6335c51f124SMoriah Waterland } else if ((z_running_in_global_zone() == B_TRUE) &&
6345c51f124SMoriah Waterland (z_non_global_zones_exist() == B_TRUE)) {
6355c51f124SMoriah Waterland echoDebug(DBG_PKGRM_ENABLING_HOLLOW);
6365c51f124SMoriah Waterland set_depend_pkginfo_DB(B_TRUE);
6375c51f124SMoriah Waterland }
6385c51f124SMoriah Waterland
6395c51f124SMoriah Waterland /*
6405c51f124SMoriah Waterland * See if user wants this to be handled as an old style pkg.
6415c51f124SMoriah Waterland * NOTE : the ``exception_pkg()'' stuff is to be used only
6425c51f124SMoriah Waterland * through on495. This function comes out for on1095. See
6435c51f124SMoriah Waterland * PSARC 1993-546. -- JST
6445c51f124SMoriah Waterland */
6455c51f124SMoriah Waterland if (getenv("NONABI_SCRIPTS") != NULL) {
6465c51f124SMoriah Waterland old_pkg = 1;
6475c51f124SMoriah Waterland }
6485c51f124SMoriah Waterland
6495c51f124SMoriah Waterland /*
6505c51f124SMoriah Waterland * See if the user wants to process symlinks consistent with
6515c51f124SMoriah Waterland * the old behavior.
6525c51f124SMoriah Waterland */
6535c51f124SMoriah Waterland
6545c51f124SMoriah Waterland if (getenv("PKG_NONABI_SYMLINKS") != NULL) {
6555c51f124SMoriah Waterland old_symlinks = 1;
6565c51f124SMoriah Waterland }
6575c51f124SMoriah Waterland
6585c51f124SMoriah Waterland if (devtype((spoolDir ? spoolDir : get_PKGLOC()), &pkgdev) ||
6595c51f124SMoriah Waterland pkgdev.dirname == NULL) {
6605c51f124SMoriah Waterland progerr(ERR_BAD_DEVICE, spoolDir ? spoolDir : get_PKGLOC());
6615c51f124SMoriah Waterland quit(1);
6625c51f124SMoriah Waterland /* NOTREACHED */
6635c51f124SMoriah Waterland }
6645c51f124SMoriah Waterland
6655c51f124SMoriah Waterland pkgdir = pkgdev.dirname;
6665c51f124SMoriah Waterland repeat = ((optind >= argc) && pkgdev.mount);
6675c51f124SMoriah Waterland
6685c51f124SMoriah Waterland /*
6695c51f124SMoriah Waterland * error if there are packages on the command line and a category
6705c51f124SMoriah Waterland * was specified
6715c51f124SMoriah Waterland */
6725c51f124SMoriah Waterland
6735c51f124SMoriah Waterland if (optind < argc && catg_arg != NULL) {
6745c51f124SMoriah Waterland progerr(ERR_PKGS_AND_CAT_PKGRM);
6755c51f124SMoriah Waterland usage();
6765c51f124SMoriah Waterland /* NOTREACHED */
6775c51f124SMoriah Waterland }
6785c51f124SMoriah Waterland
6795c51f124SMoriah Waterland /*
6805c51f124SMoriah Waterland * ********************************************************************
6815c51f124SMoriah Waterland * main package processing "loop"
6825c51f124SMoriah Waterland * ********************************************************************
6835c51f124SMoriah Waterland */
6845c51f124SMoriah Waterland
6855c51f124SMoriah Waterland for (;;) {
6865c51f124SMoriah Waterland boolean_t b;
6875c51f124SMoriah Waterland char **pkglist; /* points to array of pkgs */
6885c51f124SMoriah Waterland
6895c51f124SMoriah Waterland /*
6905c51f124SMoriah Waterland * mount the spool device if required
6915c51f124SMoriah Waterland */
6925c51f124SMoriah Waterland
6935c51f124SMoriah Waterland if (pkgdev.mount) {
6945c51f124SMoriah Waterland if (n = pkgmount(&pkgdev, NULL, 0, 0, 1)) {
6955c51f124SMoriah Waterland quit(n);
6965c51f124SMoriah Waterland /* NOTREACHED */
6975c51f124SMoriah Waterland }
6985c51f124SMoriah Waterland }
6995c51f124SMoriah Waterland
7005c51f124SMoriah Waterland if (chdir(pkgdev.dirname)) {
7015c51f124SMoriah Waterland progerr(ERR_CHDIR, pkgdev.dirname);
7025c51f124SMoriah Waterland quit(1);
7035c51f124SMoriah Waterland /* NOTREACHED */
7045c51f124SMoriah Waterland }
7055c51f124SMoriah Waterland
7065c51f124SMoriah Waterland /*
7075c51f124SMoriah Waterland * spool device mounted/available - get the list of the
7085c51f124SMoriah Waterland * packages to remove
7095c51f124SMoriah Waterland */
7105c51f124SMoriah Waterland
7115c51f124SMoriah Waterland n = pkgGetPackageList(&pkglist, argv, optind,
7125c51f124SMoriah Waterland catg_arg, category, &pkgdev);
7135c51f124SMoriah Waterland
7145c51f124SMoriah Waterland switch (n) {
7155c51f124SMoriah Waterland case -1: /* no packages found */
7165c51f124SMoriah Waterland echoDebug(DBG_PKGLIST_RM_NONFOUND,
7175c51f124SMoriah Waterland PSTR(pkgdev.dirname));
7185c51f124SMoriah Waterland progerr(ERR_NOPKGS, pkgdev.dirname);
7195c51f124SMoriah Waterland quit(1);
7205c51f124SMoriah Waterland /* NOTREACHED */
7215c51f124SMoriah Waterland
7225c51f124SMoriah Waterland case 0: /* packages found */
7235c51f124SMoriah Waterland break;
7245c51f124SMoriah Waterland
7255c51f124SMoriah Waterland default: /* "quit" error */
7265c51f124SMoriah Waterland echoDebug(DBG_PKGLIST_RM_ERROR,
7275c51f124SMoriah Waterland pkgdev.dirname, n);
7285c51f124SMoriah Waterland quit(n);
7295c51f124SMoriah Waterland /* NOTREACHED */
7305c51f124SMoriah Waterland }
7315c51f124SMoriah Waterland
7325c51f124SMoriah Waterland /*
7335c51f124SMoriah Waterland * count the number of packages to remove
7345c51f124SMoriah Waterland * NOTE: npkgs is a global variable that is referenced by quit.c
7355c51f124SMoriah Waterland * when error messages are generated - it is referenced directly
7365c51f124SMoriah Waterland * by the other functions called below...
7375c51f124SMoriah Waterland */
7385c51f124SMoriah Waterland
7395c51f124SMoriah Waterland for (npkgs = 0; pkglist[npkgs] != (char *)NULL; /* void */) {
7405c51f124SMoriah Waterland pkgLgth = strlen(pkglist[npkgs]);
7415c51f124SMoriah Waterland if (pkgLgth > longestPkg) {
7425c51f124SMoriah Waterland longestPkg = pkgLgth;
7435c51f124SMoriah Waterland }
7445c51f124SMoriah Waterland echoDebug(DBG_PKG_SELECTED, npkgs, pkglist[npkgs]);
7455c51f124SMoriah Waterland npkgs++;
7465c51f124SMoriah Waterland }
7475c51f124SMoriah Waterland
7485c51f124SMoriah Waterland /* output number of packages to be removed */
7495c51f124SMoriah Waterland
7505c51f124SMoriah Waterland echoDebug(DBG_NUM_PKGS_TO_REMOVE, npkgs, longestPkg);
7515c51f124SMoriah Waterland
7525c51f124SMoriah Waterland /*
7535c51f124SMoriah Waterland * package list generated - remove packages
7545c51f124SMoriah Waterland */
7555c51f124SMoriah Waterland
7565c51f124SMoriah Waterland b = remove_packages(pkglist, nodelete, longestPkg, repeat,
7575c51f124SMoriah Waterland altBinDir, pkgdev.dirname, spoolDir, noZones);
7585c51f124SMoriah Waterland
7595c51f124SMoriah Waterland /*
7605c51f124SMoriah Waterland * unmount the spool directory if necessary
7615c51f124SMoriah Waterland */
7625c51f124SMoriah Waterland
7635c51f124SMoriah Waterland if (pkgdev.mount) {
7645c51f124SMoriah Waterland (void) chdir("/");
7655c51f124SMoriah Waterland if (pkgumount(&pkgdev)) {
7665c51f124SMoriah Waterland progerr(ERR_PKGUNMOUNT, pkgdev.bdevice);
7675c51f124SMoriah Waterland quit(99);
7685c51f124SMoriah Waterland /* NOTREACHED */
7695c51f124SMoriah Waterland
7705c51f124SMoriah Waterland }
7715c51f124SMoriah Waterland }
7725c51f124SMoriah Waterland
7735c51f124SMoriah Waterland /*
7745c51f124SMoriah Waterland * continue with next sequence of packages if continue set
7755c51f124SMoriah Waterland */
7765c51f124SMoriah Waterland
7775c51f124SMoriah Waterland if (b == B_TRUE) {
7785c51f124SMoriah Waterland continue;
7795c51f124SMoriah Waterland }
7805c51f124SMoriah Waterland
7815c51f124SMoriah Waterland /*
7825c51f124SMoriah Waterland * not continuing - quit with 0 exit code
7835c51f124SMoriah Waterland */
7845c51f124SMoriah Waterland
7855c51f124SMoriah Waterland quit(0);
7865c51f124SMoriah Waterland /* NOTREACHED */
7875c51f124SMoriah Waterland #ifdef lint
7885c51f124SMoriah Waterland return (0);
7895c51f124SMoriah Waterland #endif /* lint */
7905c51f124SMoriah Waterland }
7915c51f124SMoriah Waterland }
7925c51f124SMoriah Waterland
7935c51f124SMoriah Waterland /*
7945c51f124SMoriah Waterland * *****************************************************************************
7955c51f124SMoriah Waterland * static internal (private) functions
7965c51f124SMoriah Waterland * *****************************************************************************
7975c51f124SMoriah Waterland */
7985c51f124SMoriah Waterland
7995c51f124SMoriah Waterland /*
8005c51f124SMoriah Waterland * Name: doRemove
8015c51f124SMoriah Waterland * Description: Remove a package from the global zone, and optionally from one
8025c51f124SMoriah Waterland * or more non-global zones.
8035c51f124SMoriah Waterland * Arguments: a_nodelete: should the files and scripts remain installed?
8045c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
8055c51f124SMoriah Waterland * the removal of any files and any class action scripts
8065c51f124SMoriah Waterland * and suppress the running of any class action scripts.
8075c51f124SMoriah Waterland * The package files remain but the package looks like it
8085c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
8095c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
8105c51f124SMoriah Waterland * files and class action scripts are removed, and any
8115c51f124SMoriah Waterland * appropriate class action scripts are run.
8125c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
8135c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
8145c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
8155c51f124SMoriah Waterland * a_longestPkg - length of the longest package "name" (for
8165c51f124SMoriah Waterland * output format alignment)
8175c51f124SMoriah Waterland * a_adminFile - pointer to string representing the admin
8185c51f124SMoriah Waterland * file to pass to pkgremove when removing a package from
8195c51f124SMoriah Waterland * the global zone only. Typically the admin file used for
8205c51f124SMoriah Waterland * the global zone is the admin file passed in by the user.
8215c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkgremove.
8225c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
8235c51f124SMoriah Waterland * file to pass to pkgremove when removing the package
8245c51f124SMoriah Waterland * from a non-global zone only. Typically the admin file
8255c51f124SMoriah Waterland * used for non-global zones supresses all checks since
8265c51f124SMoriah Waterland * the dependency checking is done for all zones first
8275c51f124SMoriah Waterland * before proceeding.
8285c51f124SMoriah Waterland * A zoneAdminFile MUST be specified if a_zlst != NULL.
8295c51f124SMoriah Waterland * A zoneAdminFile must NOT be specified if a_zlst == NULL.
8305c51f124SMoriah Waterland * a_zlst - list of zones to process; NULL if no zones to process.
8315c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
8325c51f124SMoriah Waterland * 0 - success
8335c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
8345c51f124SMoriah Waterland * 2 - non-fatal error (warning)
8355c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
8365c51f124SMoriah Waterland * 4 - admin settings prevented operation
8375c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
8385c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
8395c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
8405c51f124SMoriah Waterland */
8415c51f124SMoriah Waterland
8425c51f124SMoriah Waterland static int
doRemove(int a_nodelete,char * a_altBinDir,int a_longestPkg,char * a_adminFile,char * a_zoneAdminFile,zoneList_t a_zlst)8435c51f124SMoriah Waterland doRemove(int a_nodelete, char *a_altBinDir, int a_longestPkg, char *a_adminFile,
8445c51f124SMoriah Waterland char *a_zoneAdminFile, zoneList_t a_zlst)
8455c51f124SMoriah Waterland {
8465c51f124SMoriah Waterland boolean_t b;
8475c51f124SMoriah Waterland char *zoneName;
8485c51f124SMoriah Waterland char ans[MAX_INPUT];
8495c51f124SMoriah Waterland int n;
8505c51f124SMoriah Waterland int zoneIndex;
8515c51f124SMoriah Waterland int zonesSkipped;
8525c51f124SMoriah Waterland struct pkginfo *pinfo = (struct pkginfo *)NULL;
8535c51f124SMoriah Waterland zone_state_t zst;
8545c51f124SMoriah Waterland
8555c51f124SMoriah Waterland /* entry assertions */
8565c51f124SMoriah Waterland
8575c51f124SMoriah Waterland if (a_zlst != (zoneList_t)NULL) {
8585c51f124SMoriah Waterland /* zone list specified - zone admin file required */
8595c51f124SMoriah Waterland assert(a_zoneAdminFile != (char *)NULL);
8605c51f124SMoriah Waterland assert(*a_zoneAdminFile != '\0');
8615c51f124SMoriah Waterland } else {
8625c51f124SMoriah Waterland /* no zone list specified - no zone admin file needed */
8635c51f124SMoriah Waterland assert(a_zoneAdminFile == (char *)NULL);
8645c51f124SMoriah Waterland }
8655c51f124SMoriah Waterland
8665c51f124SMoriah Waterland /* NOTE: required 'pkgdir' set to spool directory or NULL */
8675c51f124SMoriah Waterland b = pkginfoIsPkgInstalled(&pinfo, pkginst);
8685c51f124SMoriah Waterland if (b == B_FALSE) {
8695c51f124SMoriah Waterland progerr(ERR_NO_SUCH_INSTANCE, pkginst);
8705c51f124SMoriah Waterland pkginfoFree(&pinfo);
8715c51f124SMoriah Waterland return (2);
8725c51f124SMoriah Waterland }
8735c51f124SMoriah Waterland
8745c51f124SMoriah Waterland /* entry debugging info */
8755c51f124SMoriah Waterland
8765c51f124SMoriah Waterland echoDebug(DBG_DOREMOVE_ENTRY);
8775c51f124SMoriah Waterland echoDebug(DBG_DOREMOVE_ARGS, PSTR(pinfo->pkginst), PSTR(pinfo->name),
8785c51f124SMoriah Waterland PSTR(pinfo->arch), PSTR(pinfo->version), PSTR(pinfo->basedir),
8795c51f124SMoriah Waterland PSTR(pinfo->catg), pinfo->status);
8805c51f124SMoriah Waterland
8815c51f124SMoriah Waterland if (!nointeract) {
8825c51f124SMoriah Waterland char fmt1[100];
8835c51f124SMoriah Waterland
8845c51f124SMoriah Waterland /* create format based on max pkg name length */
8855c51f124SMoriah Waterland
8865c51f124SMoriah Waterland (void) snprintf(fmt1, sizeof (fmt1), " %%-%d.%ds %%s",
8875c51f124SMoriah Waterland a_longestPkg, a_longestPkg);
8885c51f124SMoriah Waterland
8895c51f124SMoriah Waterland if (pinfo->status == PI_SPOOLED) {
8905c51f124SMoriah Waterland echo(INFO_SPOOLED);
8915c51f124SMoriah Waterland } else {
8925c51f124SMoriah Waterland if (getuid()) {
8935c51f124SMoriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
8945c51f124SMoriah Waterland exit(1);
8955c51f124SMoriah Waterland }
8965c51f124SMoriah Waterland echo(INFO_INSTALL);
8975c51f124SMoriah Waterland }
8985c51f124SMoriah Waterland
8995c51f124SMoriah Waterland echo(fmt1, pinfo->pkginst, pinfo->name);
9005c51f124SMoriah Waterland
9015c51f124SMoriah Waterland if (pinfo->arch || pinfo->version) {
9025c51f124SMoriah Waterland char fmt2[100];
9035c51f124SMoriah Waterland
9045c51f124SMoriah Waterland /* create format based on max pkg name length */
9055c51f124SMoriah Waterland
9065c51f124SMoriah Waterland (void) snprintf(fmt2, sizeof (fmt2), " %%%d.%ds ",
9075c51f124SMoriah Waterland a_longestPkg, a_longestPkg);
9085c51f124SMoriah Waterland
9095c51f124SMoriah Waterland /* LINTED variable format specifier to fprintf() */
9105c51f124SMoriah Waterland (void) fprintf(stderr, fmt2, "");
9115c51f124SMoriah Waterland
9125c51f124SMoriah Waterland if (pinfo->arch) {
9135c51f124SMoriah Waterland (void) fprintf(stderr, "(%s) ", pinfo->arch);
9145c51f124SMoriah Waterland }
9155c51f124SMoriah Waterland
9165c51f124SMoriah Waterland if (pinfo->version) {
9175c51f124SMoriah Waterland (void) fprintf(stderr, "%s", pinfo->version);
9185c51f124SMoriah Waterland }
9195c51f124SMoriah Waterland
9205c51f124SMoriah Waterland (void) fprintf(stderr, "\n");
9215c51f124SMoriah Waterland }
9225c51f124SMoriah Waterland
9235c51f124SMoriah Waterland n = ckyorn(ans, NULL, NULL, NULL, ASK_CONFIRM);
9245c51f124SMoriah Waterland if (n != 0) {
9255c51f124SMoriah Waterland quit(n);
9265c51f124SMoriah Waterland /* NOTREACHED */
9275c51f124SMoriah Waterland }
9285c51f124SMoriah Waterland
9295c51f124SMoriah Waterland if (strchr("yY", *ans) == NULL) {
9305c51f124SMoriah Waterland pkginfoFree(&pinfo);
9315c51f124SMoriah Waterland return (0);
9325c51f124SMoriah Waterland }
9335c51f124SMoriah Waterland }
9345c51f124SMoriah Waterland
9355c51f124SMoriah Waterland if (pinfo->status == PI_SPOOLED) {
9365c51f124SMoriah Waterland /* removal from a directory */
9375c51f124SMoriah Waterland echo(INFO_RMSPOOL, pkginst);
9385c51f124SMoriah Waterland pkginfoFree(&pinfo);
9395c51f124SMoriah Waterland return (rrmdir(pkginst));
9405c51f124SMoriah Waterland }
9415c51f124SMoriah Waterland
9425c51f124SMoriah Waterland /* exit if not root */
9435c51f124SMoriah Waterland
9445c51f124SMoriah Waterland if (getuid()) {
9455c51f124SMoriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
9465c51f124SMoriah Waterland exit(1);
9475c51f124SMoriah Waterland }
9485c51f124SMoriah Waterland
9495c51f124SMoriah Waterland pkginfoFree(&pinfo);
9505c51f124SMoriah Waterland
9515c51f124SMoriah Waterland zonesSkipped = 0;
9525c51f124SMoriah Waterland
9535c51f124SMoriah Waterland if (interrupted != 0) {
9545c51f124SMoriah Waterland echo(MSG_DOREMOVE_INTERRUPTED_B4_Z, pkginst);
9555c51f124SMoriah Waterland echoDebug(MSG_DOREMOVE_INTERRUPTED_B4_Z, pkginst);
9565c51f124SMoriah Waterland return (n);
9575c51f124SMoriah Waterland }
9585c51f124SMoriah Waterland
9595c51f124SMoriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "before pkgZoneRemove",
9605c51f124SMoriah Waterland admnflag, doreboot, failflag, interrupted,
9615c51f124SMoriah Waterland intrflag, ireboot, nullflag, warnflag);
9625c51f124SMoriah Waterland
9635c51f124SMoriah Waterland for (zoneIndex = 0;
9645c51f124SMoriah Waterland a_zlst != NULL &&
9655c51f124SMoriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) != NULL;
9665c51f124SMoriah Waterland zoneIndex++) {
9675c51f124SMoriah Waterland
9685c51f124SMoriah Waterland /* skip the zone if it is NOT running */
9695c51f124SMoriah Waterland
9705c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
9715c51f124SMoriah Waterland if (zst != ZONE_STATE_RUNNING && zst != ZONE_STATE_MOUNTED) {
9725c51f124SMoriah Waterland zonesSkipped++;
9735c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE, zoneName);
9745c51f124SMoriah Waterland continue;
9755c51f124SMoriah Waterland }
9765c51f124SMoriah Waterland
9775c51f124SMoriah Waterland echo(MSG_REMOVE_PKG_FROM_ZONE, pkginst, zoneName);
9785c51f124SMoriah Waterland echoDebug(DBG_REMOVE_PKG_FROM_ZONE, pkginst, zoneName);
9795c51f124SMoriah Waterland
9805c51f124SMoriah Waterland /*
9815c51f124SMoriah Waterland * remove package from zone; use the zone admin file which
9825c51f124SMoriah Waterland * suppresses all checks.
9835c51f124SMoriah Waterland */
9845c51f124SMoriah Waterland
9855c51f124SMoriah Waterland n = pkgZoneRemove(z_zlist_get_scratch(a_zlst, zoneIndex),
986*6e1ae2a3SGary Pennington a_nodelete, a_altBinDir, a_zoneAdminFile,
987*6e1ae2a3SGary Pennington zst, B_FALSE);
9885c51f124SMoriah Waterland
9895c51f124SMoriah Waterland /* set success/fail condition variables */
9905c51f124SMoriah Waterland
9915c51f124SMoriah Waterland ckreturn(n);
9925c51f124SMoriah Waterland
9935c51f124SMoriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "after pkgZoneRemove",
9945c51f124SMoriah Waterland admnflag, doreboot, failflag, interrupted, intrflag,
9955c51f124SMoriah Waterland ireboot, nullflag, warnflag);
9965c51f124SMoriah Waterland }
9975c51f124SMoriah Waterland
9985c51f124SMoriah Waterland if (zonesSkipped > 0) {
9995c51f124SMoriah Waterland echoDebug(DBG_ZONES_SKIPPED, zonesSkipped);
10005c51f124SMoriah Waterland
10015c51f124SMoriah Waterland for (zoneIndex = 0;
10025c51f124SMoriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) !=
10035c51f124SMoriah Waterland (char *)NULL; zoneIndex++) {
10045c51f124SMoriah Waterland
10055c51f124SMoriah Waterland /* skip the zone if it IS running */
10065c51f124SMoriah Waterland
10075c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
10085c51f124SMoriah Waterland if (zst == ZONE_STATE_RUNNING ||
10095c51f124SMoriah Waterland zst == ZONE_STATE_MOUNTED) {
10105c51f124SMoriah Waterland zonesSkipped++;
10115c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_BOOT, zoneName);
10125c51f124SMoriah Waterland continue;
10135c51f124SMoriah Waterland }
10145c51f124SMoriah Waterland
10155c51f124SMoriah Waterland /* skip the zone if it is NOT bootable */
10165c51f124SMoriah Waterland
10175c51f124SMoriah Waterland if (z_zlist_is_zone_runnable(a_zlst,
10185c51f124SMoriah Waterland zoneIndex) == B_FALSE) {
10195c51f124SMoriah Waterland echo(MSG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
10205c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_NOT_RUNNABLE,
10215c51f124SMoriah Waterland zoneName);
10225c51f124SMoriah Waterland continue;
10235c51f124SMoriah Waterland }
10245c51f124SMoriah Waterland
10255c51f124SMoriah Waterland /* mount up the zone */
10265c51f124SMoriah Waterland
10275c51f124SMoriah Waterland echo(MSG_BOOTING_ZONE, zoneName);
10285c51f124SMoriah Waterland echoDebug(DBG_BOOTING_ZONE, zoneName);
10295c51f124SMoriah Waterland
10305c51f124SMoriah Waterland b = z_zlist_change_zone_state(a_zlst, zoneIndex,
10315c51f124SMoriah Waterland ZONE_STATE_MOUNTED);
10325c51f124SMoriah Waterland if (b == B_FALSE) {
10335c51f124SMoriah Waterland progerr(ERR_CANNOT_BOOT_ZONE, zoneName);
10345c51f124SMoriah Waterland /* set fatal error return condition */
10355c51f124SMoriah Waterland ckreturn(1);
10365c51f124SMoriah Waterland continue;
10375c51f124SMoriah Waterland }
10385c51f124SMoriah Waterland
10395c51f124SMoriah Waterland echo(MSG_REMOVE_PKG_FROM_ZONE, pkginst, zoneName);
10405c51f124SMoriah Waterland
10415c51f124SMoriah Waterland /*
10425c51f124SMoriah Waterland * remove package from zone; use the zone admin file
10435c51f124SMoriah Waterland * which suppresses all checks.
10445c51f124SMoriah Waterland */
10455c51f124SMoriah Waterland
10465c51f124SMoriah Waterland n = pkgZoneRemove(z_zlist_get_scratch(a_zlst,
1047*6e1ae2a3SGary Pennington zoneIndex), a_nodelete, a_altBinDir,
1048*6e1ae2a3SGary Pennington a_zoneAdminFile, ZONE_STATE_MOUNTED, B_TRUE);
10495c51f124SMoriah Waterland
10505c51f124SMoriah Waterland /* set success/fail condition variables */
10515c51f124SMoriah Waterland
10525c51f124SMoriah Waterland ckreturn(n);
10535c51f124SMoriah Waterland
10545c51f124SMoriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "after pkgZoneRemove",
10555c51f124SMoriah Waterland admnflag, doreboot, failflag, interrupted,
10565c51f124SMoriah Waterland intrflag, ireboot, nullflag, warnflag);
10575c51f124SMoriah Waterland
10585c51f124SMoriah Waterland /* restore original state of zone */
10595c51f124SMoriah Waterland
10605c51f124SMoriah Waterland echo(MSG_RESTORE_ZONE_STATE, zoneName);
10615c51f124SMoriah Waterland echoDebug(DBG_RESTORE_ZONE_STATE, zoneName);
10625c51f124SMoriah Waterland
10635c51f124SMoriah Waterland b = z_zlist_restore_zone_state(a_zlst, zoneIndex);
10645c51f124SMoriah Waterland }
10655c51f124SMoriah Waterland }
10665c51f124SMoriah Waterland
10675c51f124SMoriah Waterland /*
10685c51f124SMoriah Waterland * Process global zone if it was either the only possible
10695c51f124SMoriah Waterland * target (no list of zones specified) or it appears in the list
10705c51f124SMoriah Waterland */
10715c51f124SMoriah Waterland if (a_zlst == NULL || z_on_zone_spec(GLOBAL_ZONENAME)) {
10725c51f124SMoriah Waterland /* reset interrupted flag before calling pkgremove */
10735c51f124SMoriah Waterland interrupted = 0; /* last action was NOT quit */
10745c51f124SMoriah Waterland
10755c51f124SMoriah Waterland /*
10765c51f124SMoriah Waterland * call pkgremove for this package for the global zone;
10775c51f124SMoriah Waterland * use the admin file passed in by the user via -a.
10785c51f124SMoriah Waterland */
1079*6e1ae2a3SGary Pennington n = pkgRemove(a_nodelete, a_altBinDir, a_adminFile);
10805c51f124SMoriah Waterland
10815c51f124SMoriah Waterland /* set success/fail condition variables */
10825c51f124SMoriah Waterland ckreturn(n);
10835c51f124SMoriah Waterland }
10845c51f124SMoriah Waterland
10855c51f124SMoriah Waterland return (n);
10865c51f124SMoriah Waterland }
10875c51f124SMoriah Waterland
10885c51f124SMoriah Waterland /*
10895c51f124SMoriah Waterland * function to clear out any exisiting error return conditions that may have
10905c51f124SMoriah Waterland * been set by previous calls to ckreturn()
10915c51f124SMoriah Waterland */
10925c51f124SMoriah Waterland static void
resetreturn()10935c51f124SMoriah Waterland resetreturn()
10945c51f124SMoriah Waterland {
10955c51f124SMoriah Waterland admnflag = 0; /* != 0 if any pkg op admin setting failure (4) */
10965c51f124SMoriah Waterland doreboot = 0; /* != 0 if reboot required after installation (>= 10) */
10975c51f124SMoriah Waterland failflag = 0; /* != 0 if fatal error has occurred (1) */
10985c51f124SMoriah Waterland intrflag = 0; /* != 0 if user selected quit (3) */
10995c51f124SMoriah Waterland ireboot = 0; /* != 0 if immediate reboot required (>= 20) */
11005c51f124SMoriah Waterland nullflag = 0; /* != 0 if admin interaction required (5) */
11015c51f124SMoriah Waterland warnflag = 0; /* != 0 if non-fatal error has occurred (2) */
11025c51f124SMoriah Waterland interrupted = 0; /* last pkg op was quit (1,2,3,4,5) */
11035c51f124SMoriah Waterland }
11045c51f124SMoriah Waterland
11055c51f124SMoriah Waterland /*
11065c51f124SMoriah Waterland * function which checks the indicated return value
11075c51f124SMoriah Waterland * and indicates disposition of installation
11085c51f124SMoriah Waterland */
11095c51f124SMoriah Waterland static void
ckreturn(int retcode)11105c51f124SMoriah Waterland ckreturn(int retcode)
11115c51f124SMoriah Waterland {
11125c51f124SMoriah Waterland /*
11135c51f124SMoriah Waterland * entry debugging info
11145c51f124SMoriah Waterland */
11155c51f124SMoriah Waterland
11165c51f124SMoriah Waterland echoDebug(DBG_PKGRM_CKRETURN, retcode, PSTR(pkginst));
11175c51f124SMoriah Waterland
11185c51f124SMoriah Waterland switch (retcode) {
11195c51f124SMoriah Waterland case 0: /* successful */
11205c51f124SMoriah Waterland case 10:
11215c51f124SMoriah Waterland case 20:
11225c51f124SMoriah Waterland break; /* empty case */
11235c51f124SMoriah Waterland
11245c51f124SMoriah Waterland case 1: /* package operation failed (fatal error) */
11255c51f124SMoriah Waterland case 11:
11265c51f124SMoriah Waterland case 21:
11275c51f124SMoriah Waterland failflag++;
11285c51f124SMoriah Waterland interrupted++;
11295c51f124SMoriah Waterland break;
11305c51f124SMoriah Waterland
11315c51f124SMoriah Waterland case 2: /* non-fatal error (warning) */
11325c51f124SMoriah Waterland case 12:
11335c51f124SMoriah Waterland case 22:
11345c51f124SMoriah Waterland warnflag++;
11355c51f124SMoriah Waterland interrupted++;
11365c51f124SMoriah Waterland break;
11375c51f124SMoriah Waterland
11385c51f124SMoriah Waterland case 3: /* user selected quit; operation interrupted */
11395c51f124SMoriah Waterland case 13:
11405c51f124SMoriah Waterland case 23:
11415c51f124SMoriah Waterland intrflag++;
11425c51f124SMoriah Waterland interrupted++;
11435c51f124SMoriah Waterland break;
11445c51f124SMoriah Waterland
11455c51f124SMoriah Waterland case 4: /* admin settings prevented operation */
11465c51f124SMoriah Waterland case 14:
11475c51f124SMoriah Waterland case 24:
11485c51f124SMoriah Waterland admnflag++;
11495c51f124SMoriah Waterland interrupted++;
11505c51f124SMoriah Waterland break;
11515c51f124SMoriah Waterland
11525c51f124SMoriah Waterland case 5: /* administration: interaction req (no -n) */
11535c51f124SMoriah Waterland case 15:
11545c51f124SMoriah Waterland case 25:
11555c51f124SMoriah Waterland nullflag++;
11565c51f124SMoriah Waterland interrupted++;
11575c51f124SMoriah Waterland break;
11585c51f124SMoriah Waterland
11595c51f124SMoriah Waterland default:
11605c51f124SMoriah Waterland failflag++;
11615c51f124SMoriah Waterland interrupted++;
11625c51f124SMoriah Waterland return;
11635c51f124SMoriah Waterland }
11645c51f124SMoriah Waterland
11655c51f124SMoriah Waterland if (retcode >= 20) {
11665c51f124SMoriah Waterland ireboot++;
11675c51f124SMoriah Waterland } else if (retcode >= 10) {
11685c51f124SMoriah Waterland doreboot++;
11695c51f124SMoriah Waterland }
11705c51f124SMoriah Waterland }
11715c51f124SMoriah Waterland
11725c51f124SMoriah Waterland static int
pkgZoneCheckRemove(char * a_zoneName,char * a_altBinDir,char * a_adminFile,char * a_stdoutPath,zone_state_t a_zoneState,boolean_t tmpzone)1173*6e1ae2a3SGary Pennington pkgZoneCheckRemove(char *a_zoneName, char *a_altBinDir, char *a_adminFile,
1174*6e1ae2a3SGary Pennington char *a_stdoutPath, zone_state_t a_zoneState, boolean_t tmpzone)
11755c51f124SMoriah Waterland {
11765c51f124SMoriah Waterland char *arg[MAXARGS];
11775c51f124SMoriah Waterland char *p;
11785c51f124SMoriah Waterland char adminfd_path[PATH_MAX];
11795c51f124SMoriah Waterland char path[PATH_MAX];
11805c51f124SMoriah Waterland int fds[MAX_FDS];
11815c51f124SMoriah Waterland int maxfds;
11825c51f124SMoriah Waterland int n;
11835c51f124SMoriah Waterland int nargs;
11845c51f124SMoriah Waterland
11855c51f124SMoriah Waterland /* entry assertions */
11865c51f124SMoriah Waterland
11875c51f124SMoriah Waterland assert(a_zoneName != (char *)NULL);
11885c51f124SMoriah Waterland assert(*a_zoneName != '\0');
11895c51f124SMoriah Waterland
11905c51f124SMoriah Waterland /* entry debugging info */
11915c51f124SMoriah Waterland
11925c51f124SMoriah Waterland echoDebug(DBG_PKGZONECHECKREMOVE_ENTRY);
11935c51f124SMoriah Waterland echoDebug(DBG_PKGZONECHECKREMOVE_ARGS, a_zoneName, PSTR(pkginst),
11945c51f124SMoriah Waterland PSTR(pkgdev.dirname), PSTR(a_adminFile), PSTR(a_stdoutPath));
11955c51f124SMoriah Waterland
11965c51f124SMoriah Waterland /* generate path to pkgremove */
11975c51f124SMoriah Waterland
11985c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/pkgremove",
11995c51f124SMoriah Waterland a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
12005c51f124SMoriah Waterland
12015c51f124SMoriah Waterland /* start at first file descriptor */
12025c51f124SMoriah Waterland
12035c51f124SMoriah Waterland maxfds = 0;
12045c51f124SMoriah Waterland
12055c51f124SMoriah Waterland /*
12065c51f124SMoriah Waterland * generate argument list for call to pkgremove
12075c51f124SMoriah Waterland */
12085c51f124SMoriah Waterland
12095c51f124SMoriah Waterland /* start at argument 0 */
12105c51f124SMoriah Waterland
12115c51f124SMoriah Waterland nargs = 0;
12125c51f124SMoriah Waterland
12135c51f124SMoriah Waterland /* first argument is path to executable */
12145c51f124SMoriah Waterland
12155c51f124SMoriah Waterland arg[nargs++] = strdup(path);
12165c51f124SMoriah Waterland
12175c51f124SMoriah Waterland /* second argument is always: pass -O debug to pkgremove: debug mode */
12185c51f124SMoriah Waterland
12195c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
12205c51f124SMoriah Waterland arg[nargs++] = "-O";
12215c51f124SMoriah Waterland arg[nargs++] = "debug";
12225c51f124SMoriah Waterland }
12235c51f124SMoriah Waterland
12245c51f124SMoriah Waterland /* pkgrm -b dir: pass -b to pkgremove */
12255c51f124SMoriah Waterland
12265c51f124SMoriah Waterland if (a_altBinDir != (char *)NULL) {
12275c51f124SMoriah Waterland arg[nargs++] = "-b";
12285c51f124SMoriah Waterland arg[nargs++] = a_altBinDir;
12295c51f124SMoriah Waterland }
12305c51f124SMoriah Waterland
12315c51f124SMoriah Waterland /*
12325c51f124SMoriah Waterland * NONABI_SCRIPTS defined: pass -o to pkgremove; refers to a
12335c51f124SMoriah Waterland * pkg requiring operator interaction during a procedure script
12345c51f124SMoriah Waterland * (common before on1093)
12355c51f124SMoriah Waterland */
12365c51f124SMoriah Waterland
12375c51f124SMoriah Waterland if (old_pkg) {
12385c51f124SMoriah Waterland arg[nargs++] = "-o";
12395c51f124SMoriah Waterland }
12405c51f124SMoriah Waterland
12415c51f124SMoriah Waterland /*
12425c51f124SMoriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkgremove; process
12435c51f124SMoriah Waterland * symlinks consistent with old behavior
12445c51f124SMoriah Waterland */
12455c51f124SMoriah Waterland
12465c51f124SMoriah Waterland if (old_symlinks) {
12475c51f124SMoriah Waterland arg[nargs++] = "-y";
12485c51f124SMoriah Waterland }
12495c51f124SMoriah Waterland
12505c51f124SMoriah Waterland /* pkgrm -M: pass -M to pkgremove: don't mount client file systems */
12515c51f124SMoriah Waterland
12525c51f124SMoriah Waterland arg[nargs++] = "-M";
12535c51f124SMoriah Waterland
12545c51f124SMoriah Waterland /* pkgrm -A: pass -A to pkgremove */
12555c51f124SMoriah Waterland
12565c51f124SMoriah Waterland if (pkgrmremote) {
12575c51f124SMoriah Waterland arg[nargs++] = "-A";
12585c51f124SMoriah Waterland }
12595c51f124SMoriah Waterland
12605c51f124SMoriah Waterland /* pkgrm -v: pass -v to pkgremove: never trace scripts */
12615c51f124SMoriah Waterland
12625c51f124SMoriah Waterland /* pass "-O enable-hollow-package-support" */
12635c51f124SMoriah Waterland
12645c51f124SMoriah Waterland if (is_depend_pkginfo_DB()) {
12655c51f124SMoriah Waterland arg[nargs++] = "-O";
12665c51f124SMoriah Waterland arg[nargs++] = "enable-hollow-package-support";
12675c51f124SMoriah Waterland }
12685c51f124SMoriah Waterland
12695c51f124SMoriah Waterland /* pass -n to pkgremove: always in noninteractive mode */
12705c51f124SMoriah Waterland
12715c51f124SMoriah Waterland arg[nargs++] = "-n";
12725c51f124SMoriah Waterland
12735c51f124SMoriah Waterland /* pkgrm -a admin: pass -a admin to pkgremove: admin file */
12745c51f124SMoriah Waterland
12755c51f124SMoriah Waterland if (a_adminFile) {
12765c51f124SMoriah Waterland int fd;
12775c51f124SMoriah Waterland fd = openLocal(a_adminFile, O_RDONLY, tmpdir);
12785c51f124SMoriah Waterland if (fd < 0) {
12795c51f124SMoriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
12805c51f124SMoriah Waterland errno, strerror(errno));
12815c51f124SMoriah Waterland return (1);
12825c51f124SMoriah Waterland }
12835c51f124SMoriah Waterland (void) snprintf(adminfd_path, sizeof (adminfd_path),
12845c51f124SMoriah Waterland "/proc/self/fd/%d", fd);
12855c51f124SMoriah Waterland fds[maxfds++] = fd;
12865c51f124SMoriah Waterland arg[nargs++] = "-a";
12875c51f124SMoriah Waterland arg[nargs++] = strdup(adminfd_path);
12885c51f124SMoriah Waterland }
12895c51f124SMoriah Waterland
12905c51f124SMoriah Waterland /*
12915c51f124SMoriah Waterland * pkgadd -R root: pass -R /a to pkgremove in mounted zone
12925c51f124SMoriah Waterland */
12935c51f124SMoriah Waterland if (a_zoneState == ZONE_STATE_MOUNTED) {
12945c51f124SMoriah Waterland arg[nargs++] = "-R";
12955c51f124SMoriah Waterland arg[nargs++] = "/a";
12965c51f124SMoriah Waterland }
12975c51f124SMoriah Waterland
12985c51f124SMoriah Waterland /* pkgrm -F: pass -F to pkgremove: always update DB only */
12995c51f124SMoriah Waterland
13005c51f124SMoriah Waterland arg[nargs++] = "-F";
13015c51f124SMoriah Waterland
13025c51f124SMoriah Waterland /* pass "-O preremovecheck" */
13035c51f124SMoriah Waterland
13045c51f124SMoriah Waterland arg[nargs++] = "-O";
13055c51f124SMoriah Waterland arg[nargs++] = "preremovecheck";
13065c51f124SMoriah Waterland
13075c51f124SMoriah Waterland /* add "-O addzonename" */
13085c51f124SMoriah Waterland
13095c51f124SMoriah Waterland arg[nargs++] = "-O";
13105c51f124SMoriah Waterland arg[nargs++] = "addzonename";
13115c51f124SMoriah Waterland
13125c51f124SMoriah Waterland /*
13135c51f124SMoriah Waterland * add parent zone info/type
13145c51f124SMoriah Waterland */
13155c51f124SMoriah Waterland
13165c51f124SMoriah Waterland p = z_get_zonename();
13175c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) {
13185c51f124SMoriah Waterland char zn[MAXPATHLEN];
13195c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
13205c51f124SMoriah Waterland "parent-zone-name=%s", p);
13215c51f124SMoriah Waterland arg[nargs++] = "-O";
13225c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
13235c51f124SMoriah Waterland }
13245c51f124SMoriah Waterland
13255c51f124SMoriah Waterland /* current zone type */
13265c51f124SMoriah Waterland
13275c51f124SMoriah Waterland arg[nargs++] = "-O";
13285c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
13295c51f124SMoriah Waterland char zn[MAXPATHLEN];
13305c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
13315c51f124SMoriah Waterland "parent-zone-type=%s",
13325c51f124SMoriah Waterland TAG_VALUE_GLOBAL_ZONE);
13335c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
13345c51f124SMoriah Waterland } else {
13355c51f124SMoriah Waterland char zn[MAXPATHLEN];
13365c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
13375c51f124SMoriah Waterland "parent-zone-type=%s",
13385c51f124SMoriah Waterland TAG_VALUE_NONGLOBAL_ZONE);
13395c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
13405c51f124SMoriah Waterland }
13415c51f124SMoriah Waterland
134262224350SCasper H.S. Dik /* Add arguments how to start the pkgserv */
134362224350SCasper H.S. Dik
134462224350SCasper H.S. Dik arg[nargs++] = "-O";
134562224350SCasper H.S. Dik arg[nargs++] = pkgmodeargument(tmpzone ? RUN_ONCE : pkgservergetmode());
134662224350SCasper H.S. Dik
13475c51f124SMoriah Waterland /* pass -N to pkgremove: program name to report */
13485c51f124SMoriah Waterland
13495c51f124SMoriah Waterland arg[nargs++] = "-N";
13505c51f124SMoriah Waterland arg[nargs++] = get_prog_name();
13515c51f124SMoriah Waterland
13525c51f124SMoriah Waterland /* add package instance name */
13535c51f124SMoriah Waterland
13545c51f124SMoriah Waterland arg[nargs++] = pkginst;
13555c51f124SMoriah Waterland
13565c51f124SMoriah Waterland /* terminate argument list */
13575c51f124SMoriah Waterland
13585c51f124SMoriah Waterland arg[nargs++] = NULL;
13595c51f124SMoriah Waterland
13605c51f124SMoriah Waterland /* execute pkgremove command */
13615c51f124SMoriah Waterland
13625c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
13635c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, a_zoneName, arg[0]);
13645c51f124SMoriah Waterland for (n = 0; arg[n]; n++) {
13655c51f124SMoriah Waterland echoDebug(DBG_ARG, n, arg[n]);
13665c51f124SMoriah Waterland }
13675c51f124SMoriah Waterland }
13685c51f124SMoriah Waterland
13695c51f124SMoriah Waterland /* terminate file descriptor list */
13705c51f124SMoriah Waterland
13715c51f124SMoriah Waterland fds[maxfds] = -1;
13725c51f124SMoriah Waterland
13735c51f124SMoriah Waterland /* exec command in zone */
13745c51f124SMoriah Waterland
13755c51f124SMoriah Waterland n = z_zone_exec(a_zoneName, path, arg, a_stdoutPath, (char *)NULL, fds);
13765c51f124SMoriah Waterland
13775c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_EXIT, a_zoneName, arg[0], n,
13785c51f124SMoriah Waterland PSTR(a_stdoutPath));
13795c51f124SMoriah Waterland
13805c51f124SMoriah Waterland /*
13815c51f124SMoriah Waterland * close any files that were opened for use by the
13825c51f124SMoriah Waterland * /proc/self/fd interface so they could be passed to programs
13835c51f124SMoriah Waterland * via the z_zone_exec() interface
13845c51f124SMoriah Waterland */
13855c51f124SMoriah Waterland
13865c51f124SMoriah Waterland for (; maxfds > 0; maxfds--) {
13875c51f124SMoriah Waterland (void) close(fds[maxfds-1]);
13885c51f124SMoriah Waterland }
13895c51f124SMoriah Waterland
13905c51f124SMoriah Waterland /* return results of pkgremove in zone execution */
13915c51f124SMoriah Waterland
13925c51f124SMoriah Waterland return (n);
13935c51f124SMoriah Waterland }
13945c51f124SMoriah Waterland
13955c51f124SMoriah Waterland static int
pkgZoneRemove(char * a_zoneName,int a_nodelete,char * a_altBinDir,char * a_adminFile,zone_state_t a_zoneState,boolean_t tmpzone)1396*6e1ae2a3SGary Pennington pkgZoneRemove(char *a_zoneName, int a_nodelete, char *a_altBinDir,
1397*6e1ae2a3SGary Pennington char *a_adminFile, zone_state_t a_zoneState, boolean_t tmpzone)
13985c51f124SMoriah Waterland {
13995c51f124SMoriah Waterland char *arg[MAXARGS];
14005c51f124SMoriah Waterland char *p;
14015c51f124SMoriah Waterland char adminfd_path[PATH_MAX];
14025c51f124SMoriah Waterland char path[PATH_MAX];
14035c51f124SMoriah Waterland int fds[MAX_FDS];
14045c51f124SMoriah Waterland int maxfds;
14055c51f124SMoriah Waterland int n;
14065c51f124SMoriah Waterland int nargs;
14075c51f124SMoriah Waterland
14085c51f124SMoriah Waterland /* entry assertions */
14095c51f124SMoriah Waterland
14105c51f124SMoriah Waterland assert(a_zoneName != (char *)NULL);
14115c51f124SMoriah Waterland assert(*a_zoneName != '\0');
14125c51f124SMoriah Waterland
14135c51f124SMoriah Waterland /* entry debugging info */
14145c51f124SMoriah Waterland
14155c51f124SMoriah Waterland echoDebug(DBG_PKGZONEREMOVE_ENTRY);
14165c51f124SMoriah Waterland echoDebug(DBG_PKGZONEREMOVE_ARGS, a_zoneName, PSTR(pkginst),
14175c51f124SMoriah Waterland PSTR(pkgdev.dirname), a_nodelete, PSTR(a_adminFile));
14185c51f124SMoriah Waterland
14195c51f124SMoriah Waterland /* generate path to pkgremove */
14205c51f124SMoriah Waterland
14215c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/pkgremove",
14225c51f124SMoriah Waterland a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
14235c51f124SMoriah Waterland
14245c51f124SMoriah Waterland /* start at first file descriptor */
14255c51f124SMoriah Waterland
14265c51f124SMoriah Waterland maxfds = 0;
14275c51f124SMoriah Waterland
14285c51f124SMoriah Waterland /*
14295c51f124SMoriah Waterland * generate argument list for call to pkgremove
14305c51f124SMoriah Waterland */
14315c51f124SMoriah Waterland
14325c51f124SMoriah Waterland /* start at argument 0 */
14335c51f124SMoriah Waterland
14345c51f124SMoriah Waterland nargs = 0;
14355c51f124SMoriah Waterland
14365c51f124SMoriah Waterland /* first argument is path to executable */
14375c51f124SMoriah Waterland
14385c51f124SMoriah Waterland arg[nargs++] = strdup(path);
14395c51f124SMoriah Waterland
14405c51f124SMoriah Waterland /* second argument is always: pass -O debug to pkgremove: debug mode */
14415c51f124SMoriah Waterland
14425c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
14435c51f124SMoriah Waterland arg[nargs++] = "-O";
14445c51f124SMoriah Waterland arg[nargs++] = "debug";
14455c51f124SMoriah Waterland }
14465c51f124SMoriah Waterland
14475c51f124SMoriah Waterland /* pkgrm -b dir: pass -b to pkgremove */
14485c51f124SMoriah Waterland
14495c51f124SMoriah Waterland if (a_altBinDir != (char *)NULL) {
14505c51f124SMoriah Waterland arg[nargs++] = "-b";
14515c51f124SMoriah Waterland arg[nargs++] = a_altBinDir;
14525c51f124SMoriah Waterland }
14535c51f124SMoriah Waterland
14545c51f124SMoriah Waterland /*
14555c51f124SMoriah Waterland * NONABI_SCRIPTS defined: pass -o to pkgremove; refers to a
14565c51f124SMoriah Waterland * pkg requiring operator interaction during a procedure script
14575c51f124SMoriah Waterland * (common before on1093)
14585c51f124SMoriah Waterland */
14595c51f124SMoriah Waterland
14605c51f124SMoriah Waterland if (old_pkg) {
14615c51f124SMoriah Waterland arg[nargs++] = "-o";
14625c51f124SMoriah Waterland }
14635c51f124SMoriah Waterland
14645c51f124SMoriah Waterland /*
14655c51f124SMoriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkgremove; process
14665c51f124SMoriah Waterland * symlinks consistent with old behavior
14675c51f124SMoriah Waterland */
14685c51f124SMoriah Waterland
14695c51f124SMoriah Waterland if (old_symlinks) {
14705c51f124SMoriah Waterland arg[nargs++] = "-y";
14715c51f124SMoriah Waterland }
14725c51f124SMoriah Waterland
14735c51f124SMoriah Waterland /* pkgrm -M: pass -M to pkgremove: don't mount client file systems */
14745c51f124SMoriah Waterland
14755c51f124SMoriah Waterland arg[nargs++] = "-M";
14765c51f124SMoriah Waterland
14775c51f124SMoriah Waterland /* pkgrm -A: pass -A to pkgremove */
14785c51f124SMoriah Waterland
14795c51f124SMoriah Waterland if (pkgrmremote) {
14805c51f124SMoriah Waterland arg[nargs++] = "-A";
14815c51f124SMoriah Waterland }
14825c51f124SMoriah Waterland
14835c51f124SMoriah Waterland /* pkgrm -v: pass -v to pkgremove: trace scripts */
14845c51f124SMoriah Waterland
14855c51f124SMoriah Waterland if (pkgverbose) {
14865c51f124SMoriah Waterland arg[nargs++] = "-v";
14875c51f124SMoriah Waterland }
14885c51f124SMoriah Waterland
14895c51f124SMoriah Waterland /* pass "-O enable-hollow-package-support" */
14905c51f124SMoriah Waterland
14915c51f124SMoriah Waterland if (is_depend_pkginfo_DB()) {
14925c51f124SMoriah Waterland arg[nargs++] = "-O";
14935c51f124SMoriah Waterland arg[nargs++] = "enable-hollow-package-support";
14945c51f124SMoriah Waterland }
14955c51f124SMoriah Waterland
14965c51f124SMoriah Waterland /* pkgrm -n: pass -n to pkgremove: noninteractive mode */
14975c51f124SMoriah Waterland
14985c51f124SMoriah Waterland if (nointeract) {
14995c51f124SMoriah Waterland arg[nargs++] = "-n";
15005c51f124SMoriah Waterland }
15015c51f124SMoriah Waterland
15025c51f124SMoriah Waterland /* pkgrm -a admin: pass -a admin to pkgremove: admin file */
15035c51f124SMoriah Waterland
15045c51f124SMoriah Waterland if (a_adminFile) {
15055c51f124SMoriah Waterland int fd;
15065c51f124SMoriah Waterland fd = openLocal(a_adminFile, O_RDONLY, tmpdir);
15075c51f124SMoriah Waterland if (fd < 0) {
15085c51f124SMoriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
15095c51f124SMoriah Waterland errno, strerror(errno));
15105c51f124SMoriah Waterland return (1);
15115c51f124SMoriah Waterland }
15125c51f124SMoriah Waterland (void) snprintf(adminfd_path, sizeof (adminfd_path),
15135c51f124SMoriah Waterland "/proc/self/fd/%d", fd);
15145c51f124SMoriah Waterland fds[maxfds++] = fd;
15155c51f124SMoriah Waterland arg[nargs++] = "-a";
15165c51f124SMoriah Waterland arg[nargs++] = adminfd_path;
15175c51f124SMoriah Waterland }
15185c51f124SMoriah Waterland
15195c51f124SMoriah Waterland /*
15205c51f124SMoriah Waterland * pkgadd -R root: pass -R /a to pkgremove in mounted zone
15215c51f124SMoriah Waterland */
15225c51f124SMoriah Waterland if (a_zoneState == ZONE_STATE_MOUNTED) {
15235c51f124SMoriah Waterland arg[nargs++] = "-R";
15245c51f124SMoriah Waterland arg[nargs++] = "/a";
15255c51f124SMoriah Waterland }
15265c51f124SMoriah Waterland
15275c51f124SMoriah Waterland /* pkgrm -F: pass -F to pkgremove: update DB only */
15285c51f124SMoriah Waterland
15295c51f124SMoriah Waterland if (a_nodelete) {
15305c51f124SMoriah Waterland arg[nargs++] = "-F";
15315c51f124SMoriah Waterland }
15325c51f124SMoriah Waterland
15335c51f124SMoriah Waterland /* add "-O addzonename" */
15345c51f124SMoriah Waterland
15355c51f124SMoriah Waterland arg[nargs++] = "-O";
15365c51f124SMoriah Waterland arg[nargs++] = "addzonename";
15375c51f124SMoriah Waterland
15385c51f124SMoriah Waterland /*
15395c51f124SMoriah Waterland * add parent zone info/type
15405c51f124SMoriah Waterland */
15415c51f124SMoriah Waterland
15425c51f124SMoriah Waterland p = z_get_zonename();
15435c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) {
15445c51f124SMoriah Waterland char zn[MAXPATHLEN];
15455c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
15465c51f124SMoriah Waterland "parent-zone-name=%s", p);
15475c51f124SMoriah Waterland arg[nargs++] = "-O";
15485c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
15495c51f124SMoriah Waterland }
15505c51f124SMoriah Waterland
15515c51f124SMoriah Waterland /* current zone type */
15525c51f124SMoriah Waterland
15535c51f124SMoriah Waterland arg[nargs++] = "-O";
15545c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
15555c51f124SMoriah Waterland char zn[MAXPATHLEN];
15565c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
15575c51f124SMoriah Waterland "parent-zone-type=%s",
15585c51f124SMoriah Waterland TAG_VALUE_GLOBAL_ZONE);
15595c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
15605c51f124SMoriah Waterland } else {
15615c51f124SMoriah Waterland char zn[MAXPATHLEN];
15625c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
15635c51f124SMoriah Waterland "parent-zone-type=%s",
15645c51f124SMoriah Waterland TAG_VALUE_NONGLOBAL_ZONE);
15655c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
15665c51f124SMoriah Waterland }
15675c51f124SMoriah Waterland
156862224350SCasper H.S. Dik /* Add arguments how to start the pkgserv */
156962224350SCasper H.S. Dik
157062224350SCasper H.S. Dik arg[nargs++] = "-O";
157162224350SCasper H.S. Dik arg[nargs++] = pkgmodeargument(tmpzone ? RUN_ONCE : pkgservergetmode());
157262224350SCasper H.S. Dik
15735c51f124SMoriah Waterland /* pass -N to pkgremove: program name to report */
15745c51f124SMoriah Waterland
15755c51f124SMoriah Waterland arg[nargs++] = "-N";
15765c51f124SMoriah Waterland arg[nargs++] = get_prog_name();
15775c51f124SMoriah Waterland
15785c51f124SMoriah Waterland /* add package instance name */
15795c51f124SMoriah Waterland
15805c51f124SMoriah Waterland arg[nargs++] = pkginst;
15815c51f124SMoriah Waterland
15825c51f124SMoriah Waterland /* terminate argument list */
15835c51f124SMoriah Waterland
15845c51f124SMoriah Waterland arg[nargs++] = NULL;
15855c51f124SMoriah Waterland
15865c51f124SMoriah Waterland /* execute pkgremove command */
15875c51f124SMoriah Waterland
15885c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
15895c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, a_zoneName, arg[0]);
15905c51f124SMoriah Waterland for (n = 0; arg[n]; n++) {
15915c51f124SMoriah Waterland echoDebug(DBG_ARG, n, arg[n]);
15925c51f124SMoriah Waterland }
15935c51f124SMoriah Waterland }
15945c51f124SMoriah Waterland
15955c51f124SMoriah Waterland /* terminate file descriptor list */
15965c51f124SMoriah Waterland
15975c51f124SMoriah Waterland fds[maxfds] = -1;
15985c51f124SMoriah Waterland
15995c51f124SMoriah Waterland /* exec command in zone */
16005c51f124SMoriah Waterland
16015c51f124SMoriah Waterland n = z_zone_exec(a_zoneName, path, arg, (char *)NULL, (char *)NULL, fds);
16025c51f124SMoriah Waterland
16035c51f124SMoriah Waterland /*
16045c51f124SMoriah Waterland * close any files that were opened for use by the
16055c51f124SMoriah Waterland * /proc/self/fd interface so they could be passed to programs
16065c51f124SMoriah Waterland * via the z_zone_exec() interface
16075c51f124SMoriah Waterland */
16085c51f124SMoriah Waterland
16095c51f124SMoriah Waterland for (; maxfds > 0; maxfds--) {
16105c51f124SMoriah Waterland (void) close(fds[maxfds-1]);
16115c51f124SMoriah Waterland }
16125c51f124SMoriah Waterland
16135c51f124SMoriah Waterland return (n);
16145c51f124SMoriah Waterland }
16155c51f124SMoriah Waterland
16165c51f124SMoriah Waterland /*
16175c51f124SMoriah Waterland * Name: pkgRemove
16185c51f124SMoriah Waterland * Description: Invoke pkgremove in the current zone to perform a remove
16195c51f124SMoriah Waterland * of a single package from the current zone or standalone system
16205c51f124SMoriah Waterland * Arguments: a_nodelete: should the files and scripts remain installed?
16215c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
16225c51f124SMoriah Waterland * the removal of any files and any class action scripts
16235c51f124SMoriah Waterland * and suppress the running of any class action scripts.
16245c51f124SMoriah Waterland * The package files remain but the package looks like it
16255c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
16265c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
16275c51f124SMoriah Waterland * files and class action scripts are removed, and any
16285c51f124SMoriah Waterland * appropriate class action scripts are run.
16295c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
16305c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
16315c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
16325c51f124SMoriah Waterland * a_adminFile - pointer to string representing the admin
16335c51f124SMoriah Waterland * file to pass to pkgremove when removing the package.
16345c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkgremove.
16355c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
16365c51f124SMoriah Waterland * 0 - success
16375c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
16385c51f124SMoriah Waterland * 2 - non-fatal error (warning)
16395c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
16405c51f124SMoriah Waterland * 4 - admin settings prevented operation
16415c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
16425c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
16435c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
16445c51f124SMoriah Waterland */
16455c51f124SMoriah Waterland
16465c51f124SMoriah Waterland static int
pkgRemove(int a_nodelete,char * a_altBinDir,char * a_adminFile)1647*6e1ae2a3SGary Pennington pkgRemove(int a_nodelete, char *a_altBinDir, char *a_adminFile)
16485c51f124SMoriah Waterland {
16495c51f124SMoriah Waterland char *arg[MAXARGS];
16505c51f124SMoriah Waterland char *p;
16515c51f124SMoriah Waterland char path[PATH_MAX];
16525c51f124SMoriah Waterland int n;
16535c51f124SMoriah Waterland int nargs;
16545c51f124SMoriah Waterland
16555c51f124SMoriah Waterland /* entry debugging info */
16565c51f124SMoriah Waterland
16575c51f124SMoriah Waterland echoDebug(DBG_PKGREMOVE_ENTRY);
16585c51f124SMoriah Waterland echoDebug(DBG_PKGREMOVE_ARGS, PSTR(pkginst), PSTR(pkgdev.dirname),
16595c51f124SMoriah Waterland a_nodelete, PSTR(a_adminFile));
16605c51f124SMoriah Waterland
16615c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/pkgremove",
16625c51f124SMoriah Waterland a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
16635c51f124SMoriah Waterland
16645c51f124SMoriah Waterland nargs = 0;
16655c51f124SMoriah Waterland
16665c51f124SMoriah Waterland /* first argument is path to executable */
16675c51f124SMoriah Waterland
16685c51f124SMoriah Waterland arg[nargs++] = strdup(path);
16695c51f124SMoriah Waterland
16705c51f124SMoriah Waterland /* second argument is always: pass -O debug to pkgremove: debug mode */
16715c51f124SMoriah Waterland
16725c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
16735c51f124SMoriah Waterland arg[nargs++] = "-O";
16745c51f124SMoriah Waterland arg[nargs++] = "debug";
16755c51f124SMoriah Waterland }
16765c51f124SMoriah Waterland
167762224350SCasper H.S. Dik /* Add arguments how to start the pkgserv */
167862224350SCasper H.S. Dik
167962224350SCasper H.S. Dik arg[nargs++] = "-O";
168062224350SCasper H.S. Dik arg[nargs++] = pkgmodeargument(pkgservergetmode());
168162224350SCasper H.S. Dik
16825c51f124SMoriah Waterland /* pkgrm -b dir: pass -b to pkgremove */
16835c51f124SMoriah Waterland
16845c51f124SMoriah Waterland if (a_altBinDir != (char *)NULL) {
16855c51f124SMoriah Waterland arg[nargs++] = "-b";
16865c51f124SMoriah Waterland arg[nargs++] = a_altBinDir;
16875c51f124SMoriah Waterland }
16885c51f124SMoriah Waterland
16895c51f124SMoriah Waterland /*
16905c51f124SMoriah Waterland * NONABI_SCRIPTS defined: pass -o to pkgremove; refers to a
16915c51f124SMoriah Waterland * pkg requiring operator interaction during a procedure script
16925c51f124SMoriah Waterland * (common before on1093)
16935c51f124SMoriah Waterland */
16945c51f124SMoriah Waterland
16955c51f124SMoriah Waterland if (old_pkg) {
16965c51f124SMoriah Waterland arg[nargs++] = "-o";
16975c51f124SMoriah Waterland }
16985c51f124SMoriah Waterland
16995c51f124SMoriah Waterland /*
17005c51f124SMoriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkgremove; process
17015c51f124SMoriah Waterland * symlinks consistent with old behavior
17025c51f124SMoriah Waterland */
17035c51f124SMoriah Waterland
17045c51f124SMoriah Waterland if (old_symlinks) {
17055c51f124SMoriah Waterland arg[nargs++] = "-y";
17065c51f124SMoriah Waterland }
17075c51f124SMoriah Waterland
17085c51f124SMoriah Waterland /* pkgrm -M: pass -M to pkgrm: dont mount client file systems */
17095c51f124SMoriah Waterland
17105c51f124SMoriah Waterland if (no_map_client) {
17115c51f124SMoriah Waterland arg[nargs++] = "-M";
17125c51f124SMoriah Waterland }
17135c51f124SMoriah Waterland
17145c51f124SMoriah Waterland /* pkgrm -A: pass -A to pkgrm */
17155c51f124SMoriah Waterland
17165c51f124SMoriah Waterland if (pkgrmremote) {
17175c51f124SMoriah Waterland arg[nargs++] = "-A";
17185c51f124SMoriah Waterland }
17195c51f124SMoriah Waterland
17205c51f124SMoriah Waterland /* pkgrm -v: pass -v to pkgremove: trace scripts */
17215c51f124SMoriah Waterland
17225c51f124SMoriah Waterland if (pkgverbose) {
17235c51f124SMoriah Waterland arg[nargs++] = "-v";
17245c51f124SMoriah Waterland }
17255c51f124SMoriah Waterland
17265c51f124SMoriah Waterland /* pkgrm -n: pass -n to pkgremove: noninteractive mode */
17275c51f124SMoriah Waterland
17285c51f124SMoriah Waterland if (nointeract) {
17295c51f124SMoriah Waterland arg[nargs++] = "-n";
17305c51f124SMoriah Waterland }
17315c51f124SMoriah Waterland
17325c51f124SMoriah Waterland /* pkgrm -a admin: pass -a admin to pkgremove: admin file */
17335c51f124SMoriah Waterland
17345c51f124SMoriah Waterland if (a_adminFile) {
17355c51f124SMoriah Waterland arg[nargs++] = "-a";
17365c51f124SMoriah Waterland arg[nargs++] = strdup(a_adminFile);
17375c51f124SMoriah Waterland }
17385c51f124SMoriah Waterland
17395c51f124SMoriah Waterland /* pkgrm -V vfstab: pass -V vfstab to pkgremove: alternate vfstab */
17405c51f124SMoriah Waterland
17415c51f124SMoriah Waterland if (vfstab_file) {
17425c51f124SMoriah Waterland arg[nargs++] = "-V";
17435c51f124SMoriah Waterland arg[nargs++] = vfstab_file;
17445c51f124SMoriah Waterland }
17455c51f124SMoriah Waterland
17465c51f124SMoriah Waterland /* pkgrm -R root: pass -R root to pkgremove: alternative root */
17475c51f124SMoriah Waterland
17485c51f124SMoriah Waterland if (is_an_inst_root()) {
17495c51f124SMoriah Waterland arg[nargs++] = "-R";
17505c51f124SMoriah Waterland arg[nargs++] = get_inst_root();
17515c51f124SMoriah Waterland }
17525c51f124SMoriah Waterland
17535c51f124SMoriah Waterland /* pkgrm -F: pass -F to pkgremove: update DB only */
17545c51f124SMoriah Waterland
17555c51f124SMoriah Waterland if (a_nodelete) {
17565c51f124SMoriah Waterland arg[nargs++] = "-F";
17575c51f124SMoriah Waterland }
17585c51f124SMoriah Waterland
17595c51f124SMoriah Waterland /*
17605c51f124SMoriah Waterland * add parent zone info/type
17615c51f124SMoriah Waterland */
17625c51f124SMoriah Waterland
17635c51f124SMoriah Waterland p = z_get_zonename();
17645c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) {
17655c51f124SMoriah Waterland char zn[MAXPATHLEN];
17665c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
17675c51f124SMoriah Waterland "parent-zone-name=%s", p);
17685c51f124SMoriah Waterland arg[nargs++] = "-O";
17695c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
17705c51f124SMoriah Waterland }
17715c51f124SMoriah Waterland
17725c51f124SMoriah Waterland /* current zone type */
17735c51f124SMoriah Waterland
17745c51f124SMoriah Waterland arg[nargs++] = "-O";
17755c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
17765c51f124SMoriah Waterland char zn[MAXPATHLEN];
17775c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
17785c51f124SMoriah Waterland "parent-zone-type=%s",
17795c51f124SMoriah Waterland TAG_VALUE_GLOBAL_ZONE);
17805c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
17815c51f124SMoriah Waterland } else {
17825c51f124SMoriah Waterland char zn[MAXPATHLEN];
17835c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
17845c51f124SMoriah Waterland "parent-zone-type=%s",
17855c51f124SMoriah Waterland TAG_VALUE_NONGLOBAL_ZONE);
17865c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
17875c51f124SMoriah Waterland }
17885c51f124SMoriah Waterland
17895c51f124SMoriah Waterland /* pass -N to pkgremove: program name to report */
17905c51f124SMoriah Waterland
17915c51f124SMoriah Waterland arg[nargs++] = "-N";
17925c51f124SMoriah Waterland arg[nargs++] = get_prog_name();
17935c51f124SMoriah Waterland
17945c51f124SMoriah Waterland /* add package instance name */
17955c51f124SMoriah Waterland
17965c51f124SMoriah Waterland arg[nargs++] = pkginst;
17975c51f124SMoriah Waterland
17985c51f124SMoriah Waterland /* terminate argument list */
17995c51f124SMoriah Waterland
18005c51f124SMoriah Waterland arg[nargs++] = NULL;
18015c51f124SMoriah Waterland
18025c51f124SMoriah Waterland /*
18035c51f124SMoriah Waterland * run the appropriate pkgremove command in the specified zone
18045c51f124SMoriah Waterland */
18055c51f124SMoriah Waterland
18065c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
18075c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, "global", arg[0]);
18085c51f124SMoriah Waterland for (n = 0; arg[n]; n++) {
18095c51f124SMoriah Waterland echoDebug(DBG_ARG, n, arg[n]);
18105c51f124SMoriah Waterland }
18115c51f124SMoriah Waterland }
18125c51f124SMoriah Waterland
18135c51f124SMoriah Waterland /* execute pkgremove command */
18145c51f124SMoriah Waterland
18155c51f124SMoriah Waterland n = pkgexecv(NULL, NULL, NULL, NULL, arg);
18165c51f124SMoriah Waterland
18175c51f124SMoriah Waterland /* return results of pkgrm in this zone */
18185c51f124SMoriah Waterland
18195c51f124SMoriah Waterland return (n);
18205c51f124SMoriah Waterland }
18215c51f124SMoriah Waterland
18225c51f124SMoriah Waterland static void
usage(void)18235c51f124SMoriah Waterland usage(void)
18245c51f124SMoriah Waterland {
18255c51f124SMoriah Waterland char *prog = get_prog_name();
18265c51f124SMoriah Waterland
18275c51f124SMoriah Waterland (void) fprintf(stderr, ERR_USAGE_PKGRM, prog, prog);
18285c51f124SMoriah Waterland exit(1);
18295c51f124SMoriah Waterland }
18305c51f124SMoriah Waterland
18315c51f124SMoriah Waterland /*
18325c51f124SMoriah Waterland * Name: remove_packages_in_global_with_zones
18335c51f124SMoriah Waterland * Description: Remove packages from the global zone and from non-global zones
18345c51f124SMoriah Waterland * when run from the global zone and when non-global zones are
18355c51f124SMoriah Waterland * present.
18365c51f124SMoriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
18375c51f124SMoriah Waterland * the name of one package to be removed.
18385c51f124SMoriah Waterland * a_nodelete: should the files and scripts remain installed?
18395c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
18405c51f124SMoriah Waterland * the removal of any files and any class action scripts
18415c51f124SMoriah Waterland * and suppress the running of any class action scripts.
18425c51f124SMoriah Waterland * The package files remain but the package looks like it
18435c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
18445c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
18455c51f124SMoriah Waterland * files and class action scripts are removed, and any
18465c51f124SMoriah Waterland * appropriate class action scripts are run.
18475c51f124SMoriah Waterland * a_longestPkg - length of the longest package "name" (for
18485c51f124SMoriah Waterland * output format alignment)
18495c51f124SMoriah Waterland * a_repeat - are there more packages avialable in "optind"
18505c51f124SMoriah Waterland * - B_TRUE - process packages from optind
18515c51f124SMoriah Waterland * - B_FALSE - do not process packages from optind
18525c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
18535c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
18545c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
18555c51f124SMoriah Waterland * a_pkgdir - pointer to string representing the directory
18565c51f124SMoriah Waterland * where the packages to be removed are located.
18575c51f124SMoriah Waterland * a_zlst - list of zones to process; NULL if no zones to process.
18585c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
18595c51f124SMoriah Waterland * 0 - success
18605c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
18615c51f124SMoriah Waterland * 2 - non-fatal error (warning)
18625c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
18635c51f124SMoriah Waterland * 4 - admin settings prevented operation
18645c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
18655c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
18665c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
18675c51f124SMoriah Waterland */
18685c51f124SMoriah Waterland
18695c51f124SMoriah Waterland static boolean_t
remove_packages_in_global_with_zones(char ** a_pkgList,int a_nodelete,int a_longestPkg,int a_repeat,char * a_altBinDir,char * a_pkgdir,zoneList_t a_zlst)18705c51f124SMoriah Waterland remove_packages_in_global_with_zones(char **a_pkgList, int a_nodelete,
18715c51f124SMoriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir, char *a_pkgdir,
18725c51f124SMoriah Waterland zoneList_t a_zlst)
18735c51f124SMoriah Waterland {
18745c51f124SMoriah Waterland static char *zoneAdminFile = (char *)NULL;
18755c51f124SMoriah Waterland
18765c51f124SMoriah Waterland boolean_t b;
18775c51f124SMoriah Waterland char *zoneName;
18785c51f124SMoriah Waterland char *scratchName;
18795c51f124SMoriah Waterland char preremovecheckPath[PATH_MAX+1];
18805c51f124SMoriah Waterland int i;
18815c51f124SMoriah Waterland int n;
18825c51f124SMoriah Waterland int savenpkgs = npkgs;
18835c51f124SMoriah Waterland int zoneIndex;
18845c51f124SMoriah Waterland int zonesSkipped;
18855c51f124SMoriah Waterland zone_state_t zst;
18865c51f124SMoriah Waterland
18875c51f124SMoriah Waterland /* entry assertions */
18885c51f124SMoriah Waterland
18895c51f124SMoriah Waterland assert(a_zlst != (zoneList_t)NULL);
18905c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
18915c51f124SMoriah Waterland assert(a_longestPkg > 0);
18925c51f124SMoriah Waterland assert(a_pkgdir != (char *)NULL);
18935c51f124SMoriah Waterland assert(*a_pkgdir != '\0');
18945c51f124SMoriah Waterland
18955c51f124SMoriah Waterland /* entry debugging info */
18965c51f124SMoriah Waterland
18975c51f124SMoriah Waterland echoDebug(DBG_PKGREMPKGSGZWNGZ_ENTRY);
18985c51f124SMoriah Waterland echoDebug(DBG_PKGREMPKGSGZWNGZ_ARGS, a_nodelete, a_longestPkg,
18995c51f124SMoriah Waterland a_repeat, PSTR(a_altBinDir), PSTR(a_pkgdir));
19005c51f124SMoriah Waterland
19015c51f124SMoriah Waterland /* check all packages */
19025c51f124SMoriah Waterland
19035c51f124SMoriah Waterland if (check_packages(a_pkgList, a_pkgdir) != B_TRUE) {
19045c51f124SMoriah Waterland quit(1);
19055c51f124SMoriah Waterland }
19065c51f124SMoriah Waterland
19075c51f124SMoriah Waterland /* create temporary directory for use by zone operations */
19085c51f124SMoriah Waterland
19095c51f124SMoriah Waterland create_zone_tempdir(&zoneTempDir, tmpdir);
19105c51f124SMoriah Waterland
19115c51f124SMoriah Waterland /* create hands off settings admin file for use in a non-global zone */
19125c51f124SMoriah Waterland
19135c51f124SMoriah Waterland create_zone_adminfile(&zoneAdminFile, zoneTempDir, admnfile);
19145c51f124SMoriah Waterland
19155c51f124SMoriah Waterland /*
19165c51f124SMoriah Waterland * all of the packages (as listed in the package list) are
19175c51f124SMoriah Waterland * removed one at a time from all non-global zones and then
19185c51f124SMoriah Waterland * from the global zone.
19195c51f124SMoriah Waterland */
19205c51f124SMoriah Waterland
19215c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
19225c51f124SMoriah Waterland /* reset interrupted flag before calling pkgremove */
19235c51f124SMoriah Waterland
19245c51f124SMoriah Waterland interrupted = 0; /* last action was NOT quit */
19255c51f124SMoriah Waterland
19265c51f124SMoriah Waterland /* skip package if it is "in the global zone only" */
19275c51f124SMoriah Waterland
19285c51f124SMoriah Waterland if (pkgIsPkgInGzOnly(get_inst_root(), pkginst) == B_TRUE) {
19295c51f124SMoriah Waterland continue;
19305c51f124SMoriah Waterland }
19315c51f124SMoriah Waterland
19325c51f124SMoriah Waterland /*
19335c51f124SMoriah Waterland * if operation failed in global zone do not propagate to
19345c51f124SMoriah Waterland * non-global zones
19355c51f124SMoriah Waterland */
19365c51f124SMoriah Waterland
19375c51f124SMoriah Waterland zonesSkipped = 0;
19385c51f124SMoriah Waterland
19395c51f124SMoriah Waterland if (interrupted != 0) {
19405c51f124SMoriah Waterland echo(MSG_DOREMOVE_INTERRUPTED, pkginst);
19415c51f124SMoriah Waterland echoDebug(DBG_DOREMOVE_INTERRUPTED, pkginst);
19425c51f124SMoriah Waterland break;
19435c51f124SMoriah Waterland }
19445c51f124SMoriah Waterland
19455c51f124SMoriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "before loop",
19465c51f124SMoriah Waterland admnflag, doreboot, failflag, interrupted,
19475c51f124SMoriah Waterland intrflag, ireboot, nullflag, warnflag);
19485c51f124SMoriah Waterland
19495c51f124SMoriah Waterland for (zoneIndex = 0;
19505c51f124SMoriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) !=
19515c51f124SMoriah Waterland (char *)NULL; zoneIndex++) {
19525c51f124SMoriah Waterland
19535c51f124SMoriah Waterland /* skip the zone if it is NOT running */
19545c51f124SMoriah Waterland
19555c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
19565c51f124SMoriah Waterland if (zst != ZONE_STATE_RUNNING &&
19575c51f124SMoriah Waterland zst != ZONE_STATE_MOUNTED) {
19585c51f124SMoriah Waterland zonesSkipped++;
19595c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE, zoneName);
19605c51f124SMoriah Waterland continue;
19615c51f124SMoriah Waterland }
19625c51f124SMoriah Waterland
19635c51f124SMoriah Waterland echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
19645c51f124SMoriah Waterland echoDebug(DBG_CHECKREMOVE_PKG_IN_ZONE, pkginst,
19655c51f124SMoriah Waterland zoneName);
19665c51f124SMoriah Waterland
19675c51f124SMoriah Waterland scratchName = z_zlist_get_scratch(a_zlst, zoneIndex);
19685c51f124SMoriah Waterland
19695c51f124SMoriah Waterland (void) snprintf(preremovecheckPath,
19705c51f124SMoriah Waterland sizeof (preremovecheckPath),
19715c51f124SMoriah Waterland "%s/%s.%s.preremovecheck.txt",
19725c51f124SMoriah Waterland zoneTempDir, pkginst, scratchName);
19735c51f124SMoriah Waterland
19745c51f124SMoriah Waterland /*
19755c51f124SMoriah Waterland * dependency check this package this zone; use the
19765c51f124SMoriah Waterland * user supplied admin file so that the appropriate
19775c51f124SMoriah Waterland * level of dependency checking is (or is not) done.
19785c51f124SMoriah Waterland */
19795c51f124SMoriah Waterland
1980*6e1ae2a3SGary Pennington n = pkgZoneCheckRemove(scratchName, a_altBinDir,
1981*6e1ae2a3SGary Pennington admnfile, preremovecheckPath,
198262224350SCasper H.S. Dik zst, B_FALSE);
19835c51f124SMoriah Waterland
19845c51f124SMoriah Waterland /* set success/fail condition variables */
19855c51f124SMoriah Waterland
19865c51f124SMoriah Waterland ckreturn(n);
19875c51f124SMoriah Waterland
19885c51f124SMoriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES,
19895c51f124SMoriah Waterland "after pkgzonecheckremove",
19905c51f124SMoriah Waterland admnflag, doreboot, failflag, interrupted,
19915c51f124SMoriah Waterland intrflag, ireboot, nullflag, warnflag);
19925c51f124SMoriah Waterland }
19935c51f124SMoriah Waterland
19945c51f124SMoriah Waterland if (zonesSkipped == 0) {
19955c51f124SMoriah Waterland continue;
19965c51f124SMoriah Waterland }
19975c51f124SMoriah Waterland
19985c51f124SMoriah Waterland echoDebug(DBG_ZONES_SKIPPED, zonesSkipped);
19995c51f124SMoriah Waterland
20005c51f124SMoriah Waterland for (zoneIndex = 0;
20015c51f124SMoriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) !=
20025c51f124SMoriah Waterland (char *)NULL; zoneIndex++) {
20035c51f124SMoriah Waterland
20045c51f124SMoriah Waterland /* skip the zone if it IS running */
20055c51f124SMoriah Waterland
20065c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
20075c51f124SMoriah Waterland if (zst == ZONE_STATE_RUNNING ||
20085c51f124SMoriah Waterland zst == ZONE_STATE_MOUNTED) {
20095c51f124SMoriah Waterland zonesSkipped++;
20105c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_BOOT, zoneName);
20115c51f124SMoriah Waterland continue;
20125c51f124SMoriah Waterland }
20135c51f124SMoriah Waterland
20145c51f124SMoriah Waterland /* skip the zone if it is NOT bootable */
20155c51f124SMoriah Waterland
20165c51f124SMoriah Waterland if (z_zlist_is_zone_runnable(a_zlst,
20175c51f124SMoriah Waterland zoneIndex) == B_FALSE) {
20185c51f124SMoriah Waterland echo(MSG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
20195c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_NOT_RUNNABLE,
20205c51f124SMoriah Waterland zoneName);
20215c51f124SMoriah Waterland continue;
20225c51f124SMoriah Waterland }
20235c51f124SMoriah Waterland
20245c51f124SMoriah Waterland /* mount up the zone */
20255c51f124SMoriah Waterland
20265c51f124SMoriah Waterland echo(MSG_BOOTING_ZONE, zoneName);
20275c51f124SMoriah Waterland echoDebug(DBG_BOOTING_ZONE, zoneName);
20285c51f124SMoriah Waterland
20295c51f124SMoriah Waterland b = z_zlist_change_zone_state(a_zlst, zoneIndex,
20305c51f124SMoriah Waterland ZONE_STATE_MOUNTED);
20315c51f124SMoriah Waterland if (b == B_FALSE) {
20325c51f124SMoriah Waterland progerr(ERR_CANNOT_BOOT_ZONE, zoneName);
20335c51f124SMoriah Waterland /* set fatal error return condition */
20345c51f124SMoriah Waterland ckreturn(1);
20355c51f124SMoriah Waterland continue;
20365c51f124SMoriah Waterland }
20375c51f124SMoriah Waterland
20385c51f124SMoriah Waterland echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
20395c51f124SMoriah Waterland echoDebug(DBG_CHECKREMOVE_PKG_IN_ZONE, pkginst,
20405c51f124SMoriah Waterland zoneName);
20415c51f124SMoriah Waterland
20425c51f124SMoriah Waterland scratchName = z_zlist_get_scratch(a_zlst, zoneIndex);
20435c51f124SMoriah Waterland
20445c51f124SMoriah Waterland (void) snprintf(preremovecheckPath,
20455c51f124SMoriah Waterland sizeof (preremovecheckPath),
20465c51f124SMoriah Waterland "%s/%s.%s.preremovecheck.txt",
20475c51f124SMoriah Waterland zoneTempDir, pkginst, scratchName);
20485c51f124SMoriah Waterland
20495c51f124SMoriah Waterland /*
20505c51f124SMoriah Waterland * dependency check this package this zone; use the
20515c51f124SMoriah Waterland * user supplied admin file so that the appropriate
20525c51f124SMoriah Waterland * level of dependency checking is (or is not) done.
20535c51f124SMoriah Waterland */
20545c51f124SMoriah Waterland
2055*6e1ae2a3SGary Pennington n = pkgZoneCheckRemove(scratchName, a_altBinDir,
2056*6e1ae2a3SGary Pennington admnfile, preremovecheckPath,
205762224350SCasper H.S. Dik ZONE_STATE_MOUNTED, B_TRUE);
20585c51f124SMoriah Waterland
20595c51f124SMoriah Waterland /* set success/fail condition variables */
20605c51f124SMoriah Waterland
20615c51f124SMoriah Waterland ckreturn(n);
20625c51f124SMoriah Waterland
20635c51f124SMoriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES,
20645c51f124SMoriah Waterland "after pkgzonecheckremove",
20655c51f124SMoriah Waterland admnflag, doreboot, failflag, interrupted,
20665c51f124SMoriah Waterland intrflag, ireboot, nullflag, warnflag);
20675c51f124SMoriah Waterland
20685c51f124SMoriah Waterland /* restore original state of zone */
20695c51f124SMoriah Waterland
20705c51f124SMoriah Waterland echo(MSG_RESTORE_ZONE_STATE, zoneName);
20715c51f124SMoriah Waterland echoDebug(DBG_RESTORE_ZONE_STATE, zoneName);
20725c51f124SMoriah Waterland
20735c51f124SMoriah Waterland b = z_zlist_restore_zone_state(a_zlst, zoneIndex);
20745c51f124SMoriah Waterland }
20755c51f124SMoriah Waterland npkgs--;
20765c51f124SMoriah Waterland }
20775c51f124SMoriah Waterland
20785c51f124SMoriah Waterland /*
20795c51f124SMoriah Waterland * look at all pre-remove check files
20805c51f124SMoriah Waterland */
20815c51f124SMoriah Waterland
20825c51f124SMoriah Waterland i = preremove_verify(a_pkgList, a_zlst, zoneTempDir);
20835c51f124SMoriah Waterland if (i != 0) {
20845c51f124SMoriah Waterland quit(i);
20855c51f124SMoriah Waterland }
20865c51f124SMoriah Waterland
20875c51f124SMoriah Waterland npkgs = savenpkgs;
20885c51f124SMoriah Waterland
20895c51f124SMoriah Waterland /*
20905c51f124SMoriah Waterland * reset all error return condition variables that may have been
20915c51f124SMoriah Waterland * set during package removal dependency checking so that they
20925c51f124SMoriah Waterland * do not reflect on the success/failure of the actual package
20935c51f124SMoriah Waterland * removal operations
20945c51f124SMoriah Waterland */
20955c51f124SMoriah Waterland
20965c51f124SMoriah Waterland resetreturn();
20975c51f124SMoriah Waterland
20985c51f124SMoriah Waterland /*
20995c51f124SMoriah Waterland * all of the packages (as listed in the package list) are
21005c51f124SMoriah Waterland * removed one at a time.
21015c51f124SMoriah Waterland */
21025c51f124SMoriah Waterland
21035c51f124SMoriah Waterland interrupted = 0;
21045c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
21055c51f124SMoriah Waterland boolean_t in_gz_only;
21065c51f124SMoriah Waterland started = 0;
21075c51f124SMoriah Waterland
21085c51f124SMoriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
21095c51f124SMoriah Waterland continue;
21105c51f124SMoriah Waterland }
21115c51f124SMoriah Waterland
21125c51f124SMoriah Waterland in_gz_only = pkgIsPkgInGzOnly(get_inst_root(), pkginst);
21135c51f124SMoriah Waterland
21145c51f124SMoriah Waterland /* reset interrupted flag before calling pkgremove */
21155c51f124SMoriah Waterland
21165c51f124SMoriah Waterland interrupted = 0;
21175c51f124SMoriah Waterland
21185c51f124SMoriah Waterland /*
21195c51f124SMoriah Waterland * pkgrm invoked from within the global zone and there are
21205c51f124SMoriah Waterland * non-global zones configured:
21215c51f124SMoriah Waterland * Remove the package from the global zone.
21225c51f124SMoriah Waterland * If not removing the package from the global zone only,
21235c51f124SMoriah Waterland * then remove the package from the list of zones specified.
21245c51f124SMoriah Waterland */
21255c51f124SMoriah Waterland
21265c51f124SMoriah Waterland if (in_gz_only) {
21275c51f124SMoriah Waterland /* global zone only */
21285c51f124SMoriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
21295c51f124SMoriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
21305c51f124SMoriah Waterland } else {
21315c51f124SMoriah Waterland /* global zone and non-global zones */
21325c51f124SMoriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
21335c51f124SMoriah Waterland zoneAdminFile, zoneAdminFile, a_zlst);
21345c51f124SMoriah Waterland }
21355c51f124SMoriah Waterland
21365c51f124SMoriah Waterland /* set success/fail condition variables */
21375c51f124SMoriah Waterland
21385c51f124SMoriah Waterland ckreturn(n);
21395c51f124SMoriah Waterland
21405c51f124SMoriah Waterland npkgs--;
21415c51f124SMoriah Waterland }
21425c51f124SMoriah Waterland
21435c51f124SMoriah Waterland /*
21445c51f124SMoriah Waterland * all packages in the package list have been removed.
21455c51f124SMoriah Waterland * Continue with removal if:
21465c51f124SMoriah Waterland * -- immediate reboot is NOT required
21475c51f124SMoriah Waterland * -- there are more packages to remove
21485c51f124SMoriah Waterland * else return do NOT continue.
21495c51f124SMoriah Waterland */
21505c51f124SMoriah Waterland
21515c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
21525c51f124SMoriah Waterland return (B_TRUE);
21535c51f124SMoriah Waterland }
21545c51f124SMoriah Waterland
21555c51f124SMoriah Waterland /* return 'dont continue' */
21565c51f124SMoriah Waterland
21575c51f124SMoriah Waterland return (B_FALSE);
21585c51f124SMoriah Waterland }
21595c51f124SMoriah Waterland
21605c51f124SMoriah Waterland /*
21615c51f124SMoriah Waterland * Name: remove_packages_in_nonglobal_zone
21625c51f124SMoriah Waterland * Description: Remove packages in a non-global zone when run from a
21635c51f124SMoriah Waterland * non-global zone.
21645c51f124SMoriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
21655c51f124SMoriah Waterland * the name of one package to be removed.
21665c51f124SMoriah Waterland * a_nodelete: should the files and scripts remain installed?
21675c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
21685c51f124SMoriah Waterland * the removal of any files and any class action scripts
21695c51f124SMoriah Waterland * and suppress the running of any class action scripts.
21705c51f124SMoriah Waterland * The package files remain but the package looks like it
21715c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
21725c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
21735c51f124SMoriah Waterland * files and class action scripts are removed, and any
21745c51f124SMoriah Waterland * appropriate class action scripts are run.
21755c51f124SMoriah Waterland * a_longestPkg - length of the longest package "name" (for
21765c51f124SMoriah Waterland * output format alignment)
21775c51f124SMoriah Waterland * a_repeat - are there more packages avialable in "optind"
21785c51f124SMoriah Waterland * - B_TRUE - process packages from optind
21795c51f124SMoriah Waterland * - B_FALSE - do not process packages from optind
21805c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
21815c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
21825c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
21835c51f124SMoriah Waterland * a_pkgdir - pointer to string representing the directory
21845c51f124SMoriah Waterland * where the packages to be removed are located.
21855c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
21865c51f124SMoriah Waterland * 0 - success
21875c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
21885c51f124SMoriah Waterland * 2 - non-fatal error (warning)
21895c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
21905c51f124SMoriah Waterland * 4 - admin settings prevented operation
21915c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
21925c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
21935c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
21945c51f124SMoriah Waterland */
21955c51f124SMoriah Waterland
21965c51f124SMoriah Waterland static boolean_t
remove_packages_in_nonglobal_zone(char ** a_pkgList,int a_nodelete,int a_longestPkg,int a_repeat,char * a_altBinDir,char * a_pkgdir)21975c51f124SMoriah Waterland remove_packages_in_nonglobal_zone(char **a_pkgList, int a_nodelete,
21985c51f124SMoriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir, char *a_pkgdir)
21995c51f124SMoriah Waterland {
22005c51f124SMoriah Waterland static char *zoneAdminFile = (char *)NULL;
22015c51f124SMoriah Waterland
22025c51f124SMoriah Waterland int n;
22035c51f124SMoriah Waterland int i;
22045c51f124SMoriah Waterland
22055c51f124SMoriah Waterland /* entry assertions */
22065c51f124SMoriah Waterland
22075c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
22085c51f124SMoriah Waterland assert(a_longestPkg > 0);
22095c51f124SMoriah Waterland assert(a_pkgdir != (char *)NULL);
22105c51f124SMoriah Waterland assert(*a_pkgdir != '\0');
22115c51f124SMoriah Waterland
22125c51f124SMoriah Waterland /* entry debugging info */
22135c51f124SMoriah Waterland
22145c51f124SMoriah Waterland echoDebug(DBG_PKGREMPKGSNGZ_ENTRY);
22155c51f124SMoriah Waterland echoDebug(DBG_PKGREMPKGSNGZ_ARGS, a_nodelete, a_longestPkg,
22165c51f124SMoriah Waterland a_repeat, PSTR(a_altBinDir), PSTR(a_pkgdir));
22175c51f124SMoriah Waterland
22185c51f124SMoriah Waterland /* check all package */
22195c51f124SMoriah Waterland
22205c51f124SMoriah Waterland if (check_packages(a_pkgList, a_pkgdir) != B_TRUE) {
22215c51f124SMoriah Waterland quit(1);
22225c51f124SMoriah Waterland }
22235c51f124SMoriah Waterland
22245c51f124SMoriah Waterland /* create temporary directory for use by zone operations */
22255c51f124SMoriah Waterland
22265c51f124SMoriah Waterland create_zone_tempdir(&zoneTempDir, tmpdir);
22275c51f124SMoriah Waterland
22285c51f124SMoriah Waterland /* create hands off settings admin file for use in a non-global zone */
22295c51f124SMoriah Waterland
22305c51f124SMoriah Waterland create_zone_adminfile(&zoneAdminFile, zoneTempDir, admnfile);
22315c51f124SMoriah Waterland
22325c51f124SMoriah Waterland /*
22335c51f124SMoriah Waterland * all of the packages (as listed in the package list) are
22345c51f124SMoriah Waterland * removed one at a time.
22355c51f124SMoriah Waterland */
22365c51f124SMoriah Waterland
22375c51f124SMoriah Waterland interrupted = 0;
22385c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
22395c51f124SMoriah Waterland started = 0;
22405c51f124SMoriah Waterland
22415c51f124SMoriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
22425c51f124SMoriah Waterland continue;
22435c51f124SMoriah Waterland }
22445c51f124SMoriah Waterland
22455c51f124SMoriah Waterland interrupted = 0;
22465c51f124SMoriah Waterland
22475c51f124SMoriah Waterland /*
22485c51f124SMoriah Waterland * pkgrm invoked from within a non-global zone: remove
22495c51f124SMoriah Waterland * the package from the current zone only - no non-global
22505c51f124SMoriah Waterland * zones are possible.
22515c51f124SMoriah Waterland */
22525c51f124SMoriah Waterland
22535c51f124SMoriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
22545c51f124SMoriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
22555c51f124SMoriah Waterland
22565c51f124SMoriah Waterland /* set success/fail condition variables */
22575c51f124SMoriah Waterland
22585c51f124SMoriah Waterland ckreturn(n);
22595c51f124SMoriah Waterland
22605c51f124SMoriah Waterland npkgs--;
22615c51f124SMoriah Waterland }
22625c51f124SMoriah Waterland
22635c51f124SMoriah Waterland /*
22645c51f124SMoriah Waterland * all packages in the package list have been removed.
22655c51f124SMoriah Waterland * Continue with removal if:
22665c51f124SMoriah Waterland * -- immediate reboot is NOT required
22675c51f124SMoriah Waterland * -- there are more packages to remove
22685c51f124SMoriah Waterland * else return do NOT continue.
22695c51f124SMoriah Waterland */
22705c51f124SMoriah Waterland
22715c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
22725c51f124SMoriah Waterland return (B_TRUE);
22735c51f124SMoriah Waterland }
22745c51f124SMoriah Waterland
22755c51f124SMoriah Waterland /* return 'dont continue' */
22765c51f124SMoriah Waterland
22775c51f124SMoriah Waterland return (B_FALSE);
22785c51f124SMoriah Waterland }
22795c51f124SMoriah Waterland
22805c51f124SMoriah Waterland /*
22815c51f124SMoriah Waterland * Name: remove_packages_in_global_no_zones
22825c51f124SMoriah Waterland * Description: Remove packages from the global zone only when run in the
22835c51f124SMoriah Waterland * global zone and no non-global zones are installed.
22845c51f124SMoriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
22855c51f124SMoriah Waterland * the name of one package to be removed.
22865c51f124SMoriah Waterland * a_nodelete: should the files and scripts remain installed?
22875c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
22885c51f124SMoriah Waterland * the removal of any files and any class action scripts
22895c51f124SMoriah Waterland * and suppress the running of any class action scripts.
22905c51f124SMoriah Waterland * The package files remain but the package looks like it
22915c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
22925c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
22935c51f124SMoriah Waterland * files and class action scripts are removed, and any
22945c51f124SMoriah Waterland * appropriate class action scripts are run.
22955c51f124SMoriah Waterland * a_longestPkg - length of the longest package "name" (for
22965c51f124SMoriah Waterland * output format alignment)
22975c51f124SMoriah Waterland * a_repeat - are there more packages avialable in "optind"
22985c51f124SMoriah Waterland * - B_TRUE - process packages from optind
22995c51f124SMoriah Waterland * - B_FALSE - do not process packages from optind
23005c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
23015c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
23025c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
23035c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
23045c51f124SMoriah Waterland * 0 - success
23055c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
23065c51f124SMoriah Waterland * 2 - non-fatal error (warning)
23075c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
23085c51f124SMoriah Waterland * 4 - admin settings prevented operation
23095c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
23105c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
23115c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
23125c51f124SMoriah Waterland */
23135c51f124SMoriah Waterland
23145c51f124SMoriah Waterland static boolean_t
remove_packages_in_global_no_zones(char ** a_pkgList,int a_nodelete,int a_longestPkg,int a_repeat,char * a_altBinDir)23155c51f124SMoriah Waterland remove_packages_in_global_no_zones(char **a_pkgList, int a_nodelete,
23165c51f124SMoriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir)
23175c51f124SMoriah Waterland {
23185c51f124SMoriah Waterland int n;
23195c51f124SMoriah Waterland int i;
23205c51f124SMoriah Waterland
23215c51f124SMoriah Waterland /* entry assertions */
23225c51f124SMoriah Waterland
23235c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
23245c51f124SMoriah Waterland assert(a_longestPkg > 0);
23255c51f124SMoriah Waterland
23265c51f124SMoriah Waterland /* entry debugging info */
23275c51f124SMoriah Waterland
23285c51f124SMoriah Waterland echoDebug(DBG_PKGREMPKGSGZNNGZ_ENTRY);
23295c51f124SMoriah Waterland echoDebug(DBG_PKGREMPKGSGZNNGZ_ARGS, a_nodelete, a_longestPkg,
23305c51f124SMoriah Waterland a_repeat, PSTR(a_altBinDir));
23315c51f124SMoriah Waterland
23325c51f124SMoriah Waterland /*
23335c51f124SMoriah Waterland * all of the packages (as listed in the package list) are
23345c51f124SMoriah Waterland * removed one at a time.
23355c51f124SMoriah Waterland */
23365c51f124SMoriah Waterland
23375c51f124SMoriah Waterland interrupted = 0;
23385c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
23395c51f124SMoriah Waterland started = 0;
23405c51f124SMoriah Waterland
23415c51f124SMoriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
23425c51f124SMoriah Waterland continue;
23435c51f124SMoriah Waterland }
23445c51f124SMoriah Waterland
23455c51f124SMoriah Waterland interrupted = 0;
23465c51f124SMoriah Waterland
23475c51f124SMoriah Waterland /*
23485c51f124SMoriah Waterland * pkgrm invoked from within the global zone and there are
23495c51f124SMoriah Waterland * NO non-global zones configured:
23505c51f124SMoriah Waterland * Remove the package from the global zone only.
23515c51f124SMoriah Waterland */
23525c51f124SMoriah Waterland
23535c51f124SMoriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
23545c51f124SMoriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
23555c51f124SMoriah Waterland
23565c51f124SMoriah Waterland /* set success/fail condition variables */
23575c51f124SMoriah Waterland
23585c51f124SMoriah Waterland ckreturn(n);
23595c51f124SMoriah Waterland
23605c51f124SMoriah Waterland npkgs--;
23615c51f124SMoriah Waterland }
23625c51f124SMoriah Waterland
23635c51f124SMoriah Waterland /*
23645c51f124SMoriah Waterland * all packages in the package list have been removed.
23655c51f124SMoriah Waterland * Continue with removal if:
23665c51f124SMoriah Waterland * -- immediate reboot is NOT required
23675c51f124SMoriah Waterland * -- there are more packages to remove
23685c51f124SMoriah Waterland * else return do NOT continue.
23695c51f124SMoriah Waterland */
23705c51f124SMoriah Waterland
23715c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
23725c51f124SMoriah Waterland return (B_TRUE);
23735c51f124SMoriah Waterland }
23745c51f124SMoriah Waterland
23755c51f124SMoriah Waterland /* return 'dont continue' */
23765c51f124SMoriah Waterland
23775c51f124SMoriah Waterland return (B_FALSE);
23785c51f124SMoriah Waterland }
23795c51f124SMoriah Waterland
23805c51f124SMoriah Waterland /*
23815c51f124SMoriah Waterland * Name: remove_packages_from_spool_directory
23825c51f124SMoriah Waterland * Description: Remove packages from a spool directory only.
23835c51f124SMoriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
23845c51f124SMoriah Waterland * the name of one package to be removed.
23855c51f124SMoriah Waterland * a_nodelete: should the files and scripts remain installed?
23865c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
23875c51f124SMoriah Waterland * the removal of any files and any class action scripts
23885c51f124SMoriah Waterland * and suppress the running of any class action scripts.
23895c51f124SMoriah Waterland * The package files remain but the package looks like it
23905c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
23915c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
23925c51f124SMoriah Waterland * files and class action scripts are removed, and any
23935c51f124SMoriah Waterland * appropriate class action scripts are run.
23945c51f124SMoriah Waterland * a_longestPkg - length of the longest package "name" (for
23955c51f124SMoriah Waterland * output format alignment)
23965c51f124SMoriah Waterland * a_repeat - are there more packages avialable in "optind"
23975c51f124SMoriah Waterland * - B_TRUE - process packages from optind
23985c51f124SMoriah Waterland * - B_FALSE - do not process packages from optind
23995c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
24005c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
24015c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
24025c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
24035c51f124SMoriah Waterland * 0 - success
24045c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
24055c51f124SMoriah Waterland * 2 - non-fatal error (warning)
24065c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
24075c51f124SMoriah Waterland * 4 - admin settings prevented operation
24085c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
24095c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
24105c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
24115c51f124SMoriah Waterland */
24125c51f124SMoriah Waterland
24135c51f124SMoriah Waterland static boolean_t
remove_packages_from_spool_directory(char ** a_pkgList,int a_nodelete,int a_longestPkg,int a_repeat,char * a_altBinDir)24145c51f124SMoriah Waterland remove_packages_from_spool_directory(char **a_pkgList, int a_nodelete,
24155c51f124SMoriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir)
24165c51f124SMoriah Waterland {
24175c51f124SMoriah Waterland int n;
24185c51f124SMoriah Waterland int i;
24195c51f124SMoriah Waterland
24205c51f124SMoriah Waterland /* entry assertions */
24215c51f124SMoriah Waterland
24225c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
24235c51f124SMoriah Waterland assert(a_longestPkg > 0);
24245c51f124SMoriah Waterland
24255c51f124SMoriah Waterland /*
24265c51f124SMoriah Waterland * all of the packages (as listed in the package list) are
24275c51f124SMoriah Waterland * removed one at a time.
24285c51f124SMoriah Waterland */
24295c51f124SMoriah Waterland
24305c51f124SMoriah Waterland interrupted = 0;
24315c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
24325c51f124SMoriah Waterland started = 0;
24335c51f124SMoriah Waterland
24345c51f124SMoriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
24355c51f124SMoriah Waterland continue;
24365c51f124SMoriah Waterland }
24375c51f124SMoriah Waterland
24385c51f124SMoriah Waterland interrupted = 0;
24395c51f124SMoriah Waterland
24405c51f124SMoriah Waterland /*
24415c51f124SMoriah Waterland * pkgrm invoked from any type of zone BUT the target
24425c51f124SMoriah Waterland * to be removed is a local spool directory: remove the
24435c51f124SMoriah Waterland * packages from the spool directory only.
24445c51f124SMoriah Waterland */
24455c51f124SMoriah Waterland
24465c51f124SMoriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
24475c51f124SMoriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
24485c51f124SMoriah Waterland
24495c51f124SMoriah Waterland /* set success/fail condition variables */
24505c51f124SMoriah Waterland
24515c51f124SMoriah Waterland ckreturn(n);
24525c51f124SMoriah Waterland
24535c51f124SMoriah Waterland npkgs--;
24545c51f124SMoriah Waterland }
24555c51f124SMoriah Waterland
24565c51f124SMoriah Waterland /*
24575c51f124SMoriah Waterland * all packages in the package list have been removed.
24585c51f124SMoriah Waterland * Continue with removal if:
24595c51f124SMoriah Waterland * -- immediate reboot is NOT required
24605c51f124SMoriah Waterland * -- there are more packages to remove
24615c51f124SMoriah Waterland * else return do NOT continue.
24625c51f124SMoriah Waterland */
24635c51f124SMoriah Waterland
24645c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
24655c51f124SMoriah Waterland return (B_TRUE);
24665c51f124SMoriah Waterland }
24675c51f124SMoriah Waterland
24685c51f124SMoriah Waterland /* return 'dont continue' */
24695c51f124SMoriah Waterland
24705c51f124SMoriah Waterland return (B_FALSE);
24715c51f124SMoriah Waterland }
24725c51f124SMoriah Waterland
24735c51f124SMoriah Waterland /*
24745c51f124SMoriah Waterland * Name: remove_packages
24755c51f124SMoriah Waterland * Description: Remove packages from the global zone, and optionally from one
24765c51f124SMoriah Waterland * or more non-global zones, or from a specified spool directory.
24775c51f124SMoriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
24785c51f124SMoriah Waterland * the name of one package to be removed.
24795c51f124SMoriah Waterland * a_nodelete: should the files and scripts remain installed?
24805c51f124SMoriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
24815c51f124SMoriah Waterland * the removal of any files and any class action scripts
24825c51f124SMoriah Waterland * and suppress the running of any class action scripts.
24835c51f124SMoriah Waterland * The package files remain but the package looks like it
24845c51f124SMoriah Waterland * is not installed. This is mainly for use by upgrade.
24855c51f124SMoriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
24865c51f124SMoriah Waterland * files and class action scripts are removed, and any
24875c51f124SMoriah Waterland * appropriate class action scripts are run.
24885c51f124SMoriah Waterland * a_longestPkg - length of the longest package "name" (for
24895c51f124SMoriah Waterland * output format alignment)
24905c51f124SMoriah Waterland * a_repeat - are there more packages avialable in "optind"
24915c51f124SMoriah Waterland * - B_TRUE - process packages from optind
24925c51f124SMoriah Waterland * - B_FALSE - do not process packages from optind
24935c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
24945c51f124SMoriah Waterland * pkgremove executable to run. If not NULL, then pass
24955c51f124SMoriah Waterland * the path specified to the -b option to pkgremove.
24965c51f124SMoriah Waterland * a_pkgdir - pointer to string representing the directory
24975c51f124SMoriah Waterland * where the packages to be removed are located.
24985c51f124SMoriah Waterland * a_spoolDir - pointer to string specifying spool directory
24995c51f124SMoriah Waterland * to remove packages from. If != NULL then all zones
25005c51f124SMoriah Waterland * processing is bypassed and the packages are removed
25015c51f124SMoriah Waterland * from the specified spool directory only.
25025c51f124SMoriah Waterland * a_noZones - if non-global zones are configured, should the
25035c51f124SMoriah Waterland * packages be removed from the non-global zones?
25045c51f124SMoriah Waterland * - B_TRUE - do NOT remove packages from non-global zones
25055c51f124SMoriah Waterland * - B_FALSE - remove packages from non-global zones
25065c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
25075c51f124SMoriah Waterland * 0 - success
25085c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
25095c51f124SMoriah Waterland * 2 - non-fatal error (warning)
25105c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
25115c51f124SMoriah Waterland * 4 - admin settings prevented operation
25125c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
25135c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
25145c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
25155c51f124SMoriah Waterland */
25165c51f124SMoriah Waterland
25175c51f124SMoriah Waterland static boolean_t
remove_packages(char ** a_pkgList,int a_nodelete,int a_longestPkg,int a_repeat,char * a_altBinDir,char * a_pkgdir,char * a_spoolDir,boolean_t a_noZones)25185c51f124SMoriah Waterland remove_packages(char **a_pkgList, int a_nodelete, int a_longestPkg,
25195c51f124SMoriah Waterland int a_repeat, char *a_altBinDir, char *a_pkgdir, char *a_spoolDir,
25205c51f124SMoriah Waterland boolean_t a_noZones)
25215c51f124SMoriah Waterland {
25225c51f124SMoriah Waterland zoneList_t zlst;
25235c51f124SMoriah Waterland boolean_t b;
25245c51f124SMoriah Waterland
25255c51f124SMoriah Waterland /* entry assertions */
25265c51f124SMoriah Waterland
25275c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
25285c51f124SMoriah Waterland
25295c51f124SMoriah Waterland echoDebug(DBG_REMOVEPKGS_ENTRY);
25305c51f124SMoriah Waterland echoDebug(DBG_REMOVEPKGS_ARGS, npkgs, a_nodelete, a_longestPkg,
25315c51f124SMoriah Waterland a_repeat, PSTR(a_pkgdir), PSTR(a_spoolDir));
25325c51f124SMoriah Waterland
25335c51f124SMoriah Waterland /*
25345c51f124SMoriah Waterland * if removing from spool directory, bypass all zones checks
25355c51f124SMoriah Waterland */
25365c51f124SMoriah Waterland
25375c51f124SMoriah Waterland if (a_spoolDir != (char *)NULL) {
25385c51f124SMoriah Waterland /* in non-global zone */
25395c51f124SMoriah Waterland
25405c51f124SMoriah Waterland echoDebug(DBG_REMOVE_PKGS_FROM_SPOOL, a_spoolDir);
25415c51f124SMoriah Waterland
25425c51f124SMoriah Waterland b = remove_packages_from_spool_directory(a_pkgList, a_nodelete,
25435c51f124SMoriah Waterland a_longestPkg, a_repeat, a_altBinDir);
25445c51f124SMoriah Waterland
25455c51f124SMoriah Waterland return (B_FALSE);
25465c51f124SMoriah Waterland }
25475c51f124SMoriah Waterland
25485c51f124SMoriah Waterland /* exit if not root */
25495c51f124SMoriah Waterland
25505c51f124SMoriah Waterland if (getuid()) {
25515c51f124SMoriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
25525c51f124SMoriah Waterland exit(1);
25535c51f124SMoriah Waterland }
25545c51f124SMoriah Waterland
25555c51f124SMoriah Waterland /*
25565c51f124SMoriah Waterland * if running in the global zone AND one or more non-global
25575c51f124SMoriah Waterland * zones exist, add packages in a 'zones aware' manner, else
25585c51f124SMoriah Waterland * add packages in the standard 'non-zones aware' manner.
25595c51f124SMoriah Waterland */
25605c51f124SMoriah Waterland
25615c51f124SMoriah Waterland if ((a_noZones == B_FALSE) && (z_running_in_global_zone() == B_FALSE)) {
25625c51f124SMoriah Waterland /* in non-global zone */
25635c51f124SMoriah Waterland
25645c51f124SMoriah Waterland echoDebug(DBG_IN_LZ);
25655c51f124SMoriah Waterland
25665c51f124SMoriah Waterland b = z_lock_this_zone(ZLOCKS_PKG_ADMIN);
25675c51f124SMoriah Waterland if (b != B_TRUE) {
25685c51f124SMoriah Waterland progerr(ERR_CANNOT_LOCK_THIS_ZONE);
25695c51f124SMoriah Waterland /* set fatal error return condition */
25705c51f124SMoriah Waterland ckreturn(1);
25715c51f124SMoriah Waterland return (B_FALSE);
25725c51f124SMoriah Waterland }
25735c51f124SMoriah Waterland
25745c51f124SMoriah Waterland b = remove_packages_in_nonglobal_zone(a_pkgList, a_nodelete,
25755c51f124SMoriah Waterland a_longestPkg, a_repeat, a_altBinDir, a_pkgdir);
25765c51f124SMoriah Waterland
25775c51f124SMoriah Waterland (void) z_unlock_this_zone(ZLOCKS_ALL);
25785c51f124SMoriah Waterland
25795c51f124SMoriah Waterland return (B_FALSE);
25805c51f124SMoriah Waterland }
25815c51f124SMoriah Waterland
25825c51f124SMoriah Waterland /* running in the global zone */
25835c51f124SMoriah Waterland
25845c51f124SMoriah Waterland b = z_non_global_zones_exist();
25855c51f124SMoriah Waterland if ((a_noZones == B_FALSE) && (b == B_TRUE)) {
25865c51f124SMoriah Waterland
25875c51f124SMoriah Waterland echoDebug(DBG_IN_GZ_WITH_LZ);
25885c51f124SMoriah Waterland
25895c51f124SMoriah Waterland /* get a list of all non-global zones */
25905c51f124SMoriah Waterland zlst = z_get_nonglobal_zone_list();
25915c51f124SMoriah Waterland if (zlst == (zoneList_t)NULL) {
25925c51f124SMoriah Waterland progerr(ERR_CANNOT_GET_ZONE_LIST);
25935c51f124SMoriah Waterland quit(1);
25945c51f124SMoriah Waterland }
25955c51f124SMoriah Waterland
25965c51f124SMoriah Waterland /* need to lock all of the zones */
25975c51f124SMoriah Waterland
25985c51f124SMoriah Waterland quitSetZonelist(zlst);
25995c51f124SMoriah Waterland b = z_lock_zones(zlst, ZLOCKS_PKG_ADMIN);
26005c51f124SMoriah Waterland if (b == B_FALSE) {
26015c51f124SMoriah Waterland z_free_zone_list(zlst);
26025c51f124SMoriah Waterland progerr(ERR_CANNOT_LOCK_ZONES);
26035c51f124SMoriah Waterland /* set fatal error return condition */
26045c51f124SMoriah Waterland ckreturn(1);
26055c51f124SMoriah Waterland return (B_FALSE);
26065c51f124SMoriah Waterland }
26075c51f124SMoriah Waterland
26085c51f124SMoriah Waterland /* add packages to all zones */
26095c51f124SMoriah Waterland
26105c51f124SMoriah Waterland b = remove_packages_in_global_with_zones(a_pkgList, a_nodelete,
26115c51f124SMoriah Waterland a_longestPkg, a_repeat, a_altBinDir, a_pkgdir, zlst);
26125c51f124SMoriah Waterland
26135c51f124SMoriah Waterland /* unlock all zones */
26145c51f124SMoriah Waterland
26155c51f124SMoriah Waterland (void) z_unlock_zones(zlst, ZLOCKS_ALL);
26165c51f124SMoriah Waterland quitSetZonelist((zoneList_t)NULL);
26175c51f124SMoriah Waterland
26185c51f124SMoriah Waterland /* free list of all non-global zones */
26195c51f124SMoriah Waterland
26205c51f124SMoriah Waterland z_free_zone_list(zlst);
26215c51f124SMoriah Waterland
26225c51f124SMoriah Waterland return (B_FALSE);
26235c51f124SMoriah Waterland }
26245c51f124SMoriah Waterland
26255c51f124SMoriah Waterland /* in global zone no non-global zones */
26265c51f124SMoriah Waterland
26275c51f124SMoriah Waterland echoDebug(DBG_IN_GZ_NO_LZ);
26285c51f124SMoriah Waterland
26295c51f124SMoriah Waterland b = z_lock_this_zone(ZLOCKS_PKG_ADMIN);
26305c51f124SMoriah Waterland if (b != B_TRUE) {
26315c51f124SMoriah Waterland progerr(ERR_CANNOT_LOCK_THIS_ZONE);
26325c51f124SMoriah Waterland /* set fatal error return condition */
26335c51f124SMoriah Waterland ckreturn(1);
26345c51f124SMoriah Waterland return (B_FALSE);
26355c51f124SMoriah Waterland }
26365c51f124SMoriah Waterland
26375c51f124SMoriah Waterland b = remove_packages_in_global_no_zones(a_pkgList, a_nodelete,
26385c51f124SMoriah Waterland a_longestPkg, a_repeat, a_altBinDir);
26395c51f124SMoriah Waterland
26405c51f124SMoriah Waterland (void) z_unlock_this_zone(ZLOCKS_ALL);
26415c51f124SMoriah Waterland
26425c51f124SMoriah Waterland return (B_FALSE);
26435c51f124SMoriah Waterland }
26445c51f124SMoriah Waterland
26455c51f124SMoriah Waterland /*
26465c51f124SMoriah Waterland * Name: path_valid
26475c51f124SMoriah Waterland * Description: Checks a string for being a valid path
26485c51f124SMoriah Waterland *
26495c51f124SMoriah Waterland * Arguments: path - path to validate
26505c51f124SMoriah Waterland *
26515c51f124SMoriah Waterland * Returns : B_TRUE - success, B_FALSE otherwise.
26525c51f124SMoriah Waterland * B_FALSE means path was null, too long (>PATH_MAX),
26535c51f124SMoriah Waterland * or too short (<1)
26545c51f124SMoriah Waterland */
26555c51f124SMoriah Waterland static boolean_t
path_valid(char * path)26565c51f124SMoriah Waterland path_valid(char *path)
26575c51f124SMoriah Waterland {
26585c51f124SMoriah Waterland if (path == NULL) {
26595c51f124SMoriah Waterland return (B_FALSE);
26605c51f124SMoriah Waterland } else if (strlen(path) > PATH_MAX) {
26615c51f124SMoriah Waterland return (B_FALSE);
26625c51f124SMoriah Waterland } else if (strlen(path) >= 1) {
26635c51f124SMoriah Waterland return (B_TRUE);
26645c51f124SMoriah Waterland } else {
26655c51f124SMoriah Waterland /* path < 1 */
26665c51f124SMoriah Waterland return (B_FALSE);
26675c51f124SMoriah Waterland }
26685c51f124SMoriah Waterland }
26695c51f124SMoriah Waterland
26705c51f124SMoriah Waterland /*
26715c51f124SMoriah Waterland */
26725c51f124SMoriah Waterland
26735c51f124SMoriah Waterland static boolean_t
check_packages(char ** a_pkgList,char * a_packageDir)26745c51f124SMoriah Waterland check_packages(char **a_pkgList, char *a_packageDir)
26755c51f124SMoriah Waterland {
26765c51f124SMoriah Waterland int savenpkgs = npkgs;
26775c51f124SMoriah Waterland int i;
26785c51f124SMoriah Waterland CAF_T flags = 0;
26795c51f124SMoriah Waterland
26805c51f124SMoriah Waterland /* set flags for applicability check */
26815c51f124SMoriah Waterland
26825c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
26835c51f124SMoriah Waterland flags |= CAF_IN_GLOBAL_ZONE;
26845c51f124SMoriah Waterland }
26855c51f124SMoriah Waterland
26865c51f124SMoriah Waterland /*
26875c51f124SMoriah Waterland * for each package to remove, verify that the package is installed
26885c51f124SMoriah Waterland * and is removable.
26895c51f124SMoriah Waterland */
26905c51f124SMoriah Waterland
26915c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
26925c51f124SMoriah Waterland /* check package applicability */
26935c51f124SMoriah Waterland if (check_applicability(a_packageDir, pkginst, get_inst_root(),
26945c51f124SMoriah Waterland flags) == B_FALSE) {
26955c51f124SMoriah Waterland progerr(ERR_PKG_NOT_REMOVABLE, pkginst);
26965c51f124SMoriah Waterland npkgs = savenpkgs;
26975c51f124SMoriah Waterland return (B_FALSE);
26985c51f124SMoriah Waterland }
26995c51f124SMoriah Waterland npkgs--;
27005c51f124SMoriah Waterland }
27015c51f124SMoriah Waterland
27025c51f124SMoriah Waterland npkgs = savenpkgs;
27035c51f124SMoriah Waterland return (B_TRUE);
27045c51f124SMoriah Waterland }
27055c51f124SMoriah Waterland
27065c51f124SMoriah Waterland /*
27075c51f124SMoriah Waterland * - is this package removable from this zone?
27085c51f124SMoriah Waterland * - does the scope of remove conflict with existing installation
27095c51f124SMoriah Waterland */
27105c51f124SMoriah Waterland
27115c51f124SMoriah Waterland static boolean_t
check_applicability(char * a_packageDir,char * a_pkgInst,char * a_rootPath,CAF_T a_flags)27125c51f124SMoriah Waterland check_applicability(char *a_packageDir, char *a_pkgInst,
27135c51f124SMoriah Waterland char *a_rootPath, CAF_T a_flags)
27145c51f124SMoriah Waterland {
27155c51f124SMoriah Waterland FILE *pkginfoFP;
27165c51f124SMoriah Waterland boolean_t all_zones; /* pkg is "all zones" only */
27175c51f124SMoriah Waterland char pkginfoPath[PATH_MAX];
27185c51f124SMoriah Waterland char pkgpath[PATH_MAX];
27195c51f124SMoriah Waterland int len;
27205c51f124SMoriah Waterland
27215c51f124SMoriah Waterland /* entry assertions */
27225c51f124SMoriah Waterland
27235c51f124SMoriah Waterland assert(a_packageDir != (char *)NULL);
27245c51f124SMoriah Waterland assert(*a_packageDir != '\0');
27255c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL);
27265c51f124SMoriah Waterland assert(*a_pkgInst != '\0');
27275c51f124SMoriah Waterland
27285c51f124SMoriah Waterland /* normalize root path */
27295c51f124SMoriah Waterland
27305c51f124SMoriah Waterland if (a_rootPath == (char *)NULL) {
27315c51f124SMoriah Waterland a_rootPath = "";
27325c51f124SMoriah Waterland }
27335c51f124SMoriah Waterland
27345c51f124SMoriah Waterland /*
27355c51f124SMoriah Waterland * determine if this package is currently installed
27365c51f124SMoriah Waterland * if not installed return success - operation will fail
27375c51f124SMoriah Waterland * when the removal is attempted
27385c51f124SMoriah Waterland */
27395c51f124SMoriah Waterland
27405c51f124SMoriah Waterland if (pkginfoIsPkgInstalled((struct pkginfo **)NULL, a_pkgInst) !=
27415c51f124SMoriah Waterland B_TRUE) {
27425c51f124SMoriah Waterland return (B_TRUE);
27435c51f124SMoriah Waterland }
27445c51f124SMoriah Waterland
27455c51f124SMoriah Waterland /*
27465c51f124SMoriah Waterland * calculate paths to various objects
27475c51f124SMoriah Waterland */
27485c51f124SMoriah Waterland
27495c51f124SMoriah Waterland len = snprintf(pkgpath, sizeof (pkgpath), "%s/%s", a_packageDir,
27505c51f124SMoriah Waterland a_pkgInst);
27515c51f124SMoriah Waterland if (len > sizeof (pkgpath)) {
27525c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_packageDir, a_pkgInst);
27535c51f124SMoriah Waterland return (B_FALSE);
27545c51f124SMoriah Waterland }
27555c51f124SMoriah Waterland
27565c51f124SMoriah Waterland /* if not installed then just return */
27575c51f124SMoriah Waterland
27585c51f124SMoriah Waterland if (isdir(pkgpath) != 0) {
27595c51f124SMoriah Waterland progerr(ERR_NO_PKGDIR, pkgpath, a_pkgInst, strerror(errno));
27605c51f124SMoriah Waterland return (B_TRUE);
27615c51f124SMoriah Waterland }
27625c51f124SMoriah Waterland
27635c51f124SMoriah Waterland len = snprintf(pkginfoPath, sizeof (pkginfoPath),
27645c51f124SMoriah Waterland "%s/pkginfo", pkgpath);
27655c51f124SMoriah Waterland if (len > sizeof (pkgpath)) {
27665c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, pkgpath, "pkginfo");
27675c51f124SMoriah Waterland return (B_FALSE);
27685c51f124SMoriah Waterland }
27695c51f124SMoriah Waterland
27705c51f124SMoriah Waterland /*
27715c51f124SMoriah Waterland * gather information from this packages pkginfo file
27725c51f124SMoriah Waterland */
27735c51f124SMoriah Waterland
27745c51f124SMoriah Waterland pkginfoFP = fopen(pkginfoPath, "r");
27755c51f124SMoriah Waterland
27765c51f124SMoriah Waterland if (pkginfoFP == (FILE *)NULL) {
27775c51f124SMoriah Waterland progerr(ERR_NO_PKG_INFOFILE, a_pkgInst, pkginfoPath,
27785c51f124SMoriah Waterland strerror(errno));
27795c51f124SMoriah Waterland return (B_FALSE);
27805c51f124SMoriah Waterland }
27815c51f124SMoriah Waterland
27825c51f124SMoriah Waterland /* determine "ALLZONES" setting for this package */
27835c51f124SMoriah Waterland
27845c51f124SMoriah Waterland all_zones = pkginfoParamTruth(pkginfoFP, PKG_ALLZONES_VARIABLE,
27855c51f124SMoriah Waterland "true", B_FALSE);
27865c51f124SMoriah Waterland
27875c51f124SMoriah Waterland /* close pkginfo file */
27885c51f124SMoriah Waterland
27895c51f124SMoriah Waterland (void) fclose(pkginfoFP);
27905c51f124SMoriah Waterland
27915c51f124SMoriah Waterland /* gather information from the global zone only file */
27925c51f124SMoriah Waterland
27935c51f124SMoriah Waterland /*
27945c51f124SMoriah Waterland * verify package applicability based on information gathered;
27955c51f124SMoriah Waterland * the package IS currently installed....
27965c51f124SMoriah Waterland */
27975c51f124SMoriah Waterland
27985c51f124SMoriah Waterland /* pkg ALLZONES=true & not running in global zone */
27995c51f124SMoriah Waterland
28005c51f124SMoriah Waterland if ((all_zones == B_TRUE) && (!(a_flags & CAF_IN_GLOBAL_ZONE))) {
28015c51f124SMoriah Waterland progerr(ERR_ALLZONES_AND_IN_LZ_PKGRM, a_pkgInst);
28025c51f124SMoriah Waterland return (B_FALSE);
28035c51f124SMoriah Waterland }
28045c51f124SMoriah Waterland
28055c51f124SMoriah Waterland return (B_TRUE);
28065c51f124SMoriah Waterland }
28075c51f124SMoriah Waterland
28085c51f124SMoriah Waterland /*
28095c51f124SMoriah Waterland * Name: shall_we_continue
28105c51f124SMoriah Waterland * Description: Called from within a loop that is installing packages,
28115c51f124SMoriah Waterland * this function examines various global variables and decides
28125c51f124SMoriah Waterland * whether or not to ask an appropriate question, and wait for
28135c51f124SMoriah Waterland * and appropriate reply.
28145c51f124SMoriah Waterland * Arguments: <<global variables>>
28155c51f124SMoriah Waterland * Returns: B_TRUE - continue processing with next package
28165c51f124SMoriah Waterland * B_FALSE - do not continue processing with next package
28175c51f124SMoriah Waterland */
28185c51f124SMoriah Waterland
28195c51f124SMoriah Waterland static boolean_t
shall_we_continue(char * a_pkgInst,int a_npkgs)28205c51f124SMoriah Waterland shall_we_continue(char *a_pkgInst, int a_npkgs)
28215c51f124SMoriah Waterland {
28225c51f124SMoriah Waterland char ans[MAX_INPUT];
28235c51f124SMoriah Waterland int n;
28245c51f124SMoriah Waterland
28255c51f124SMoriah Waterland /* return FALSE if immediate reboot required */
28265c51f124SMoriah Waterland
28275c51f124SMoriah Waterland if (ireboot) {
28285c51f124SMoriah Waterland ptext(stderr, MSG_SUSPEND_RM, a_pkgInst);
28295c51f124SMoriah Waterland return (B_FALSE);
28305c51f124SMoriah Waterland }
28315c51f124SMoriah Waterland
28325c51f124SMoriah Waterland /* return TRUE if not interrupted */
28335c51f124SMoriah Waterland
28345c51f124SMoriah Waterland if (!interrupted) {
28355c51f124SMoriah Waterland return (B_TRUE);
28365c51f124SMoriah Waterland }
28375c51f124SMoriah Waterland
28385c51f124SMoriah Waterland /* output appropriate interrupt message */
28395c51f124SMoriah Waterland
28405c51f124SMoriah Waterland echo(a_npkgs == 1 ? MSG_1MORETODO : MSG_MORETODO, a_npkgs);
28415c51f124SMoriah Waterland
28425c51f124SMoriah Waterland /* if running with no interaction (-n) do not ask question */
28435c51f124SMoriah Waterland
28445c51f124SMoriah Waterland if (nointeract) {
28455c51f124SMoriah Waterland quit(0);
28465c51f124SMoriah Waterland /* NOTREACHED */
28475c51f124SMoriah Waterland }
28485c51f124SMoriah Waterland
28495c51f124SMoriah Waterland /* interaction possible: ask question */
28505c51f124SMoriah Waterland
28515c51f124SMoriah Waterland n = ckyorn(ans, NULL, NULL, NULL, ASK_CONTINUE_RM);
28525c51f124SMoriah Waterland if (n != 0) {
28535c51f124SMoriah Waterland quit(n);
28545c51f124SMoriah Waterland /* NOTREACHED */
28555c51f124SMoriah Waterland }
28565c51f124SMoriah Waterland
28575c51f124SMoriah Waterland if (strchr("yY", *ans) == NULL) {
28585c51f124SMoriah Waterland quit(0);
28595c51f124SMoriah Waterland /* NOTREACHED */
28605c51f124SMoriah Waterland }
28615c51f124SMoriah Waterland return (B_TRUE);
28625c51f124SMoriah Waterland }
28635c51f124SMoriah Waterland
28645c51f124SMoriah Waterland /*
28655c51f124SMoriah Waterland * Name: create_zone_adminfile
28665c51f124SMoriah Waterland * Description: Given a zone temporary directory and optionally an existing
28675c51f124SMoriah Waterland * administration file, generate an administration file that
28685c51f124SMoriah Waterland * can be used to perform "non-interactive" operations in a
28695c51f124SMoriah Waterland * non-global zone.
28705c51f124SMoriah Waterland * Arguments: r_zoneAdminFile - pointer to handle that will contain a
28715c51f124SMoriah Waterland * string representing the path to the temporary
28725c51f124SMoriah Waterland * administration file created - this must be NULL
28735c51f124SMoriah Waterland * before the first call to this function - on
28745c51f124SMoriah Waterland * subsequent calls if the pointer is NOT null then
28755c51f124SMoriah Waterland * the existing string will NOT be overwritten.
28765c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the path
28775c51f124SMoriah Waterland * to the zone temporary directory to create the
28785c51f124SMoriah Waterland * temporary administration file in
28795c51f124SMoriah Waterland * a_admnfile - pointer to string representing the path to
28805c51f124SMoriah Waterland * an existing "user" administration file - the
28815c51f124SMoriah Waterland * administration file created will contain the
28825c51f124SMoriah Waterland * settings contained in this file, modified as
28835c51f124SMoriah Waterland * appropriate to supress any interaction;
28845c51f124SMoriah Waterland * If this is == NULL then the administration file
28855c51f124SMoriah Waterland * created will not contain any extra settings
28865c51f124SMoriah Waterland * Returns: void
28875c51f124SMoriah Waterland * NOTE: Any string returned is placed in new storage for the
28885c51f124SMoriah Waterland * calling method. The caller must use 'free' to dispose
28895c51f124SMoriah Waterland * of the storage once the string is no longer needed.
28905c51f124SMoriah Waterland * NOTE: On any error this function will call 'quit(1)'
28915c51f124SMoriah Waterland */
28925c51f124SMoriah Waterland
28935c51f124SMoriah Waterland static void
create_zone_adminfile(char ** r_zoneAdminFile,char * a_zoneTempDir,char * a_admnfile)28945c51f124SMoriah Waterland create_zone_adminfile(char **r_zoneAdminFile, char *a_zoneTempDir,
28955c51f124SMoriah Waterland char *a_admnfile)
28965c51f124SMoriah Waterland {
28975c51f124SMoriah Waterland boolean_t b;
28985c51f124SMoriah Waterland
28995c51f124SMoriah Waterland /* entry assertions */
29005c51f124SMoriah Waterland
29015c51f124SMoriah Waterland assert(r_zoneAdminFile != (char **)NULL);
29025c51f124SMoriah Waterland assert(a_zoneTempDir != (char *)NULL);
29035c51f124SMoriah Waterland assert(*a_zoneTempDir != '\0');
29045c51f124SMoriah Waterland
29055c51f124SMoriah Waterland /* entry debugging info */
29065c51f124SMoriah Waterland
29075c51f124SMoriah Waterland echoDebug(DBG_CREATE_ZONE_ADMINFILE, a_zoneTempDir, PSTR(a_admnfile));
29085c51f124SMoriah Waterland
29095c51f124SMoriah Waterland /* if temporary name already exists, do not overwrite */
29105c51f124SMoriah Waterland
29115c51f124SMoriah Waterland if (*r_zoneAdminFile != (char *)NULL) {
29125c51f124SMoriah Waterland return;
29135c51f124SMoriah Waterland }
29145c51f124SMoriah Waterland
29155c51f124SMoriah Waterland /* create temporary name */
29165c51f124SMoriah Waterland
29175c51f124SMoriah Waterland *r_zoneAdminFile = tempnam(a_zoneTempDir, "zadmn");
29185c51f124SMoriah Waterland b = z_create_zone_admin_file(*r_zoneAdminFile, a_admnfile);
29195c51f124SMoriah Waterland if (b == B_FALSE) {
29205c51f124SMoriah Waterland progerr(ERR_CREATE_TMPADMIN, *r_zoneAdminFile,
29215c51f124SMoriah Waterland strerror(errno));
29225c51f124SMoriah Waterland quit(1);
29235c51f124SMoriah Waterland /* NOTREACHED */
29245c51f124SMoriah Waterland }
29255c51f124SMoriah Waterland
29265c51f124SMoriah Waterland echoDebug(DBG_CREATED_ZONE_ADMINFILE, *r_zoneAdminFile);
29275c51f124SMoriah Waterland }
29285c51f124SMoriah Waterland
29295c51f124SMoriah Waterland /*
29305c51f124SMoriah Waterland * Name: create_zone_tempdir
29315c51f124SMoriah Waterland * Description: Given a system temporary directory, create a "zone" specific
29325c51f124SMoriah Waterland * temporary directory and return the path to the directory
29335c51f124SMoriah Waterland * created.
29345c51f124SMoriah Waterland * Arguments: r_zoneTempDir - pointer to handle that will contain a
29355c51f124SMoriah Waterland * string representing the path to the temporary
29365c51f124SMoriah Waterland * directory created - this must be NULL before the
29375c51f124SMoriah Waterland * first call to this function - on subsequent calls
29385c51f124SMoriah Waterland * if the pointer is NOT null then the existing string
29395c51f124SMoriah Waterland * will NOT be overwritten.
29405c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the path
29415c51f124SMoriah Waterland * to the system temporary directory to create the
29425c51f124SMoriah Waterland * temporary zone directory in
29435c51f124SMoriah Waterland * Returns: void
29445c51f124SMoriah Waterland * NOTE: Any string returned is placed in new storage for the
29455c51f124SMoriah Waterland * calling method. The caller must use 'free' to dispose
29465c51f124SMoriah Waterland * of the storage once the string is no longer needed.
29475c51f124SMoriah Waterland * NOTE: On any error this function will call 'quit(1)'
29485c51f124SMoriah Waterland * NOTE: This function calls "quitSetZoneTmpdir" on success to
29495c51f124SMoriah Waterland * register the directory created with quit() so that the
29505c51f124SMoriah Waterland * directory will be automatically deleted on exit.
29515c51f124SMoriah Waterland */
29525c51f124SMoriah Waterland
29535c51f124SMoriah Waterland static void
create_zone_tempdir(char ** r_zoneTempDir,char * a_tmpdir)29545c51f124SMoriah Waterland create_zone_tempdir(char **r_zoneTempDir, char *a_tmpdir)
29555c51f124SMoriah Waterland {
29565c51f124SMoriah Waterland boolean_t b;
29575c51f124SMoriah Waterland
29585c51f124SMoriah Waterland /* entry assertions */
29595c51f124SMoriah Waterland
29605c51f124SMoriah Waterland assert(r_zoneTempDir != (char **)NULL);
29615c51f124SMoriah Waterland assert(a_tmpdir != (char *)NULL);
29625c51f124SMoriah Waterland assert(*a_tmpdir != '\0');
29635c51f124SMoriah Waterland
29645c51f124SMoriah Waterland /* entry debugging info */
29655c51f124SMoriah Waterland
29665c51f124SMoriah Waterland echoDebug(DBG_CREATE_ZONE_TEMPDIR, a_tmpdir);
29675c51f124SMoriah Waterland
29685c51f124SMoriah Waterland /* if temporary directory already exists, do not overwrite */
29695c51f124SMoriah Waterland
29705c51f124SMoriah Waterland if (*r_zoneTempDir != (char *)NULL) {
29715c51f124SMoriah Waterland return;
29725c51f124SMoriah Waterland }
29735c51f124SMoriah Waterland
29745c51f124SMoriah Waterland /* create temporary directory */
29755c51f124SMoriah Waterland
29765c51f124SMoriah Waterland b = setup_temporary_directory(r_zoneTempDir, a_tmpdir, "ztemp");
29775c51f124SMoriah Waterland if (b == B_FALSE) {
29785c51f124SMoriah Waterland progerr(ERR_ZONETEMPDIR, a_tmpdir, strerror(errno));
29795c51f124SMoriah Waterland quit(1);
29805c51f124SMoriah Waterland /* NOTREACHED */
29815c51f124SMoriah Waterland }
29825c51f124SMoriah Waterland
29835c51f124SMoriah Waterland /* register with quit() to directory is removed on exit */
29845c51f124SMoriah Waterland
29855c51f124SMoriah Waterland quitSetZoneTmpdir(*r_zoneTempDir);
29865c51f124SMoriah Waterland
29875c51f124SMoriah Waterland /* exit debugging info */
29885c51f124SMoriah Waterland
29895c51f124SMoriah Waterland echoDebug(DBG_CREATED_ZONE_TEMPDIR, *r_zoneTempDir);
29905c51f124SMoriah Waterland }
2991