5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * System includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgdev.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * libinstzones includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <instzones_api.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * consolidation pkg command library includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * local pkg command library includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "install.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libadm.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "messages.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgrm local includes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "quit.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * exported global variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* these globals are set by ckreturn and used by quit.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint admnflag = 0; /* != 0 if any pkg op admin setting failure (4) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint doreboot = 0; /* != 0 if reboot required after installation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint failflag = 0; /* != 0 if fatal error has occurred (1) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint intrflag = 0; /* != 0 if user selected quit (3) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint ireboot = 0; /* != 0 if immediate reboot required */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint nullflag = 0; /* != 0 if admin interaction required (5) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint warnflag = 0; /* != 0 if non-fatal error has occurred (2) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* imported by quit.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint npkgs = 0; /* the number of packages yet to be installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* imported by presvr4.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint started = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *tmpdir = NULL; /* location to place temporary files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* imported by various (many) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct admin adm; /* holds info about installation admin */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct pkgdev pkgdev; /* holds info about the installation device */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * internal global variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *admnfile = NULL; /* file to use for installation admin */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *pkginst = NULL; /* current pkg/src instance 2 process */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *vfstab_file = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *zoneTempDir = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* set by ckreturn() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int interrupted = 0; /* last pkg op was quit (1,2,3,4,5) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int nointeract = 0; /* non-zero - no user interaction */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgrmremote = 0; /* remove pkg objs stored remotely */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgverbose = 0; /* non-zero if verbose mode selected */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Assume the package complies with the standards as regards user
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * interaction during procedure scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int old_pkg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int old_symlinks = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int no_map_client = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O nozones: do not process any zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t noZones = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O zonelist=<names...>: process only named zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t usedZoneList = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O debug: debug output is enabled? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t debugFlag = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * imported (external) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* check.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int preremove_verify(char **a_pkgList, zoneList_t a_zlst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_zoneTempDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* quit.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetZonelist(zoneList_t a_zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * imported (external) variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* printable string - if string is null results in ??? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PSTR(STR) (((STR) == (char *)NULL) ? "???" : (STR))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAX_FDS 20
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TEXT_DOMAIN "SYS_TEST"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * forward declarations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void ckreturn(int retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void create_zone_adminfile(char **r_zoneAdminFile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_zoneTempDir, char *a_admnfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void create_zone_tempdir(char **r_zoneTempDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int doRemove(int a_nodelete, char *a_altBinDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_longestPkg, char *a_adminFile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_zoneAdminFile, zoneList_t zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgRemove(int a_nodelete, char *a_altBinDir,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington char *a_adminFile);
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Penningtonstatic int pkgZoneCheckRemove(char *a_zoneName, char *a_altBinDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_adminFile, char *a_stdoutPath,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik zone_state_t a_zoneState, boolean_t tmpzone);
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Penningtonstatic int pkgZoneRemove(char *a_zoneName, int a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altBinDir, char *a_adminFile,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik zone_state_t a_zoneState, boolean_t tmpzone);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void resetreturn();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void usage(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t check_applicability(char *a_packageDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_pkgInst, char *a_rootPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CAF_T a_flags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t check_packages(char **a_pkgList, char *a_packageDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t path_valid(char *path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t remove_packages(char **a_pkgList, int a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_longestPkg, int a_repeat,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altBinDir, char *a_pkgdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_spoolDir, boolean_t a_noZones);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t remove_packages_from_spool_directory(char **a_pkgList,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t remove_packages_in_global_no_zones(char **a_pkgList,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t remove_packages_in_global_with_zones(char **a_pkgList,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altBinDir, char *a_pkgdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneList_t a_zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t remove_packages_in_nonglobal_zone(char **a_pkgList,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_nodelete, int a_longestPkg, int a_repeat,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_altBinDir, char *a_pkgdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t shall_we_continue(char *a_pkgInst, int a_npkgs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global external (public) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: main
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: main entry point for pkgrm
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 Successful completion
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 Fatal error.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 Warning.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 Interruption.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 Administration.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 Administration. Interaction is required. Do not use pkgrm -n.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 10 Reboot after removal of all packages.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 20 Reboot after removal of this package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmain(int argc, char **argv)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **category = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *altBinDir = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *catg_arg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prog_full_name = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *spoolDir = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int longestPkg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nodelete = 0; /* dont rm files/run scripts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pkgLgth = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int repeat;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction nact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction oact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize locale environment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) setlocale(LC_ALL, "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) textdomain(TEXT_DOMAIN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize program name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prog_full_name = argv[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_prog_name(argv[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tell spmi zones interface how to access package output functions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_set_output_functions(echo, echoDebug, progerr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tell quit which ckreturn function to call */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetCkreturnFunc(&ckreturn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read PKG_INSTALL_ROOT from the environment, if it's there. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ROOT_SET);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone() && !enable_local_fs()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_ENABLE_LOCAL_FS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgserversetmode(DEFAULTMODE);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * parse command line options
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv, "?Aa:b:FMnO:R:s:V:vY:Z")) != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: Allow admin to remove objects
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from a service area via a reference client.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Remove the package files from the client's file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * system, absolutely. If a file is shared with other
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages, the default behavior is to not remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the file from the client's file system.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'A':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgrmremote++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: Use the installation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file, admin, in place of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * default admin file. pkgrm first looks in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * current working directory for the administration
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file. If the specified administration file is not
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in the current working directory, pkgrm looks in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the /var/sadm/install/admin directory for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administra- tion file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnfile = flex_device(optarg, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Not a public interface: location where package executables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can be found - default is /usr/sadm/install/bin.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!path_valid(optarg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PATH, optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(optarg) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strerror(errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_USE_DIR, optarg, p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland altBinDir = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Not a public interface: pass -F option to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove which suppresses the removal of any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and any class action scripts, and suppresses
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the running of any class action scripts. The
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * upgrade process.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'F':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nodelete++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: Instruct pkgrm not to use the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * $root_path/etc/vfstab file for determining the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * client's mount points. This option assumes the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mount points are correct on the server and it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * behaves consistently with Solaris 2.5 and earlier
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * releases.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'M':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland no_map_client = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: package removal occurs in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-interactive mode. Suppress output of the list of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed files. The default mode is interactive.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nointeract++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoSetFlag(B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Not a public interface: the -O option allows the behavior
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the package tools to be modified. Recognized options:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> debug
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> enable debugging output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> nozones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> act as though in global zone with no non-global zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> enable-hollow-package-support
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Enable hollow package support. When specified, for any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> package that has SUNW_PKG_HOLLOW=true:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not calculate and verify package size against target
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not run any package procedure or class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not create or remove any target directories
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not perform any script locking
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not install or uninstall any components of any package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not output any status or database update messages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> zonelist="<names...>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> add package to space-separated list of zones only
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'O':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (p = strtok(optarg, ","); p != (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strtok(NULL, ",")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p, "nozones") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland noZones = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "enable-hollow-package-support") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_depend_pkginfo_DB(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p, "debug") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set debug flag/enable debug output */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland debugFlag = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoDebugSetFlag(debugFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on arguments to pkgadd */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < argc && argv[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ARG, n, argv[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strncmp(p, "zonelist=", 9) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_set_zone_spec(p + 9) == -1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usedZoneList = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -O option not recognized - issue warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_INVALID_O_OPTION, p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: defines the full path name of a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory to use as the root_path. All files,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * including package system information files, are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * relocated to a directory tree starting in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified root_path.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(optarg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ROOT_CMD);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: remove the specified package(s)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from the directory spool. The default directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for spooled packages is /var/sadm/pkg.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 's':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland spoolDir = flex_device(optarg, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: Allow admin to establish the client
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * filesystem using a vfstab-like file of stable format.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'V':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfstab_file = flex_device(optarg, 2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland no_map_client = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: trace all of the scripts that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * get executed by pkgrm, located in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginst/install directory. This option is used for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * debugging the procedural and non- procedural
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgverbose++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Public interface: remove packages based on the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CATEGORY variable from the installed/spooled
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginfo file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'Y':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland catg_arg = strdup(optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((category = get_categories(catg_arg)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CAT_INV, catg_arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_not_valid_category(category,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_prog_name())) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CAT_SYS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_not_valid_length(category)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CAT_LNGTH);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unrecognized option
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * validate command line options
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set "debug echo" flag according to setting of "-O debug" option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoDebugSetFlag(debugFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output entry debugging information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ENTRY_IN_GZ, prog_full_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ENTRY_IN_LZ, prog_full_name, getzoneid(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_get_zonename());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -s cannot be used with several */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (spoolDir != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (admnfile != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SPOOLDIR_AND_ADMNFILE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgrmremote != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SPOOLDIR_AND_PKGRMREMOTE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgverbose != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SPOOLDIR_AND_PKGVERBOSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_an_inst_root() != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SPOOLDIR_AND_INST_ROOT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -V cannot be used with -A */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (no_map_client && pkgrmremote) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_V_USED_AND_PKGRMREMOTE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -n used without pkg names or category */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nointeract && (optind == argc) && (catg_arg == NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_BAD_N_PKGRM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Error if specified zone list isn't valid on target */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (usedZoneList && z_verify_zone_spec() == -1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * hook SIGINT and SIGHUP interrupts into quit.c's trap handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hold SIGINT/SIGHUP interrupts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* connect quit.c:trap() to SIGINT */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = quitGetTrapHandler();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGINT, &nact, &oact);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* connect quit.c:trap() to SIGHUP */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = quitGetTrapHandler();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGHUP, &nact, &oact);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* establish temporary directory to use */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = getenv("TMPDIR");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmpdir == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = P_tmpdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGRM_TMPDIR, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize path parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGpaths(get_inst_root());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * initialize installation admin parameters - if removing from a spool
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory then the admin file is ignore.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (spoolDir == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGRM_ADMINFILE, admnfile ? admnfile : "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminFile(admnfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if running in the global zone, and non-global zones exist, then
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * enable hollow package support so that any packages that are marked
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * SUNW_PKG_HOLLOW=true will be correctly removed in non-global zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when removed directly in the global zone by the global zone admin.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGRM_HOLLOW_ENABLED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((z_running_in_global_zone() == B_TRUE) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (z_non_global_zones_exist() == B_TRUE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGRM_ENABLING_HOLLOW);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_depend_pkginfo_DB(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See if user wants this to be handled as an old style pkg.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE : the ``exception_pkg()'' stuff is to be used only
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * through on495. This function comes out for on1095. See
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * PSARC 1993-546. -- JST
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getenv("NONABI_SCRIPTS") != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland old_pkg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See if the user wants to process symlinks consistent with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the old behavior.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getenv("PKG_NONABI_SYMLINKS") != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland old_symlinks = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (devtype((spoolDir ? spoolDir : get_PKGLOC()), &pkgdev) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_BAD_DEVICE, spoolDir ? spoolDir : get_PKGLOC());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = pkgdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland repeat = ((optind >= argc) && pkgdev.mount);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * error if there are packages on the command line and a category
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * was specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (optind < argc && catg_arg != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGS_AND_CAT_PKGRM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * main package processing "loop"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **pkglist; /* points to array of pkgs */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mount the spool device if required
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&pkgdev, NULL, 0, 0, 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(pkgdev.dirname)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CHDIR, pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * spool device mounted/available - get the list of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = pkgGetPackageList(&pkglist, argv, optind,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland catg_arg, category, &pkgdev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (n) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case -1: /* no packages found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGLIST_RM_NONFOUND,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PSTR(pkgdev.dirname));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NOPKGS, pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 0: /* packages found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default: /* "quit" error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGLIST_RM_ERROR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * count the number of packages to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: npkgs is a global variable that is referenced by quit.c
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when error messages are generated - it is referenced directly
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by the other functions called below...
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (npkgs = 0; pkglist[npkgs] != (char *)NULL; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgLgth = strlen(pkglist[npkgs]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgLgth > longestPkg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland longestPkg = pkgLgth;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKG_SELECTED, npkgs, pkglist[npkgs]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output number of packages to be removed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_NUM_PKGS_TO_REMOVE, npkgs, longestPkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package list generated - remove packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = remove_packages(pkglist, nodelete, longestPkg, repeat,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland altBinDir, pkgdev.dirname, spoolDir, noZones);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unmount the spool directory if necessary
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) chdir("/");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgumount(&pkgdev)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGUNMOUNT, pkgdev.bdevice);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * continue with next sequence of packages if continue set
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * not continuing - quit with 0 exit code
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#ifdef lint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif /* lint */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * static internal (private) functions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *****************************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: doRemove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove a package from the global zone, and optionally from one
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or more non-global zones.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_longestPkg - length of the longest package "name" (for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output format alignment)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_adminFile - pointer to string representing the admin
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file to pass to pkgremove when removing a package from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the global zone only. Typically the admin file used for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the global zone is the admin file passed in by the user.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is == NULL no admin file is given to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneAdminFile - pointer to string representing the admin
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file to pass to pkgremove when removing the package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from a non-global zone only. Typically the admin file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * used for non-global zones supresses all checks since
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the dependency checking is done for all zones first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * before proceeding.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * A zoneAdminFile MUST be specified if a_zlst != NULL.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * A zoneAdminFile must NOT be specified if a_zlst == NULL.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zlst - list of zones to process; NULL if no zones to process.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlanddoRemove(int a_nodelete, char *a_altBinDir, int a_longestPkg, char *a_adminFile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_zoneAdminFile, zoneList_t a_zlst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *zoneName;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char ans[MAX_INPUT];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int zoneIndex;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int zonesSkipped;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *pinfo = (struct pkginfo *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_state_t zst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst != (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* zone list specified - zone admin file required */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneAdminFile != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_zoneAdminFile != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no zone list specified - no zone admin file needed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneAdminFile == (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTE: required 'pkgdir' set to spool directory or NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = pkginfoIsPkgInstalled(&pinfo, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NO_SUCH_INSTANCE, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_DOREMOVE_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_DOREMOVE_ARGS, PSTR(pinfo->pkginst), PSTR(pinfo->name),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PSTR(pinfo->arch), PSTR(pinfo->version), PSTR(pinfo->basedir),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PSTR(pinfo->catg), pinfo->status);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!nointeract) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char fmt1[100];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create format based on max pkg name length */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(fmt1, sizeof (fmt1), " %%-%d.%ds %%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_longestPkg, a_longestPkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->status == PI_SPOOLED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(INFO_SPOOLED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getuid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(INFO_INSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(fmt1, pinfo->pkginst, pinfo->name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->arch || pinfo->version) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char fmt2[100];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create format based on max pkg name length */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(fmt2, sizeof (fmt2), " %%%d.%ds ",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_longestPkg, a_longestPkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED variable format specifier to fprintf() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, fmt2, "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->arch) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "(%s) ", pinfo->arch);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->version) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "%s", pinfo->version);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = ckyorn(ans, NULL, NULL, NULL, ASK_CONFIRM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("yY", *ans) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->status == PI_SPOOLED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* removal from a directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(INFO_RMSPOOL, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rrmdir(pkginst));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit if not root */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getuid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFree(&pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonesSkipped = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (interrupted != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_DOREMOVE_INTERRUPTED_B4_Z, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(MSG_DOREMOVE_INTERRUPTED_B4_Z, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "before pkgZoneRemove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag, doreboot, failflag, interrupted,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag, ireboot, nullflag, warnflag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zoneIndex = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_zlst != NULL &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) != NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneIndex++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the zone if it is NOT running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zst != ZONE_STATE_RUNNING && zst != ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonesSkipped++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_SKIPPING_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_REMOVE_PKG_FROM_ZONE, pkginst, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_PKG_FROM_ZONE, pkginst, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remove package from zone; use the zone admin file which
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * suppresses all checks.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = pkgZoneRemove(z_zlist_get_scratch(a_zlst, zoneIndex),
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington a_nodelete, a_altBinDir, a_zoneAdminFile,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington zst, B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "after pkgZoneRemove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag, doreboot, failflag, interrupted, intrflag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ireboot, nullflag, warnflag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zonesSkipped > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ZONES_SKIPPED, zonesSkipped);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zoneIndex = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL; zoneIndex++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the zone if it IS running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zst == ZONE_STATE_RUNNING ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst == ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonesSkipped++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_SKIPPING_ZONE_BOOT, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the zone if it is NOT bootable */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zlist_is_zone_runnable(a_zlst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneIndex) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_SKIPPING_ZONE_NOT_RUNNABLE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* mount up the zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_BOOTING_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_BOOTING_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_zlist_change_zone_state(a_zlst, zoneIndex,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ZONE_STATE_MOUNTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_BOOT_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set fatal error return condition */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_REMOVE_PKG_FROM_ZONE, pkginst, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remove package from zone; use the zone admin file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * which suppresses all checks.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = pkgZoneRemove(z_zlist_get_scratch(a_zlst,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington zoneIndex), a_nodelete, a_altBinDir,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington a_zoneAdminFile, ZONE_STATE_MOUNTED, B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "after pkgZoneRemove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag, doreboot, failflag, interrupted,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag, ireboot, nullflag, warnflag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* restore original state of zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_RESTORE_ZONE_STATE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_RESTORE_ZONE_STATE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_zlist_restore_zone_state(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Process global zone if it was either the only possible
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * target (no list of zones specified) or it appears in the list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zlst == NULL || z_on_zone_spec(GLOBAL_ZONENAME)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset interrupted flag before calling pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0; /* last action was NOT quit */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * call pkgremove for this package for the global zone;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * use the admin file passed in by the user via -a.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington n = pkgRemove(a_nodelete, a_altBinDir, a_adminFile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * function to clear out any exisiting error return conditions that may have
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * been set by previous calls to ckreturn()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandresetreturn()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag = 0; /* != 0 if any pkg op admin setting failure (4) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland doreboot = 0; /* != 0 if reboot required after installation (>= 10) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland failflag = 0; /* != 0 if fatal error has occurred (1) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag = 0; /* != 0 if user selected quit (3) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ireboot = 0; /* != 0 if immediate reboot required (>= 20) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nullflag = 0; /* != 0 if admin interaction required (5) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland warnflag = 0; /* != 0 if non-fatal error has occurred (2) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0; /* last pkg op was quit (1,2,3,4,5) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * function which checks the indicated return value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and indicates disposition of installation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandckreturn(int retcode)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * entry debugging info
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGRM_CKRETURN, retcode, PSTR(pkginst));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (retcode) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 0: /* successful */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 10:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 20:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break; /* empty case */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 1: /* package operation failed (fatal error) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 11:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 21:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland failflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 2: /* non-fatal error (warning) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 12:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 22:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland warnflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 3: /* user selected quit; operation interrupted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 13:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 23:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 4: /* admin settings prevented operation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 14:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 24:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 5: /* administration: interaction req (no -n) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 15:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 25:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nullflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland failflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retcode >= 20) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ireboot++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (retcode >= 10) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland doreboot++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary PenningtonpkgZoneCheckRemove(char *a_zoneName, char *a_altBinDir, char *a_adminFile,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington char *a_stdoutPath, zone_state_t a_zoneState, boolean_t tmpzone)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *arg[MAXARGS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char adminfd_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fds[MAX_FDS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int maxfds;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nargs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_zoneName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGZONECHECKREMOVE_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGZONECHECKREMOVE_ARGS, a_zoneName, PSTR(pkginst),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PSTR(pkgdev.dirname), PSTR(a_adminFile), PSTR(a_stdoutPath));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate path to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/pkgremove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* start at first file descriptor */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maxfds = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * generate argument list for call to pkgremove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* start at argument 0 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nargs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* first argument is path to executable */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* second argument is always: pass -O debug to pkgremove: debug mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "debug";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -b dir: pass -b to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_altBinDir != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-b";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = a_altBinDir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NONABI_SCRIPTS defined: pass -o to pkgremove; refers to a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkg requiring operator interaction during a procedure script
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (common before on1093)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (old_pkg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-o";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkgremove; process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * symlinks consistent with old behavior
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (old_symlinks) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-y";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -M: pass -M to pkgremove: don't mount client file systems */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-M";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -A: pass -A to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgrmremote) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-A";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -v: pass -v to pkgremove: never trace scripts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass "-O enable-hollow-package-support" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "enable-hollow-package-support";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass -n to pkgremove: always in noninteractive mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-n";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -a admin: pass -a admin to pkgremove: admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_adminFile) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fd = openLocal(a_adminFile, O_RDONLY, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(adminfd_path, sizeof (adminfd_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/proc/self/fd/%d", fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fds[maxfds++] = fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-a";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(adminfd_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgadd -R root: pass -R /a to pkgremove in mounted zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zoneState == ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-R";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "/a";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -F: pass -F to pkgremove: always update DB only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-F";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass "-O preremovecheck" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "preremovecheck";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add "-O addzonename" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "addzonename";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add parent zone info/type
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = z_get_zonename();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((p != NULL) && (*p != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-name=%s", p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* current zone type */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone() == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-type=%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TAG_VALUE_GLOBAL_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-type=%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TAG_VALUE_NONGLOBAL_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* Add arguments how to start the pkgserv */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik arg[nargs++] = "-O";
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik arg[nargs++] = pkgmodeargument(tmpzone ? RUN_ONCE : pkgservergetmode());
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass -N to pkgremove: program name to report */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-N";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = get_prog_name();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add package instance name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = pkginst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate argument list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* execute pkgremove command */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, a_zoneName, arg[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; arg[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ARG, n, arg[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate file descriptor list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fds[maxfds] = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exec command in zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = z_zone_exec(a_zoneName, path, arg, a_stdoutPath, (char *)NULL, fds);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ZONE_EXEC_EXIT, a_zoneName, arg[0], n,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PSTR(a_stdoutPath));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * close any files that were opened for use by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /proc/self/fd interface so they could be passed to programs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * via the z_zone_exec() interface
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (; maxfds > 0; maxfds--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fds[maxfds-1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of pkgremove in zone execution */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary PenningtonpkgZoneRemove(char *a_zoneName, int a_nodelete, char *a_altBinDir,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington char *a_adminFile, zone_state_t a_zoneState, boolean_t tmpzone)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *arg[MAXARGS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char adminfd_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fds[MAX_FDS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int maxfds;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nargs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneName != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_zoneName != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGZONEREMOVE_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGZONEREMOVE_ARGS, a_zoneName, PSTR(pkginst),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PSTR(pkgdev.dirname), a_nodelete, PSTR(a_adminFile));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate path to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/pkgremove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* start at first file descriptor */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maxfds = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * generate argument list for call to pkgremove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* start at argument 0 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nargs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* first argument is path to executable */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* second argument is always: pass -O debug to pkgremove: debug mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "debug";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -b dir: pass -b to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_altBinDir != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-b";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = a_altBinDir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NONABI_SCRIPTS defined: pass -o to pkgremove; refers to a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkg requiring operator interaction during a procedure script
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (common before on1093)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (old_pkg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-o";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkgremove; process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * symlinks consistent with old behavior
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (old_symlinks) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-y";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -M: pass -M to pkgremove: don't mount client file systems */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-M";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -A: pass -A to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgrmremote) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-A";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -v: pass -v to pkgremove: trace scripts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgverbose) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-v";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass "-O enable-hollow-package-support" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "enable-hollow-package-support";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -n: pass -n to pkgremove: noninteractive mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nointeract) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-n";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -a admin: pass -a admin to pkgremove: admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_adminFile) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fd = openLocal(a_adminFile, O_RDONLY, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(adminfd_path, sizeof (adminfd_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/proc/self/fd/%d", fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fds[maxfds++] = fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-a";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = adminfd_path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgadd -R root: pass -R /a to pkgremove in mounted zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_zoneState == ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-R";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "/a";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -F: pass -F to pkgremove: update DB only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_nodelete) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-F";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add "-O addzonename" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "addzonename";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add parent zone info/type
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = z_get_zonename();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((p != NULL) && (*p != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-name=%s", p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* current zone type */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone() == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-type=%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TAG_VALUE_GLOBAL_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-type=%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TAG_VALUE_NONGLOBAL_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* Add arguments how to start the pkgserv */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik arg[nargs++] = "-O";
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik arg[nargs++] = pkgmodeargument(tmpzone ? RUN_ONCE : pkgservergetmode());
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass -N to pkgremove: program name to report */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-N";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = get_prog_name();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add package instance name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = pkginst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate argument list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* execute pkgremove command */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, a_zoneName, arg[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; arg[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ARG, n, arg[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate file descriptor list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fds[maxfds] = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exec command in zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = z_zone_exec(a_zoneName, path, arg, (char *)NULL, (char *)NULL, fds);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * close any files that were opened for use by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /proc/self/fd interface so they could be passed to programs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * via the z_zone_exec() interface
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (; maxfds > 0; maxfds--) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fds[maxfds-1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgRemove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Invoke pkgremove in the current zone to perform a remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of a single package from the current zone or standalone system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_adminFile - pointer to string representing the admin
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file to pass to pkgremove when removing the package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is == NULL no admin file is given to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary PenningtonpkgRemove(int a_nodelete, char *a_altBinDir, char *a_adminFile)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *arg[MAXARGS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nargs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMOVE_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMOVE_ARGS, PSTR(pkginst), PSTR(pkgdev.dirname),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_nodelete, PSTR(a_adminFile));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/pkgremove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nargs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* first argument is path to executable */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* second argument is always: pass -O debug to pkgremove: debug mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "debug";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* Add arguments how to start the pkgserv */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik arg[nargs++] = "-O";
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik arg[nargs++] = pkgmodeargument(pkgservergetmode());
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -b dir: pass -b to pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_altBinDir != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-b";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = a_altBinDir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NONABI_SCRIPTS defined: pass -o to pkgremove; refers to a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkg requiring operator interaction during a procedure script
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (common before on1093)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (old_pkg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-o";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkgremove; process
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * symlinks consistent with old behavior
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (old_symlinks) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-y";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -M: pass -M to pkgrm: dont mount client file systems */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (no_map_client) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-M";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -A: pass -A to pkgrm */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgrmremote) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-A";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -v: pass -v to pkgremove: trace scripts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgverbose) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-v";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -n: pass -n to pkgremove: noninteractive mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nointeract) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-n";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -a admin: pass -a admin to pkgremove: admin file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_adminFile) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-a";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(a_adminFile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -V vfstab: pass -V vfstab to pkgremove: alternate vfstab */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vfstab_file) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-V";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = vfstab_file;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -R root: pass -R root to pkgremove: alternative root */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_an_inst_root()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-R";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = get_inst_root();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgrm -F: pass -F to pkgremove: update DB only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_nodelete) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-F";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add parent zone info/type
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = z_get_zonename();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((p != NULL) && (*p != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-name=%s", p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* current zone type */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-O";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone() == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-type=%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TAG_VALUE_GLOBAL_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char zn[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(zn, sizeof (zn),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parent-zone-type=%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TAG_VALUE_NONGLOBAL_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = strdup(zn);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pass -N to pkgremove: program name to report */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = "-N";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = get_prog_name();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add package instance name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = pkginst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* terminate argument list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland arg[nargs++] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * run the appropriate pkgremove command in the specified zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, "global", arg[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; arg[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ARG, n, arg[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* execute pkgremove command */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = pkgexecv(NULL, NULL, NULL, NULL, arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return results of pkgrm in this zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandusage(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prog = get_prog_name();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, ERR_USAGE_PKGRM, prog, prog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: remove_packages_in_global_with_zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove packages from the global zone and from non-global zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when run from the global zone and when non-global zones are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * present.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the name of one package to be removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_longestPkg - length of the longest package "name" (for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output format alignment)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_repeat - are there more packages avialable in "optind"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_TRUE - process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_FALSE - do not process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgdir - pointer to string representing the directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the packages to be removed are located.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zlst - list of zones to process; NULL if no zones to process.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandremove_packages_in_global_with_zones(char **a_pkgList, int a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir, char *a_pkgdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneList_t a_zlst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *zoneAdminFile = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *zoneName;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *scratchName;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char preremovecheckPath[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int savenpkgs = npkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int zoneIndex;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int zonesSkipped;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zone_state_t zst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zlst != (zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgList != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_longestPkg > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgdir != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgdir != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMPKGSGZWNGZ_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMPKGSGZWNGZ_ARGS, a_nodelete, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_repeat, PSTR(a_altBinDir), PSTR(a_pkgdir));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check all packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (check_packages(a_pkgList, a_pkgdir) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create temporary directory for use by zone operations */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland create_zone_tempdir(&zoneTempDir, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create hands off settings admin file for use in a non-global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland create_zone_adminfile(&zoneAdminFile, zoneTempDir, admnfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all of the packages (as listed in the package list) are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed one at a time from all non-global zones and then
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from the global zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset interrupted flag before calling pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0; /* last action was NOT quit */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip package if it is "in the global zone only" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgIsPkgInGzOnly(get_inst_root(), pkginst) == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if operation failed in global zone do not propagate to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonesSkipped = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (interrupted != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_DOREMOVE_INTERRUPTED, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_DOREMOVE_INTERRUPTED, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES, "before loop",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag, doreboot, failflag, interrupted,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag, ireboot, nullflag, warnflag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zoneIndex = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL; zoneIndex++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the zone if it is NOT running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zst != ZONE_STATE_RUNNING &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst != ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonesSkipped++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_SKIPPING_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CHECKREMOVE_PKG_IN_ZONE, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland scratchName = z_zlist_get_scratch(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(preremovecheckPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (preremovecheckPath),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s.%s.preremovecheck.txt",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneTempDir, pkginst, scratchName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dependency check this package this zone; use the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * user supplied admin file so that the appropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * level of dependency checking is (or is not) done.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington n = pkgZoneCheckRemove(scratchName, a_altBinDir,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington admnfile, preremovecheckPath,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik zst, B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "after pkgzonecheckremove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag, doreboot, failflag, interrupted,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag, ireboot, nullflag, warnflag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zonesSkipped == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ZONES_SKIPPED, zonesSkipped);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (zoneIndex = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL; zoneIndex++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the zone if it IS running */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zst == ZONE_STATE_RUNNING ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zst == ZONE_STATE_MOUNTED) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zonesSkipped++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_SKIPPING_ZONE_BOOT, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip the zone if it is NOT bootable */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_zlist_is_zone_runnable(a_zlst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneIndex) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_SKIPPING_ZONE_NOT_RUNNABLE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* mount up the zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_BOOTING_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_BOOTING_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_zlist_change_zone_state(a_zlst, zoneIndex,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ZONE_STATE_MOUNTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_BOOT_ZONE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set fatal error return condition */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_CHECKREMOVE_PKG_IN_ZONE, pkginst, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CHECKREMOVE_PKG_IN_ZONE, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland scratchName = z_zlist_get_scratch(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(preremovecheckPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (preremovecheckPath),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s.%s.preremovecheck.txt",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneTempDir, pkginst, scratchName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dependency check this package this zone; use the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * user supplied admin file so that the appropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * level of dependency checking is (or is not) done.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington n = pkgZoneCheckRemove(scratchName, a_altBinDir,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington admnfile, preremovecheckPath,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik ZONE_STATE_MOUNTED, B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_FLAG_VALUES,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "after pkgzonecheckremove",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnflag, doreboot, failflag, interrupted,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland intrflag, ireboot, nullflag, warnflag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* restore original state of zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_RESTORE_ZONE_STATE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_RESTORE_ZONE_STATE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_zlist_restore_zone_state(a_zlst, zoneIndex);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * look at all pre-remove check files
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = preremove_verify(a_pkgList, a_zlst, zoneTempDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(i);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs = savenpkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * reset all error return condition variables that may have been
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * set during package removal dependency checking so that they
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * do not reflect on the success/failure of the actual package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removal operations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland resetreturn();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all of the packages (as listed in the package list) are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed one at a time.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t in_gz_only;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland started = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland in_gz_only = pkgIsPkgInGzOnly(get_inst_root(), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset interrupted flag before calling pkgremove */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgrm invoked from within the global zone and there are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zones configured:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Remove the package from the global zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If not removing the package from the global zone only,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * then remove the package from the list of zones specified.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_gz_only) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* global zone only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* global zone and non-global zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneAdminFile, zoneAdminFile, a_zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all packages in the package list have been removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Continue with removal if:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- immediate reboot is NOT required
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- there are more packages to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * else return do NOT continue.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return 'dont continue' */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: remove_packages_in_nonglobal_zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove packages in a non-global zone when run from a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the name of one package to be removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_longestPkg - length of the longest package "name" (for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output format alignment)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_repeat - are there more packages avialable in "optind"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_TRUE - process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_FALSE - do not process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgdir - pointer to string representing the directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the packages to be removed are located.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandremove_packages_in_nonglobal_zone(char **a_pkgList, int a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir, char *a_pkgdir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *zoneAdminFile = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgList != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_longestPkg > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgdir != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgdir != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMPKGSNGZ_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMPKGSNGZ_ARGS, a_nodelete, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_repeat, PSTR(a_altBinDir), PSTR(a_pkgdir));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check all package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (check_packages(a_pkgList, a_pkgdir) != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create temporary directory for use by zone operations */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland create_zone_tempdir(&zoneTempDir, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create hands off settings admin file for use in a non-global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland create_zone_adminfile(&zoneAdminFile, zoneTempDir, admnfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all of the packages (as listed in the package list) are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed one at a time.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland started = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgrm invoked from within a non-global zone: remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package from the current zone only - no non-global
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zones are possible.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all packages in the package list have been removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Continue with removal if:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- immediate reboot is NOT required
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- there are more packages to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * else return do NOT continue.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return 'dont continue' */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: remove_packages_in_global_no_zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove packages from the global zone only when run in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * global zone and no non-global zones are installed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the name of one package to be removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_longestPkg - length of the longest package "name" (for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output format alignment)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_repeat - are there more packages avialable in "optind"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_TRUE - process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_FALSE - do not process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandremove_packages_in_global_no_zones(char **a_pkgList, int a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgList != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_longestPkg > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMPKGSGZNNGZ_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMPKGSGZNNGZ_ARGS, a_nodelete, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_repeat, PSTR(a_altBinDir));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all of the packages (as listed in the package list) are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed one at a time.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland started = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgrm invoked from within the global zone and there are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NO non-global zones configured:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Remove the package from the global zone only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all packages in the package list have been removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Continue with removal if:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- immediate reboot is NOT required
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- there are more packages to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * else return do NOT continue.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return 'dont continue' */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: remove_packages_from_spool_directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove packages from a spool directory only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the name of one package to be removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_longestPkg - length of the longest package "name" (for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output format alignment)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_repeat - are there more packages avialable in "optind"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_TRUE - process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_FALSE - do not process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandremove_packages_from_spool_directory(char **a_pkgList, int a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_longestPkg, int a_repeat, char *a_altBinDir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgList != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_longestPkg > 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all of the packages (as listed in the package list) are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed one at a time.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland started = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (shall_we_continue(pkginst, npkgs) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland interrupted = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgrm invoked from any type of zone BUT the target
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be removed is a local spool directory: remove the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages from the spool directory only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = doRemove(a_nodelete, a_altBinDir, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnfile, (char *)NULL, (zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set success/fail condition variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all packages in the package list have been removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Continue with removal if:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- immediate reboot is NOT required
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- there are more packages to remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * else return do NOT continue.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ireboot == 0) && (a_repeat != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return 'dont continue' */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: remove_packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Remove packages from the global zone, and optionally from one
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or more non-global zones, or from a specified spool directory.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_pkgList - pointer to array of strings, each string specifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the name of one package to be removed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_nodelete: should the files and scripts remain installed?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if != 0 pass -F flag to pkgremove - suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the removal of any files and any class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and suppress the running of any class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package files remain but the package looks like it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is not installed. This is mainly for use by upgrade.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - if == 0 do not pass -F flag to pkgremove - all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files and class action scripts are removed, and any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate class action scripts are run.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_longestPkg - length of the longest package "name" (for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output format alignment)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_repeat - are there more packages avialable in "optind"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_TRUE - process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_FALSE - do not process packages from optind
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_altBinDir - pointer to string representing location of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgremove executable to run. If not NULL, then pass
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the path specified to the -b option to pkgremove.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_pkgdir - pointer to string representing the directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where the packages to be removed are located.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_spoolDir - pointer to string specifying spool directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to remove packages from. If != NULL then all zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * processing is bypassed and the packages are removed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from the specified spool directory only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_noZones - if non-global zones are configured, should the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages be removed from the non-global zones?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_TRUE - do NOT remove packages from non-global zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - B_FALSE - remove packages from non-global zones
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int (see ckreturn() function for details)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - package operation failed (fatal error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 - non-fatal error (warning)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 - user selected quit (operation interrupted)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4 - admin settings prevented operation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5 - interaction required and -n (non-interactive) specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "10" will be added to indicate "immediate reboot required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "20" will be added to indicate "reboot after install required"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandremove_packages(char **a_pkgList, int a_nodelete, int a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_repeat, char *a_altBinDir, char *a_pkgdir, char *a_spoolDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t a_noZones)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneList_t zlst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgList != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVEPKGS_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVEPKGS_ARGS, npkgs, a_nodelete, a_longestPkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_repeat, PSTR(a_pkgdir), PSTR(a_spoolDir));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if removing from spool directory, bypass all zones checks
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_spoolDir != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* in non-global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_REMOVE_PKGS_FROM_SPOOL, a_spoolDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = remove_packages_from_spool_directory(a_pkgList, a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_longestPkg, a_repeat, a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit if not root */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getuid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if running in the global zone AND one or more non-global
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * zones exist, add packages in a 'zones aware' manner, else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add packages in the standard 'non-zones aware' manner.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_noZones == B_FALSE) && (z_running_in_global_zone() == B_FALSE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* in non-global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_IN_LZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_lock_this_zone(ZLOCKS_PKG_ADMIN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_LOCK_THIS_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set fatal error return condition */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = remove_packages_in_nonglobal_zone(a_pkgList, a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_longestPkg, a_repeat, a_altBinDir, a_pkgdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) z_unlock_this_zone(ZLOCKS_ALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* running in the global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_non_global_zones_exist();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_noZones == B_FALSE) && (b == B_TRUE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_IN_GZ_WITH_LZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get a list of all non-global zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zlst = z_get_nonglobal_zone_list();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zlst == (zoneList_t)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_GET_ZONE_LIST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* need to lock all of the zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetZonelist(zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_lock_zones(zlst, ZLOCKS_PKG_ADMIN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_free_zone_list(zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_LOCK_ZONES);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set fatal error return condition */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add packages to all zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = remove_packages_in_global_with_zones(a_pkgList, a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_longestPkg, a_repeat, a_altBinDir, a_pkgdir, zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unlock all zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) z_unlock_zones(zlst, ZLOCKS_ALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetZonelist((zoneList_t)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free list of all non-global zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_free_zone_list(zlst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* in global zone no non-global zones */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_IN_GZ_NO_LZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_lock_this_zone(ZLOCKS_PKG_ADMIN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b != B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_LOCK_THIS_ZONE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set fatal error return condition */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = remove_packages_in_global_no_zones(a_pkgList, a_nodelete,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_longestPkg, a_repeat, a_altBinDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) z_unlock_this_zone(ZLOCKS_ALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: path_valid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Checks a string for being a valid path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: path - path to validate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns : B_TRUE - success, B_FALSE otherwise.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE means path was null, too long (>PATH_MAX),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or too short (<1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpath_valid(char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (path == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strlen(path) > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strlen(path) >= 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path < 1 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcheck_packages(char **a_pkgList, char *a_packageDir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int savenpkgs = npkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CAF_T flags = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set flags for applicability check */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone() == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland flags |= CAF_IN_GLOBAL_ZONE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for each package to remove, verify that the package is installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and is removable.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check package applicability */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (check_applicability(a_packageDir, pkginst, get_inst_root(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland flags) == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKG_NOT_REMOVABLE, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs = savenpkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs = savenpkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - is this package removable from this zone?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - does the scope of remove conflict with existing installation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcheck_applicability(char *a_packageDir, char *a_pkgInst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_rootPath, CAF_T a_flags)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *pkginfoFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t all_zones; /* pkg is "all zones" only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginfoPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkgpath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_packageDir != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_packageDir != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_pkgInst != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_pkgInst != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* normalize root path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_rootPath == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_rootPath = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * determine if this package is currently installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if not installed return success - operation will fail
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when the removal is attempted
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfoIsPkgInstalled((struct pkginfo **)NULL, a_pkgInst) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calculate paths to various objects
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(pkgpath, sizeof (pkgpath), "%s/%s", a_packageDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (pkgpath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, a_packageDir, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not installed then just return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(pkgpath) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NO_PKGDIR, pkgpath, a_pkgInst, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = snprintf(pkginfoPath, sizeof (pkginfoPath),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/pkginfo", pkgpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len > sizeof (pkgpath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, pkgpath, "pkginfo");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * gather information from this packages pkginfo file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFP = fopen(pkginfoPath, "r");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfoFP == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NO_PKG_INFOFILE, a_pkgInst, pkginfoPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine "ALLZONES" setting for this package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland all_zones = pkginfoParamTruth(pkginfoFP, PKG_ALLZONES_VARIABLE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "true", B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(pkginfoFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* gather information from the global zone only file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * verify package applicability based on information gathered;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package IS currently installed....
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkg ALLZONES=true & not running in global zone */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((all_zones == B_TRUE) && (!(a_flags & CAF_IN_GLOBAL_ZONE))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ALLZONES_AND_IN_LZ_PKGRM, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: shall_we_continue
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Called from within a loop that is installing packages,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this function examines various global variables and decides
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * whether or not to ask an appropriate question, and wait for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and appropriate reply.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: <<global variables>>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE - continue processing with next package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - do not continue processing with next package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandshall_we_continue(char *a_pkgInst, int a_npkgs)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char ans[MAX_INPUT];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return FALSE if immediate reboot required */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ireboot) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ptext(stderr, MSG_SUSPEND_RM, a_pkgInst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return TRUE if not interrupted */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!interrupted) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output appropriate interrupt message */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(a_npkgs == 1 ? MSG_1MORETODO : MSG_MORETODO, a_npkgs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if running with no interaction (-n) do not ask question */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nointeract) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* interaction possible: ask question */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = ckyorn(ans, NULL, NULL, NULL, ASK_CONTINUE_RM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("yY", *ans) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: create_zone_adminfile
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a zone temporary directory and optionally an existing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file, generate an administration file that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can be used to perform "non-interactive" operations in a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_zoneAdminFile - pointer to handle that will contain a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string representing the path to the temporary
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file created - this must be NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * before the first call to this function - on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * subsequent calls if the pointer is NOT null then
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the existing string will NOT be overwritten.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneTempDir - pointer to string representing the path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the zone temporary directory to create the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary administration file in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_admnfile - pointer to string representing the path to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * an existing "user" administration file - the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file created will contain the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * settings contained in this file, modified as
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * appropriate to supress any interaction;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is == NULL then the administration file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * created will not contain any extra settings
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: On any error this function will call 'quit(1)'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcreate_zone_adminfile(char **r_zoneAdminFile, char *a_zoneTempDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_admnfile)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_zoneAdminFile != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_zoneTempDir != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_zoneTempDir != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CREATE_ZONE_ADMINFILE, a_zoneTempDir, PSTR(a_admnfile));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if temporary name already exists, do not overwrite */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*r_zoneAdminFile != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create temporary name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *r_zoneAdminFile = tempnam(a_zoneTempDir, "zadmn");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = z_create_zone_admin_file(*r_zoneAdminFile, a_admnfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_TMPADMIN, *r_zoneAdminFile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CREATED_ZONE_ADMINFILE, *r_zoneAdminFile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: create_zone_tempdir
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Given a system temporary directory, create a "zone" specific
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary directory and return the path to the directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * created.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: r_zoneTempDir - pointer to handle that will contain a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * string representing the path to the temporary
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory created - this must be NULL before the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * first call to this function - on subsequent calls
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if the pointer is NOT null then the existing string
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * will NOT be overwritten.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a_zoneTempDir - pointer to string representing the path
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the system temporary directory to create the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary zone directory in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: Any string returned is placed in new storage for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * calling method. The caller must use 'free' to dispose
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the storage once the string is no longer needed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: On any error this function will call 'quit(1)'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: This function calls "quitSetZoneTmpdir" on success to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * register the directory created with quit() so that the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory will be automatically deleted on exit.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcreate_zone_tempdir(char **r_zoneTempDir, char *a_tmpdir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry assertions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(r_zoneTempDir != (char **)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(a_tmpdir != (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(*a_tmpdir != '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CREATE_ZONE_TEMPDIR, a_tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if temporary directory already exists, do not overwrite */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*r_zoneTempDir != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create temporary directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = setup_temporary_directory(r_zoneTempDir, a_tmpdir, "ztemp");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ZONETEMPDIR, a_tmpdir, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* register with quit() to directory is removed on exit */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetZoneTmpdir(*r_zoneTempDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CREATED_ZONE_TEMPDIR, *r_zoneTempDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}