15c51f124SMoriah Waterland /*
25c51f124SMoriah Waterland * CDDL HEADER START
35c51f124SMoriah Waterland *
45c51f124SMoriah Waterland * The contents of this file are subject to the terms of the
55c51f124SMoriah Waterland * Common Development and Distribution License (the "License").
65c51f124SMoriah Waterland * You may not use this file except in compliance with the License.
75c51f124SMoriah Waterland *
85c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing.
105c51f124SMoriah Waterland * See the License for the specific language governing permissions
115c51f124SMoriah Waterland * and limitations under the License.
125c51f124SMoriah Waterland *
135c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
145c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the
165c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
175c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
185c51f124SMoriah Waterland *
195c51f124SMoriah Waterland * CDDL HEADER END
205c51f124SMoriah Waterland */
215c51f124SMoriah Waterland
2232991bedSPeter Tribble /*
2369aea4bfSPeter Tribble * Copyright (c) 2018 Peter Tribble.
2432991bedSPeter Tribble */
2532991bedSPeter Tribble
265c51f124SMoriah Waterland /*
276e1ae2a3SGary Pennington * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
285c51f124SMoriah Waterland */
295c51f124SMoriah Waterland
305c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
315c51f124SMoriah Waterland /* All Rights Reserved */
325c51f124SMoriah Waterland
335c51f124SMoriah Waterland
345c51f124SMoriah Waterland /*
355c51f124SMoriah Waterland * Program: pkgadd / pkgask
365c51f124SMoriah Waterland *
375c51f124SMoriah Waterland * Function: public command and private utility functions that
385c51f124SMoriah Waterland * implement the package add and package ask operations.
395c51f124SMoriah Waterland *
405c51f124SMoriah Waterland */
415c51f124SMoriah Waterland
425c51f124SMoriah Waterland /*
435c51f124SMoriah Waterland * System includes
445c51f124SMoriah Waterland */
455c51f124SMoriah Waterland
465c51f124SMoriah Waterland #include <stdio.h>
475c51f124SMoriah Waterland #include <limits.h>
485c51f124SMoriah Waterland #include <stdlib.h>
495c51f124SMoriah Waterland #include <unistd.h>
505c51f124SMoriah Waterland #include <string.h>
515c51f124SMoriah Waterland #include <fcntl.h>
525c51f124SMoriah Waterland #include <sys/types.h>
535c51f124SMoriah Waterland #include <sys/stat.h>
545c51f124SMoriah Waterland #include <signal.h>
555c51f124SMoriah Waterland #include <errno.h>
565c51f124SMoriah Waterland #include <pkgdev.h>
575c51f124SMoriah Waterland #include <pkginfo.h>
585c51f124SMoriah Waterland #include <pkglocs.h>
595c51f124SMoriah Waterland #include <locale.h>
605c51f124SMoriah Waterland #include <libintl.h>
615c51f124SMoriah Waterland #include <pkgtrans.h>
625c51f124SMoriah Waterland #include <assert.h>
635c51f124SMoriah Waterland
645c51f124SMoriah Waterland /*
655c51f124SMoriah Waterland * consolidation pkg command library includes
665c51f124SMoriah Waterland */
675c51f124SMoriah Waterland #include <pkglib.h>
685c51f124SMoriah Waterland
695c51f124SMoriah Waterland #include <instzones_api.h>
705c51f124SMoriah Waterland
715c51f124SMoriah Waterland /*
725c51f124SMoriah Waterland * local pkg command library includes
735c51f124SMoriah Waterland */
745c51f124SMoriah Waterland #include <install.h>
755c51f124SMoriah Waterland #include <libinst.h>
765c51f124SMoriah Waterland #include <libadm.h>
775c51f124SMoriah Waterland #include <messages.h>
785c51f124SMoriah Waterland
795c51f124SMoriah Waterland
805c51f124SMoriah Waterland /*
815c51f124SMoriah Waterland * pkgadd local includes
825c51f124SMoriah Waterland */
835c51f124SMoriah Waterland
845c51f124SMoriah Waterland #include "quit.h"
855c51f124SMoriah Waterland
865c51f124SMoriah Waterland /*
875c51f124SMoriah Waterland * imported global variables/functions
885c51f124SMoriah Waterland */
895c51f124SMoriah Waterland
905c51f124SMoriah Waterland /* check.c */
915c51f124SMoriah Waterland extern int preinstall_verify(char **a_pkgList, zoneList_t a_zlst,
925c51f124SMoriah Waterland char *a_zoneTempDir);
935c51f124SMoriah Waterland
945c51f124SMoriah Waterland /*
955c51f124SMoriah Waterland * ckquit is a global that controls 'ckyorn' (defined in libadm)
965c51f124SMoriah Waterland * If ckquit is non-zero, then "quit" is allowed as an answer when
975c51f124SMoriah Waterland * ckyorn is called. If is it zero, then "quit" is not an allowed answer.
985c51f124SMoriah Waterland */
995c51f124SMoriah Waterland extern int ckquit;
1005c51f124SMoriah Waterland
1015c51f124SMoriah Waterland /*
1025c51f124SMoriah Waterland * exported global variables
1035c51f124SMoriah Waterland */
1045c51f124SMoriah Waterland
1055c51f124SMoriah Waterland /* these globals are set by ckreturn and used by quit.c */
1065c51f124SMoriah Waterland
1075c51f124SMoriah Waterland int admnflag = 0; /* != 0 if any pkg op admin setting failure (4) */
1085c51f124SMoriah Waterland int doreboot = 0; /* != 0 if reboot required after installation */
1095c51f124SMoriah Waterland int failflag = 0; /* != 0 if fatal error has occurred (1) */
1105c51f124SMoriah Waterland int intrflag = 0; /* != 0 if user selected quit (3) */
1115c51f124SMoriah Waterland int ireboot = 0; /* != 0 if immediate reboot required */
1125c51f124SMoriah Waterland int nullflag = 0; /* != 0 if admin interaction required (5) */
1135c51f124SMoriah Waterland int warnflag = 0; /* != 0 if non-fatal error has occurred (2) */
1145c51f124SMoriah Waterland
1155c51f124SMoriah Waterland /* imported by quit.c */
1165c51f124SMoriah Waterland int npkgs = 0; /* the number of packages yet to be installed */
1175c51f124SMoriah Waterland
1185c51f124SMoriah Waterland /* imported by various (many) */
1195c51f124SMoriah Waterland char *respfile = NULL; /* response pathname (or NULL) */
1205c51f124SMoriah Waterland char *tmpdir = NULL; /* location to place temporary files */
1215c51f124SMoriah Waterland
1225c51f124SMoriah Waterland struct admin adm; /* holds info about installation admin */
1235c51f124SMoriah Waterland struct pkgdev pkgdev; /* holds info about the installation device */
1245c51f124SMoriah Waterland
1255c51f124SMoriah Waterland /*
1265c51f124SMoriah Waterland * internal global variables
1275c51f124SMoriah Waterland */
1285c51f124SMoriah Waterland
1295c51f124SMoriah Waterland static char *admnfile = NULL; /* file to use for installation admin */
1305c51f124SMoriah Waterland static char *ids_name = NULL; /* name of data stream device */
1315c51f124SMoriah Waterland static char *pkgcontsrc = NULL; /* continuation file (-c option) */
1325c51f124SMoriah Waterland static char *pkgdrtarg = NULL; /* dry run file (-D option) */
1335c51f124SMoriah Waterland static char *pkginst = NULL; /* current pkg/src instance 2 process */
1345c51f124SMoriah Waterland static char *respdir = NULL; /* respfile is a directory spec */
1355c51f124SMoriah Waterland static char *rw_block_size = NULL;
1365c51f124SMoriah Waterland static char *vfstab_file = NULL;
1375c51f124SMoriah Waterland static int askflag = 0; /* non-zero if invoked as "pkgask" */
1385c51f124SMoriah Waterland static int disableAttributes = 0; /* Disabling attribute checking */
1395c51f124SMoriah Waterland static int disableChecksum = 0; /* Disable checksumming */
1405c51f124SMoriah Waterland static int disableSaveSpool = 0; /* Disable partial spool dir create */
1415c51f124SMoriah Waterland static int init_install = 0; /* inform scripts initial install */
1425c51f124SMoriah Waterland static int no_map_client = 0; /* do not map from vfstab file */
1435c51f124SMoriah Waterland static int nointeract = 0; /* non-zero - no user interaction */
1445c51f124SMoriah Waterland static int pkgverbose = 0; /* non-zero if verbose mode selected */
1455c51f124SMoriah Waterland static int saveSpoolInstall = 0; /* installing from save spool dir */
1465c51f124SMoriah Waterland static int suppressCopyright = 0; /* suppress copyright notices */
1475c51f124SMoriah Waterland
1485c51f124SMoriah Waterland /* set by ckreturn() */
1495c51f124SMoriah Waterland
1505c51f124SMoriah Waterland static int interrupted = 0; /* last pkg op was quit (1,2,3,4,5) */
1515c51f124SMoriah Waterland static int needconsult = 0; /* essential ask admin now (1,2,3,5) */
1525c51f124SMoriah Waterland
1535c51f124SMoriah Waterland /* Set by -O nozones: do not process any zones */
1545c51f124SMoriah Waterland
1555c51f124SMoriah Waterland static boolean_t noZones = B_FALSE;
1565c51f124SMoriah Waterland
1575c51f124SMoriah Waterland /* Set by -O zonelist=<names...>: process only named zones */
1585c51f124SMoriah Waterland
1595c51f124SMoriah Waterland static boolean_t usedZoneList = B_FALSE;
1605c51f124SMoriah Waterland
1615c51f124SMoriah Waterland /* Set by -O debug: debug output is enabled? */
1625c51f124SMoriah Waterland
1635c51f124SMoriah Waterland static boolean_t debugFlag = B_FALSE;
1645c51f124SMoriah Waterland
1655c51f124SMoriah Waterland /* Set by the -G option: install packages in global zone only */
1665c51f124SMoriah Waterland
1675c51f124SMoriah Waterland static boolean_t globalZoneOnly = B_FALSE;
1685c51f124SMoriah Waterland
1695c51f124SMoriah Waterland /*
1705c51f124SMoriah Waterland * Assume the package is ABI and POSIX compliant as regards user
1715c51f124SMoriah Waterland * interactiion during procedure scripts.
1725c51f124SMoriah Waterland */
1735c51f124SMoriah Waterland
1745c51f124SMoriah Waterland static int old_pkg = 0;
1755c51f124SMoriah Waterland
1765c51f124SMoriah Waterland /* Assume pkg should be installed according to the ABI */
1775c51f124SMoriah Waterland
1785c51f124SMoriah Waterland static int old_symlinks = 0;
1795c51f124SMoriah Waterland
1805c51f124SMoriah Waterland /*
1815c51f124SMoriah Waterland * Default name length will be 32 chars - if this is set,
1825c51f124SMoriah Waterland * disable the 32 char name limit extension
1835c51f124SMoriah Waterland */
1845c51f124SMoriah Waterland
1855c51f124SMoriah Waterland static int ABI_namelength = 0;
1865c51f124SMoriah Waterland
1875c51f124SMoriah Waterland #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
1885c51f124SMoriah Waterland #define TEXT_DOMAIN "SYS_TEST"
1895c51f124SMoriah Waterland #endif
1905c51f124SMoriah Waterland
1915c51f124SMoriah Waterland /* printable string - if string is null results in ??? */
1925c51f124SMoriah Waterland
1935c51f124SMoriah Waterland #define PSTR(STR) (((STR) == (char *)NULL) ? "???" : (STR))
1945c51f124SMoriah Waterland
1955c51f124SMoriah Waterland #define MAX_FDS 20
1965c51f124SMoriah Waterland
1975c51f124SMoriah Waterland /*
1985c51f124SMoriah Waterland * forward declarations
1995c51f124SMoriah Waterland */
2005c51f124SMoriah Waterland
2015c51f124SMoriah Waterland static int boot_and_pkginstall_check_in_zones(zoneList_t a_zlst,
2025c51f124SMoriah Waterland char *a_idsName, char *a_altBinDir,
2035c51f124SMoriah Waterland char *a_zoneAdminFile, char *a_zoneTempDir);
2045c51f124SMoriah Waterland static int boot_and_install_in_zones(zoneList_t a_zlst,
2055c51f124SMoriah Waterland char *a_idsName, char *a_altBinDir,
2065c51f124SMoriah Waterland char *a_zoneAdminFile, char *a_zoneTempDir);
2076e1ae2a3SGary Pennington static void pkginstall_check_in_one_zone(char *a_zoneName,
2086e1ae2a3SGary Pennington char *a_idsName, char *a_zoneAdminFile,
2096e1ae2a3SGary Pennington char *a_zoneTempDir, char *a_altBinDir,
2106e1ae2a3SGary Pennington char *a_scratchName, zone_state_t a_zoneState,
2116e1ae2a3SGary Pennington boolean_t a_tmpzn);
2125c51f124SMoriah Waterland static void ckreturn(int retcode);
2135c51f124SMoriah Waterland static void create_zone_adminfile(char **r_zoneAdminFile,
2145c51f124SMoriah Waterland char *a_zoneTempDir, char *a_admnfile);
2155c51f124SMoriah Waterland static void create_zone_tempdir(char **r_zoneTempDir,
2165c51f124SMoriah Waterland char *a_tmpdir);
2176e1ae2a3SGary Pennington static void install_in_one_zone(char *a_zoneName, char *a_idsName,
2185c51f124SMoriah Waterland char *a_zoneAdminFile, char *a_zoneTempDir,
21962224350SCasper H.S. Dik char *a_altBinDir, zone_state_t a_zoneState,
22062224350SCasper H.S. Dik boolean_t a_tmpzn);
2215c51f124SMoriah Waterland static int pkginstall_check_in_zones(zoneList_t a_zlst,
2225c51f124SMoriah Waterland char *a_idsName, char *a_altBinDir,
2235c51f124SMoriah Waterland char *a_zoneAdminFile, char *a_zoneTempDir);
2245c51f124SMoriah Waterland static int install_in_zones(zoneList_t a_zlst, char *a_idsName,
2255c51f124SMoriah Waterland char *a_altBinDir, char *a_zoneAdminFile,
2265c51f124SMoriah Waterland char *a_zoneTempDir);
2275c51f124SMoriah Waterland static int pkgInstall(char *ir, char *a_idsName, char *a_pkgDir,
2286e1ae2a3SGary Pennington char *a_altBinDir);
2295c51f124SMoriah Waterland static int pkgZoneCheckInstall(char *a_zoneName,
2305c51f124SMoriah Waterland zone_state_t a_zoneState,
2315c51f124SMoriah Waterland char *a_idsName, char *a_altBinDir,
23262224350SCasper H.S. Dik char *a_adminFile, char *a_stdoutPath,
23362224350SCasper H.S. Dik boolean_t a_tmpzn);
2345c51f124SMoriah Waterland static int pkgZoneInstall(char *a_zoneName,
2355c51f124SMoriah Waterland zone_state_t a_zoneState,
2365c51f124SMoriah Waterland char *a_idsName, char *a_altBinDir,
23762224350SCasper H.S. Dik char *a_adminFile, boolean_t a_tmpzn);
2385c51f124SMoriah Waterland static void resetreturn();
2395c51f124SMoriah Waterland static void usage(void);
24032991bedSPeter Tribble static boolean_t add_packages(char **a_pkgList,
2415c51f124SMoriah Waterland char *a_idsName, int a_repeat,
2425c51f124SMoriah Waterland char *a_altBinDir, char *a_device,
2435c51f124SMoriah Waterland boolean_t a_noZones);
2445c51f124SMoriah Waterland static boolean_t add_packages_in_global_no_zones(char **a_pkgList,
24532991bedSPeter Tribble char *a_idsName, int a_repeat,
2465c51f124SMoriah Waterland char *a_altBinDir, char *a_device);
2475c51f124SMoriah Waterland static boolean_t add_packages_in_global_with_zones(char **a_pkgList,
24832991bedSPeter Tribble char *a_idsName, int a_repeat,
2495c51f124SMoriah Waterland char *a_altBinDir, char *a_device,
2505c51f124SMoriah Waterland zoneList_t a_zlst);
2515c51f124SMoriah Waterland static boolean_t add_packages_in_nonglobal_zone(char **a_pkgList,
25232991bedSPeter Tribble char *a_idsName, int a_repeat,
2535c51f124SMoriah Waterland char *a_altBinDir, char *a_device);
2545c51f124SMoriah Waterland static boolean_t check_applicability(char *a_packageDir,
2555c51f124SMoriah Waterland char *a_pkgInst, char *a_rootPath,
2565c51f124SMoriah Waterland CAF_T a_flags);
2575c51f124SMoriah Waterland static boolean_t get_package_list(char ***r_pkgList, char **a_argv,
2585c51f124SMoriah Waterland char *a_categories, char **a_categoryList,
25932991bedSPeter Tribble char *a_idsName, int *r_repeat);
2605c51f124SMoriah Waterland static boolean_t continue_installation(void);
2615c51f124SMoriah Waterland static boolean_t unpack_and_check_packages(char **a_pkgList,
2625c51f124SMoriah Waterland char *a_idsName, char *a_packageDir);
2635c51f124SMoriah Waterland /*
2645c51f124SMoriah Waterland * *****************************************************************************
2655c51f124SMoriah Waterland * global external (public) functions
2665c51f124SMoriah Waterland * *****************************************************************************
2675c51f124SMoriah Waterland */
2685c51f124SMoriah Waterland
2695c51f124SMoriah Waterland /*
2705c51f124SMoriah Waterland * Name: main
2715c51f124SMoriah Waterland * Description: main entry point for pkgadd/pkgask
2725c51f124SMoriah Waterland * Returns: int
2735c51f124SMoriah Waterland * 0 Successful completion
2745c51f124SMoriah Waterland * 1 Fatal error.
2755c51f124SMoriah Waterland * 2 Warning.
2765c51f124SMoriah Waterland * 3 Interruption.
2775c51f124SMoriah Waterland * 4 Administration.
2785c51f124SMoriah Waterland * 5 Administration. Interaction is required. Do not use pkgadd -n.
2795c51f124SMoriah Waterland * In addition, one of the following values may be added to the previous value
2805c51f124SMoriah Waterland * as appropriate:
2815c51f124SMoriah Waterland * 10 Reboot after installation of all packages.
2825c51f124SMoriah Waterland * 20 Reboot after installation of this package.
2835c51f124SMoriah Waterland * For example, "14" would indicate both "administration" and "reboot after
2845c51f124SMoriah Waterland * installation of all packages".
2855c51f124SMoriah Waterland */
2865c51f124SMoriah Waterland
2875c51f124SMoriah Waterland int
main(int argc,char ** argv)2885c51f124SMoriah Waterland main(int argc, char **argv)
2895c51f124SMoriah Waterland {
2905c51f124SMoriah Waterland char **category = NULL;
2915c51f124SMoriah Waterland char *abiPtr;
2925c51f124SMoriah Waterland char *altBinDir = (char *)NULL;
2935c51f124SMoriah Waterland char *catg_arg = NULL;
2945c51f124SMoriah Waterland char *device = NULL; /* dev pkg stored on */
2955c51f124SMoriah Waterland char *p;
2965c51f124SMoriah Waterland char *q;
2975c51f124SMoriah Waterland char *prog;
2985c51f124SMoriah Waterland char *prog_full_name = NULL;
2995c51f124SMoriah Waterland char *spoolDir = NULL; /* specified with -s */
3005c51f124SMoriah Waterland char Rpath[PATH_MAX+1] = {'\0'};
3015c51f124SMoriah Waterland int c;
3025c51f124SMoriah Waterland int n;
3035c51f124SMoriah Waterland int repeat;
3045c51f124SMoriah Waterland struct sigaction nact;
3055c51f124SMoriah Waterland struct sigaction oact;
3065c51f124SMoriah Waterland
3075c51f124SMoriah Waterland /* initialize locale environment */
3085c51f124SMoriah Waterland
3095c51f124SMoriah Waterland (void) setlocale(LC_ALL, "");
3105c51f124SMoriah Waterland (void) textdomain(TEXT_DOMAIN);
3115c51f124SMoriah Waterland
3125c51f124SMoriah Waterland /* initialize program name */
3135c51f124SMoriah Waterland
3145c51f124SMoriah Waterland prog_full_name = argv[0];
3155c51f124SMoriah Waterland prog = set_prog_name(argv[0]);
3165c51f124SMoriah Waterland
3175c51f124SMoriah Waterland /* tell spmi zones interface how to access package output functions */
3185c51f124SMoriah Waterland
3195c51f124SMoriah Waterland z_set_output_functions(echo, echoDebug, progerr);
3205c51f124SMoriah Waterland
3215c51f124SMoriah Waterland askflag = (strcmp(prog, "pkgask") == 0);
3225c51f124SMoriah Waterland
3235c51f124SMoriah Waterland /* set sane umask */
3245c51f124SMoriah Waterland
3255c51f124SMoriah Waterland (void) umask(0022);
3265c51f124SMoriah Waterland
3275c51f124SMoriah Waterland /* tell quit which ckreturn function to call */
3285c51f124SMoriah Waterland
3295c51f124SMoriah Waterland quitSetCkreturnFunc(&ckreturn);
3305c51f124SMoriah Waterland
3315c51f124SMoriah Waterland /* initially no source "device" */
3325c51f124SMoriah Waterland
3335c51f124SMoriah Waterland device = NULL;
3345c51f124SMoriah Waterland
3355c51f124SMoriah Waterland /* reset npkgs (used as pkg remaining count in quit.c) */
3365c51f124SMoriah Waterland
3375c51f124SMoriah Waterland npkgs = 0;
3385c51f124SMoriah Waterland
3395c51f124SMoriah Waterland if (z_running_in_global_zone() && !enable_local_fs()) {
3405c51f124SMoriah Waterland progerr(ERR_CANNOT_ENABLE_LOCAL_FS);
3415c51f124SMoriah Waterland }
3425c51f124SMoriah Waterland
34362224350SCasper H.S. Dik pkgserversetmode(DEFAULTMODE);
34462224350SCasper H.S. Dik
3455c51f124SMoriah Waterland /*
3465c51f124SMoriah Waterland * ********************************************************************
3475c51f124SMoriah Waterland * parse command line options
3485c51f124SMoriah Waterland * ********************************************************************
3495c51f124SMoriah Waterland */
3505c51f124SMoriah Waterland
3515c51f124SMoriah Waterland while ((c = getopt(argc, argv,
35269aea4bfSPeter Tribble "?Aa:b:B:Cc:D:d:GhIMnO:R:r:Ss:tV:vY:z")) != EOF) {
3535c51f124SMoriah Waterland switch (c) {
3545c51f124SMoriah Waterland
3555c51f124SMoriah Waterland /*
3565c51f124SMoriah Waterland * Not a public interface: This disables attribute checking.
3575c51f124SMoriah Waterland * It speeds up installation a little bit.
3585c51f124SMoriah Waterland */
3595c51f124SMoriah Waterland case 'A':
3605c51f124SMoriah Waterland disableAttributes++;
3615c51f124SMoriah Waterland break;
3625c51f124SMoriah Waterland
3635c51f124SMoriah Waterland /*
3645c51f124SMoriah Waterland * Public interface: Define an installation administration
3655c51f124SMoriah Waterland * file, admin, to be used in place of the default
3665c51f124SMoriah Waterland * administration file. The token none overrides the use
3675c51f124SMoriah Waterland * of any admin file, and thus forces interaction with the
3685c51f124SMoriah Waterland * user. Unless a full path name is given, pkgadd first
3695c51f124SMoriah Waterland * looks in the current working directory for the
3705c51f124SMoriah Waterland * administration file. If the specified administration
3715c51f124SMoriah Waterland * file is not in the current working directory, pkgadd
3725c51f124SMoriah Waterland * looks in the /var/sadm/install/admin directory for the
3735c51f124SMoriah Waterland * administration file.
3745c51f124SMoriah Waterland */
3755c51f124SMoriah Waterland case 'a':
3765c51f124SMoriah Waterland admnfile = flex_device(optarg, 0);
3775c51f124SMoriah Waterland break;
3785c51f124SMoriah Waterland
3795c51f124SMoriah Waterland /*
3805c51f124SMoriah Waterland * Not a public interface: control block size given to
3815c51f124SMoriah Waterland * pkginstall - block size used in read()/write() loop;
3825c51f124SMoriah Waterland * default is st_blksize from stat() of source file.
3835c51f124SMoriah Waterland */
3845c51f124SMoriah Waterland case 'B':
3855c51f124SMoriah Waterland if (optarg[0] == '-') {
3865c51f124SMoriah Waterland usage();
3875c51f124SMoriah Waterland quit(1);
3885c51f124SMoriah Waterland }
3895c51f124SMoriah Waterland rw_block_size = optarg;
3905c51f124SMoriah Waterland break;
3915c51f124SMoriah Waterland
3925c51f124SMoriah Waterland /*
3935c51f124SMoriah Waterland * Not a public interface: location where package executables
3945c51f124SMoriah Waterland * can be found - default is /usr/sadm/install/bin.
3955c51f124SMoriah Waterland */
3965c51f124SMoriah Waterland case 'b':
3975c51f124SMoriah Waterland if (optarg[0] == '-') {
3985c51f124SMoriah Waterland usage();
3995c51f124SMoriah Waterland quit(1);
4005c51f124SMoriah Waterland }
4015c51f124SMoriah Waterland if (!path_valid(optarg)) {
4025c51f124SMoriah Waterland progerr(ERR_PATH, optarg);
4035c51f124SMoriah Waterland quit(1);
4045c51f124SMoriah Waterland }
4055c51f124SMoriah Waterland if (isdir(optarg) != 0) {
4065c51f124SMoriah Waterland p = strerror(errno);
4075c51f124SMoriah Waterland progerr(ERR_CANNOT_USE_DIR, optarg, p);
4085c51f124SMoriah Waterland quit(1);
4095c51f124SMoriah Waterland }
4105c51f124SMoriah Waterland altBinDir = optarg;
4115c51f124SMoriah Waterland break;
4125c51f124SMoriah Waterland
4135c51f124SMoriah Waterland /*
4145c51f124SMoriah Waterland * Not a public interface: This disables checksum tests on
4155c51f124SMoriah Waterland * the source files. It speeds up installation a little bit.
4165c51f124SMoriah Waterland */
4175c51f124SMoriah Waterland case 'C':
4185c51f124SMoriah Waterland disableChecksum++;
4195c51f124SMoriah Waterland break;
4205c51f124SMoriah Waterland
4215c51f124SMoriah Waterland /*
4225c51f124SMoriah Waterland * Not a public interface: This allows designation of a
4235c51f124SMoriah Waterland * continuation file. It is the same format as a dryrun file
4245c51f124SMoriah Waterland * but it is used to take up where the dryrun left off.
4255c51f124SMoriah Waterland */
4265c51f124SMoriah Waterland case 'c':
4275c51f124SMoriah Waterland pkgcontsrc = flex_device(optarg, 0);
4285c51f124SMoriah Waterland break;
4295c51f124SMoriah Waterland
4305c51f124SMoriah Waterland /*
4315c51f124SMoriah Waterland * Not a public interface: This allows designation of a
4325c51f124SMoriah Waterland * dryrun file. This pkgadd will create dryrun files
4335c51f124SMoriah Waterland * in the directory provided.
4345c51f124SMoriah Waterland */
4355c51f124SMoriah Waterland case 'D':
4365c51f124SMoriah Waterland if (optarg[0] == '-') {
4375c51f124SMoriah Waterland usage();
4385c51f124SMoriah Waterland quit(1);
4395c51f124SMoriah Waterland }
4405c51f124SMoriah Waterland pkgdrtarg = flex_device(optarg, 0);
4415c51f124SMoriah Waterland break;
4425c51f124SMoriah Waterland
4435c51f124SMoriah Waterland /*
4445c51f124SMoriah Waterland * Public interface: Install or copy a package from
4455c51f124SMoriah Waterland * device. device can be a full path name to a directory
4465c51f124SMoriah Waterland * or the identifiers for tape, floppy disk, or removable
4475c51f124SMoriah Waterland * disk - for example, /var/tmp or /floppy/floppy_name.
4485c51f124SMoriah Waterland * It can also be a device alias - for example,
4495c51f124SMoriah Waterland * /floppy/floppy0, or a datastream created by pkgtrans.
4505c51f124SMoriah Waterland */
4515c51f124SMoriah Waterland case 'd':
4525c51f124SMoriah Waterland if (optarg[0] == '-') {
4535c51f124SMoriah Waterland usage();
4545c51f124SMoriah Waterland quit(1);
4555c51f124SMoriah Waterland }
4565c51f124SMoriah Waterland if (!path_valid(optarg)) {
4575c51f124SMoriah Waterland progerr(ERR_PATH, optarg);
4585c51f124SMoriah Waterland quit(1);
4595c51f124SMoriah Waterland /* NOTREACHED */
4605c51f124SMoriah Waterland }
4615c51f124SMoriah Waterland
46232991bedSPeter Tribble device = flex_device(optarg, 1);
4635c51f124SMoriah Waterland break;
4645c51f124SMoriah Waterland
4655c51f124SMoriah Waterland /*
4665c51f124SMoriah Waterland * Public interface: install package in global zone only.
4675c51f124SMoriah Waterland */
4685c51f124SMoriah Waterland case 'G':
4695c51f124SMoriah Waterland globalZoneOnly = B_TRUE;
4705c51f124SMoriah Waterland break;
4715c51f124SMoriah Waterland
4725c51f124SMoriah Waterland /*
4735c51f124SMoriah Waterland * Not a public interface: Enable hollow package support. When
4745c51f124SMoriah Waterland * specified, for any package that has SUNW_PKG_HOLLOW=true:
4755c51f124SMoriah Waterland * Do not calculate and verify package size against target.
4765c51f124SMoriah Waterland * Do not run any package procedure or class action scripts.
4775c51f124SMoriah Waterland * Do not create any target directories.
4785c51f124SMoriah Waterland * Do not perform any script locking.
4795c51f124SMoriah Waterland * Do not install any components of any package.
4805c51f124SMoriah Waterland * Do not output any status or database update messages.
4815c51f124SMoriah Waterland */
4825c51f124SMoriah Waterland case 'h':
4835c51f124SMoriah Waterland set_depend_pkginfo_DB(B_TRUE);
4845c51f124SMoriah Waterland break;
4855c51f124SMoriah Waterland
4865c51f124SMoriah Waterland /*
4875c51f124SMoriah Waterland * Not a public interface: Informs scripts that this is
4885c51f124SMoriah Waterland * an initial install by setting the environment parameter
4895c51f124SMoriah Waterland * PKG_INIT_INSTALL=TRUE for all scripts. They may use it as
4905c51f124SMoriah Waterland * they see fit, safe in the knowledge that the target
4915c51f124SMoriah Waterland * filesystem is tabula rasa.
4925c51f124SMoriah Waterland */
4935c51f124SMoriah Waterland case 'I':
4945c51f124SMoriah Waterland init_install++;
4955c51f124SMoriah Waterland break;
4965c51f124SMoriah Waterland
4975c51f124SMoriah Waterland /*
4985c51f124SMoriah Waterland * Public interface: Instruct pkgadd not to use the
4995c51f124SMoriah Waterland * $root_path/etc/vfstab file for determining the client's
5005c51f124SMoriah Waterland * mount points. This option assumes the mount points are
5015c51f124SMoriah Waterland * correct on the server and it behaves consistently with
5025c51f124SMoriah Waterland * Solaris 2.5 and earlier releases.
5035c51f124SMoriah Waterland */
5045c51f124SMoriah Waterland case 'M':
5055c51f124SMoriah Waterland no_map_client = 1;
5065c51f124SMoriah Waterland break;
5075c51f124SMoriah Waterland
5085c51f124SMoriah Waterland /*
5095c51f124SMoriah Waterland * Not a public interface: the -O option allows the behavior
5105c51f124SMoriah Waterland * of the package tools to be modified. Recognized options:
5115c51f124SMoriah Waterland * -> debug
5125c51f124SMoriah Waterland * ---> enable debugging output
5135c51f124SMoriah Waterland * -> addzonename
5145c51f124SMoriah Waterland * ---> add zone name to appropriate messages
5155c51f124SMoriah Waterland * -> nozones
5165c51f124SMoriah Waterland * ---> act as though in global zone with no non-global zones
5175c51f124SMoriah Waterland * -> enable-hollow-package-support
5185c51f124SMoriah Waterland * ---> Enable hollow package support. When specified, for any
5195c51f124SMoriah Waterland * ---> package that has SUNW_PKG_HOLLOW=true:
5205c51f124SMoriah Waterland * ---> Do not calculate and verify package size against target
5215c51f124SMoriah Waterland * ---> Do not run any package procedure or class action scripts
5225c51f124SMoriah Waterland * ---> Do not create any target directories
5235c51f124SMoriah Waterland * ---> Do not perform any script locking
5245c51f124SMoriah Waterland * ---> Do not install any components of any package
5255c51f124SMoriah Waterland * ---> Do not output any status or database update messages
5265c51f124SMoriah Waterland * -> zonelist="<names...>"
5275c51f124SMoriah Waterland * ---> add package to space/colon separated list of zones only
5285c51f124SMoriah Waterland */
5295c51f124SMoriah Waterland
5305c51f124SMoriah Waterland case 'O':
5315c51f124SMoriah Waterland for (p = strtok(optarg, ","); p != (char *)NULL;
5322e10def1SPeter Tribble p = strtok(NULL, ",")) {
5335c51f124SMoriah Waterland
5345c51f124SMoriah Waterland if (strcmp(p, "debug") == 0) {
5355c51f124SMoriah Waterland /* set debug flag/enable debug output */
5365c51f124SMoriah Waterland debugFlag = B_TRUE;
5375c51f124SMoriah Waterland (void) echoDebugSetFlag(debugFlag);
5385c51f124SMoriah Waterland
5395c51f124SMoriah Waterland /* debug info on arguments to pkgadd */
5405c51f124SMoriah Waterland for (n = 0; n < argc && argv[n]; n++) {
5415c51f124SMoriah Waterland echoDebug(DBG_ARG, n, argv[n]);
5425c51f124SMoriah Waterland }
5435c51f124SMoriah Waterland
5445c51f124SMoriah Waterland continue;
5455c51f124SMoriah Waterland }
5465c51f124SMoriah Waterland
5475c51f124SMoriah Waterland if (strcmp(p,
5482e10def1SPeter Tribble "enable-hollow-package-support") == 0) {
5495c51f124SMoriah Waterland set_depend_pkginfo_DB(B_TRUE);
5505c51f124SMoriah Waterland continue;
5515c51f124SMoriah Waterland }
5525c51f124SMoriah Waterland
5535c51f124SMoriah Waterland if (strcmp(p, "addzonename") == 0) {
5545c51f124SMoriah Waterland quitSetZoneName(z_get_zonename());
5555c51f124SMoriah Waterland continue;
5565c51f124SMoriah Waterland }
5575c51f124SMoriah Waterland
5585c51f124SMoriah Waterland if (strcmp(p, "nozones") == 0) {
5595c51f124SMoriah Waterland noZones = B_TRUE;
5605c51f124SMoriah Waterland continue;
5615c51f124SMoriah Waterland }
5625c51f124SMoriah Waterland
5635c51f124SMoriah Waterland if (strncmp(p, "zonelist=", 9) == 0) {
5645c51f124SMoriah Waterland /*
5655c51f124SMoriah Waterland * If colons used as separators,
5665c51f124SMoriah Waterland * convert to spaces.
5675c51f124SMoriah Waterland */
5685c51f124SMoriah Waterland q = p + 9;
5695c51f124SMoriah Waterland while (*q != '\0') {
5705c51f124SMoriah Waterland if (*q == ':') {
5715c51f124SMoriah Waterland *q = ' ';
5725c51f124SMoriah Waterland }
5735c51f124SMoriah Waterland q++;
5745c51f124SMoriah Waterland }
5755c51f124SMoriah Waterland
5765c51f124SMoriah Waterland if (z_set_zone_spec(p + 9) == -1)
5775c51f124SMoriah Waterland quit(1);
5785c51f124SMoriah Waterland usedZoneList = B_TRUE;
5795c51f124SMoriah Waterland continue;
5805c51f124SMoriah Waterland }
5815c51f124SMoriah Waterland
5825c51f124SMoriah Waterland progerr(ERR_INVALID_O_OPTION, p);
5835c51f124SMoriah Waterland continue;
5845c51f124SMoriah Waterland }
5855c51f124SMoriah Waterland break;
5865c51f124SMoriah Waterland
5875c51f124SMoriah Waterland /*
5885c51f124SMoriah Waterland * Public interface: installation occurs in
5895c51f124SMoriah Waterland * non-interactive mode. Suppress output of the list of
5905c51f124SMoriah Waterland * installed files. The default mode is interactive.
5915c51f124SMoriah Waterland */
5925c51f124SMoriah Waterland case 'n':
5935c51f124SMoriah Waterland nointeract++;
5945c51f124SMoriah Waterland (void) echoSetFlag(B_FALSE);
5955c51f124SMoriah Waterland break;
5965c51f124SMoriah Waterland
5975c51f124SMoriah Waterland /*
5985c51f124SMoriah Waterland * Public interface: Define the full path name of a
5995c51f124SMoriah Waterland * directory to use as the root_path. All files,
6005c51f124SMoriah Waterland * including package system information files, are
6015c51f124SMoriah Waterland * relocated to a directory tree starting in the specified
6025c51f124SMoriah Waterland * root_path. The root_path may be specified when
6035c51f124SMoriah Waterland * installing to a client from a server (for example,
6045c51f124SMoriah Waterland * /export/root/client1).
6055c51f124SMoriah Waterland */
6065c51f124SMoriah Waterland case 'R':
6075c51f124SMoriah Waterland if (optarg[0] == '-') {
6085c51f124SMoriah Waterland usage();
6095c51f124SMoriah Waterland quit(1);
6105c51f124SMoriah Waterland }
6115c51f124SMoriah Waterland /* determine the real path specified */
6125c51f124SMoriah Waterland
6135c51f124SMoriah Waterland n = resolvepath(optarg, Rpath, sizeof (Rpath)-1);
6145c51f124SMoriah Waterland
6155c51f124SMoriah Waterland /* use supplied path if not resolvable */
6165c51f124SMoriah Waterland
6175c51f124SMoriah Waterland if (n == -1) {
6185c51f124SMoriah Waterland (void) strlcpy(Rpath, optarg, sizeof (Rpath));
6195c51f124SMoriah Waterland } else {
6205c51f124SMoriah Waterland /* null terminate string */
6215c51f124SMoriah Waterland Rpath[n] = '\0';
6225c51f124SMoriah Waterland }
6235c51f124SMoriah Waterland
6245c51f124SMoriah Waterland /* set the alternative root path */
6255c51f124SMoriah Waterland
6265c51f124SMoriah Waterland if (!set_inst_root(Rpath)) {
6275c51f124SMoriah Waterland progerr(ERR_ROOT_CMD);
6285c51f124SMoriah Waterland exit(1);
6295c51f124SMoriah Waterland }
6305c51f124SMoriah Waterland break;
6315c51f124SMoriah Waterland
6325c51f124SMoriah Waterland /*
6335c51f124SMoriah Waterland * Public interface: Identify a file or directory which
634*bbf21555SRichard Lowe * contains output from a previous pkgask(8)
6355c51f124SMoriah Waterland * session. This file supplies the interaction responses
6365c51f124SMoriah Waterland * that would be requested by the package in interactive
6375c51f124SMoriah Waterland * mode. response must be a full pathname.
6385c51f124SMoriah Waterland */
6395c51f124SMoriah Waterland case 'r':
6405c51f124SMoriah Waterland if (optarg[0] == '-') {
6415c51f124SMoriah Waterland usage();
6425c51f124SMoriah Waterland quit(1);
6435c51f124SMoriah Waterland }
6445c51f124SMoriah Waterland respfile = flex_device(optarg, 2);
6455c51f124SMoriah Waterland if (isdir(respfile) == 0)
6465c51f124SMoriah Waterland respdir = respfile;
6475c51f124SMoriah Waterland break;
6485c51f124SMoriah Waterland
6495c51f124SMoriah Waterland /*
6505c51f124SMoriah Waterland * Not a public interface: suppress copyright notice being
6515c51f124SMoriah Waterland * output during installation.
6525c51f124SMoriah Waterland */
6535c51f124SMoriah Waterland case 'S':
6545c51f124SMoriah Waterland suppressCopyright++;
6555c51f124SMoriah Waterland break;
6565c51f124SMoriah Waterland
6575c51f124SMoriah Waterland /*
6585c51f124SMoriah Waterland * Public interface: Write the package into the directory
6595c51f124SMoriah Waterland * spool instead of installing it. The default directory
6605c51f124SMoriah Waterland * for spooled packages is /var/sadm/pkg.
6615c51f124SMoriah Waterland */
6625c51f124SMoriah Waterland case 's':
6635c51f124SMoriah Waterland spoolDir = flex_device(optarg, 1);
6645c51f124SMoriah Waterland break;
6655c51f124SMoriah Waterland
6665c51f124SMoriah Waterland /*
6675c51f124SMoriah Waterland * Not a public interface: disable save spool area creation;
6685c51f124SMoriah Waterland * suppress the creation and population of the package save
6695c51f124SMoriah Waterland * spool area (var/sadm/pkg/PKG/save/pspool/PKG).
6705c51f124SMoriah Waterland */
6715c51f124SMoriah Waterland case 't':
6725c51f124SMoriah Waterland disableSaveSpool++;
6735c51f124SMoriah Waterland break;
6745c51f124SMoriah Waterland
6755c51f124SMoriah Waterland /*
6765c51f124SMoriah Waterland * Public interface: Specify an alternative fs_file to map
6775c51f124SMoriah Waterland * the client's file systems. For example, used in
6785c51f124SMoriah Waterland * situations where the $root_path/etc/vfstab file is
6795c51f124SMoriah Waterland * non-existent or unreliable. Informs the pkginstall
6805c51f124SMoriah Waterland * portion to mount up a client filesystem based upon the
6815c51f124SMoriah Waterland * supplied vfstab-like file of stable format.
6825c51f124SMoriah Waterland */
6835c51f124SMoriah Waterland case 'V':
6845c51f124SMoriah Waterland vfstab_file = flex_device(optarg, 2);
6855c51f124SMoriah Waterland no_map_client = 0;
6865c51f124SMoriah Waterland break;
6875c51f124SMoriah Waterland
6885c51f124SMoriah Waterland /*
6895c51f124SMoriah Waterland * Public interface: Trace all of the scripts that get
6905c51f124SMoriah Waterland * executed by pkgadd, located in the pkginst/install
6915c51f124SMoriah Waterland * directory. This option is used for debugging the
6925c51f124SMoriah Waterland * procedural and non-procedural scripts
6935c51f124SMoriah Waterland */
6945c51f124SMoriah Waterland case 'v':
6955c51f124SMoriah Waterland pkgverbose++;
6965c51f124SMoriah Waterland break;
6975c51f124SMoriah Waterland
6985c51f124SMoriah Waterland /*
6995c51f124SMoriah Waterland * Public interface: Install packages based on the value
7005c51f124SMoriah Waterland * of the CATEGORY parameter stored in the package's
701*bbf21555SRichard Lowe * pkginfo(5) file. All packages on the source medium
7025c51f124SMoriah Waterland * whose CATEGORY matches one of the specified categories
7035c51f124SMoriah Waterland * will be selected for installation or spooling. Install
7045c51f124SMoriah Waterland * packages that contain the same CATEGORY as the one
7055c51f124SMoriah Waterland * provided on the command line.
7065c51f124SMoriah Waterland */
7075c51f124SMoriah Waterland case 'Y':
7085c51f124SMoriah Waterland if (optarg[0] == '-') {
7095c51f124SMoriah Waterland usage();
7105c51f124SMoriah Waterland quit(1);
7115c51f124SMoriah Waterland }
7125c51f124SMoriah Waterland catg_arg = strdup(optarg);
7135c51f124SMoriah Waterland
7145c51f124SMoriah Waterland if ((category = get_categories(catg_arg)) == NULL) {
7155c51f124SMoriah Waterland progerr(ERR_CAT_INV, catg_arg);
7165c51f124SMoriah Waterland exit(1);
7175c51f124SMoriah Waterland } else if (is_not_valid_length(category)) {
7185c51f124SMoriah Waterland progerr(ERR_CAT_LNGTH);
7195c51f124SMoriah Waterland exit(1);
7205c51f124SMoriah Waterland }
7215c51f124SMoriah Waterland break;
7225c51f124SMoriah Waterland
7235c51f124SMoriah Waterland /*
7245c51f124SMoriah Waterland * Not a public interface: perform fresh install from
7255c51f124SMoriah Waterland * package save spool area. When set, the package contents
7265c51f124SMoriah Waterland * are installed from the package spool save area instead
7275c51f124SMoriah Waterland * of from the package root area, so that the original
7285c51f124SMoriah Waterland * source packages are not required to install the
7295c51f124SMoriah Waterland * package. If the -h option is also specified and the
7305c51f124SMoriah Waterland * package is hollow, then this option is ignored. When -z
7315c51f124SMoriah Waterland * is specified:
7325c51f124SMoriah Waterland * - Editable files are installed from the package instance
7335c51f124SMoriah Waterland * save area.
7345c51f124SMoriah Waterland * - Volatile files are installed from the package instance
7355c51f124SMoriah Waterland * save area.
7365c51f124SMoriah Waterland * - Executable and data files are installed from the final
7375c51f124SMoriah Waterland * installed location as specified in the pkgmap file.
7385c51f124SMoriah Waterland * - Installation scripts are run from the package spool
7395c51f124SMoriah Waterland * save area.
7405c51f124SMoriah Waterland */
7415c51f124SMoriah Waterland case 'z':
7425c51f124SMoriah Waterland saveSpoolInstall++;
7435c51f124SMoriah Waterland break;
7445c51f124SMoriah Waterland
7455c51f124SMoriah Waterland /*
7465c51f124SMoriah Waterland * unrecognized option
7475c51f124SMoriah Waterland */
7485c51f124SMoriah Waterland
7495c51f124SMoriah Waterland default:
7505c51f124SMoriah Waterland usage();
7515c51f124SMoriah Waterland return (1);
7525c51f124SMoriah Waterland }
7535c51f124SMoriah Waterland }
7545c51f124SMoriah Waterland
7555c51f124SMoriah Waterland /*
7565c51f124SMoriah Waterland * ********************************************************************
7575c51f124SMoriah Waterland * validate command line options
7585c51f124SMoriah Waterland * ********************************************************************
7595c51f124SMoriah Waterland */
7605c51f124SMoriah Waterland
7615c51f124SMoriah Waterland /* set "debug echo" flag according to setting of "-O debug" option */
7625c51f124SMoriah Waterland
7635c51f124SMoriah Waterland (void) echoDebugSetFlag(debugFlag);
7645c51f124SMoriah Waterland
7655c51f124SMoriah Waterland /* output entry debugging information */
7665c51f124SMoriah Waterland
7675c51f124SMoriah Waterland if (z_running_in_global_zone()) {
7685c51f124SMoriah Waterland echoDebug(DBG_ENTRY_IN_GZ, prog_full_name);
7695c51f124SMoriah Waterland } else {
7705c51f124SMoriah Waterland echoDebug(DBG_ENTRY_IN_LZ, prog_full_name, getzoneid(),
7712e10def1SPeter Tribble z_get_zonename());
7725c51f124SMoriah Waterland }
7735c51f124SMoriah Waterland
7745c51f124SMoriah Waterland /*
7755c51f124SMoriah Waterland * Later, it may be decided to pursue this ability to continue to an
7765c51f124SMoriah Waterland * actual installation based only on the dryrun data. At this time,
7775c51f124SMoriah Waterland * it is too risky.
7785c51f124SMoriah Waterland */
7795c51f124SMoriah Waterland
7805c51f124SMoriah Waterland if (pkgcontsrc && !pkgdrtarg) {
7815c51f124SMoriah Waterland progerr(ERR_NO_LIVE_MODE);
7825c51f124SMoriah Waterland usage();
7835c51f124SMoriah Waterland return (1);
7845c51f124SMoriah Waterland }
7855c51f124SMoriah Waterland
7865c51f124SMoriah Waterland /* ignore -G option if not used in the global zone */
7875c51f124SMoriah Waterland
7885c51f124SMoriah Waterland if (!z_running_in_global_zone()) {
7895c51f124SMoriah Waterland globalZoneOnly = B_FALSE;
7905c51f124SMoriah Waterland }
7915c51f124SMoriah Waterland
7925c51f124SMoriah Waterland /* if zonelist used, must be in global zone */
7935c51f124SMoriah Waterland
7945c51f124SMoriah Waterland if (usedZoneList && !z_running_in_global_zone()) {
7955c51f124SMoriah Waterland progerr(ERR_Z_USED_IN_NONGLOBAL_ZONE);
7965c51f124SMoriah Waterland return (1);
7975c51f124SMoriah Waterland }
7985c51f124SMoriah Waterland
7995c51f124SMoriah Waterland /* -G and zonelist cannot be used together */
8005c51f124SMoriah Waterland
8015c51f124SMoriah Waterland if (globalZoneOnly && usedZoneList) {
8025c51f124SMoriah Waterland progerr(ERR_GZ_USED_TOGETHER);
8035c51f124SMoriah Waterland usage();
8045c51f124SMoriah Waterland return (1);
8055c51f124SMoriah Waterland }
8065c51f124SMoriah Waterland
8075c51f124SMoriah Waterland /* -s cannot be used with either -G or zonelist */
8085c51f124SMoriah Waterland
8095c51f124SMoriah Waterland if (spoolDir != NULL) {
8105c51f124SMoriah Waterland if (globalZoneOnly) {
8115c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_USED_WITH_G);
8125c51f124SMoriah Waterland usage();
8135c51f124SMoriah Waterland return (1);
8145c51f124SMoriah Waterland }
8155c51f124SMoriah Waterland if (usedZoneList) {
8165c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_USED_WITH_Z);
8175c51f124SMoriah Waterland usage();
8185c51f124SMoriah Waterland return (1);
8195c51f124SMoriah Waterland }
8205c51f124SMoriah Waterland if (strcmp(spoolDir, "/var/sadm/pkg") == 0) {
8215c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_CANNOT_BE_SYS, "/var/sadm/pkg");
8225c51f124SMoriah Waterland usage();
8235c51f124SMoriah Waterland return (1);
8245c51f124SMoriah Waterland }
8255c51f124SMoriah Waterland }
8265c51f124SMoriah Waterland
8275c51f124SMoriah Waterland /* pkgask does not support the same options as pkgadd */
8285c51f124SMoriah Waterland
8295c51f124SMoriah Waterland if (askflag && spoolDir) {
8305c51f124SMoriah Waterland progerr(ERR_PKGASK_AND_SPOOLDIR);
8315c51f124SMoriah Waterland usage();
8325c51f124SMoriah Waterland return (1);
8335c51f124SMoriah Waterland }
8345c51f124SMoriah Waterland
8355c51f124SMoriah Waterland if (askflag && nointeract) {
8365c51f124SMoriah Waterland progerr(ERR_PKGASK_AND_NOINTERACT);
8375c51f124SMoriah Waterland usage();
8385c51f124SMoriah Waterland return (1);
8395c51f124SMoriah Waterland }
8405c51f124SMoriah Waterland
8415c51f124SMoriah Waterland /* cannot use response file/not-interactive and spool-to directory */
8425c51f124SMoriah Waterland
8435c51f124SMoriah Waterland if (spoolDir && nointeract) {
8445c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_AND_NOINTERACT);
8455c51f124SMoriah Waterland usage();
8465c51f124SMoriah Waterland return (1);
8475c51f124SMoriah Waterland }
8485c51f124SMoriah Waterland
8495c51f124SMoriah Waterland if (spoolDir && respfile) {
8505c51f124SMoriah Waterland progerr(ERR_SPOOLDIR_AND_RESPFILE);
8515c51f124SMoriah Waterland usage();
8525c51f124SMoriah Waterland return (1);
8535c51f124SMoriah Waterland }
8545c51f124SMoriah Waterland
8555c51f124SMoriah Waterland if (usedZoneList) {
8565c51f124SMoriah Waterland /* Verify supplied zone list valid for the target */
8575c51f124SMoriah Waterland if (z_verify_zone_spec() == -1)
8585c51f124SMoriah Waterland return (1);
8595c51f124SMoriah Waterland
8605c51f124SMoriah Waterland /* -z zonelist=global is logically the same as -G */
8615c51f124SMoriah Waterland if (z_global_only() && z_running_in_global_zone())
8625c51f124SMoriah Waterland globalZoneOnly = B_TRUE;
8635c51f124SMoriah Waterland }
8645c51f124SMoriah Waterland
8655c51f124SMoriah Waterland /*
8665c51f124SMoriah Waterland * hook SIGINT and SIGHUP interrupts into quit.c's trap handler
8675c51f124SMoriah Waterland */
8685c51f124SMoriah Waterland
8695c51f124SMoriah Waterland /* hold SIGINT/SIGHUP interrupts */
8705c51f124SMoriah Waterland
8715c51f124SMoriah Waterland (void) sighold(SIGHUP);
8725c51f124SMoriah Waterland (void) sighold(SIGINT);
8735c51f124SMoriah Waterland
8745c51f124SMoriah Waterland /* connect quit.c:trap() to SIGINT */
8755c51f124SMoriah Waterland
8765c51f124SMoriah Waterland nact.sa_handler = quitGetTrapHandler();
8775c51f124SMoriah Waterland nact.sa_flags = SA_RESTART;
8785c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask);
8795c51f124SMoriah Waterland
8805c51f124SMoriah Waterland (void) sigaction(SIGINT, &nact, &oact);
8815c51f124SMoriah Waterland
8825c51f124SMoriah Waterland /* connect quit.c:trap() to SIGHUP */
8835c51f124SMoriah Waterland
8845c51f124SMoriah Waterland nact.sa_handler = quitGetTrapHandler();
8855c51f124SMoriah Waterland nact.sa_flags = SA_RESTART;
8865c51f124SMoriah Waterland (void) sigemptyset(&nact.sa_mask);
8875c51f124SMoriah Waterland
8885c51f124SMoriah Waterland (void) sigaction(SIGHUP, &nact, &oact);
8895c51f124SMoriah Waterland
8905c51f124SMoriah Waterland /* release hold on signals */
8915c51f124SMoriah Waterland
8925c51f124SMoriah Waterland (void) sigrelse(SIGHUP);
8935c51f124SMoriah Waterland (void) sigrelse(SIGINT);
8945c51f124SMoriah Waterland
8955c51f124SMoriah Waterland /*
8965c51f124SMoriah Waterland * This function is in the libadm library; it sets:
8975c51f124SMoriah Waterland * -> get_PKGLOC() = <install_root>/var/sadm/pkg
8985c51f124SMoriah Waterland * -> get_PKGADM() = <install_root>/var/sadm/install
8995c51f124SMoriah Waterland * -> pkgdir = <install_root>/var/sadm/pkg
9005c51f124SMoriah Waterland * -> pkg_install_root = <install_root>
9015c51f124SMoriah Waterland * This controls operations of libadm functions such as:
9025c51f124SMoriah Waterland * -> pkginfofind, pkginfopen, fpkgparam, pkgparam, get_PKGLOC,
9039ab815e1SGarrett D'Amore * -> get_PKGADM, get_install_root
9045c51f124SMoriah Waterland */
9055c51f124SMoriah Waterland
9065c51f124SMoriah Waterland set_PKGpaths(get_inst_root());
9075c51f124SMoriah Waterland echoDebug(DBG_PKGADD_PKGPATHS,
9082e10def1SPeter Tribble get_PKGLOC() ? get_PKGLOC() : "",
9092e10def1SPeter Tribble get_PKGADM() ? get_PKGADM() : "");
9105c51f124SMoriah Waterland
9115c51f124SMoriah Waterland /*
9125c51f124SMoriah Waterland * This function is in the libinst library; it reads the specified
913*bbf21555SRichard Lowe * admin(5) file and, using fpkgparam(), sets the global "adm" structure
9145c51f124SMoriah Waterland * values to match what is in the specified admin file.
9155c51f124SMoriah Waterland */
9165c51f124SMoriah Waterland
9175c51f124SMoriah Waterland echoDebug(DBG_PKGADD_ADMINFILE, admnfile ? admnfile : "");
9185c51f124SMoriah Waterland setadminFile(admnfile);
9195c51f124SMoriah Waterland
9205c51f124SMoriah Waterland /*
9215c51f124SMoriah Waterland * if running in the global zone, and non-global zones exist, then
9225c51f124SMoriah Waterland * enable hollow package support so that any packages that are marked
9235c51f124SMoriah Waterland * SUNW_PKG_HOLLOW=true will be correctly installed in non-global zones
9245c51f124SMoriah Waterland * when added directly in the global zone by the global zone admin.
9255c51f124SMoriah Waterland */
9265c51f124SMoriah Waterland
9275c51f124SMoriah Waterland if (is_depend_pkginfo_DB()) {
9285c51f124SMoriah Waterland echoDebug(DBG_PKGADD_HOLLOW_ENABLED);
9295c51f124SMoriah Waterland } else if ((z_running_in_global_zone() == B_TRUE) &&
9302e10def1SPeter Tribble (z_non_global_zones_exist() == B_TRUE)) {
9315c51f124SMoriah Waterland echoDebug(DBG_PKGADD_ENABLING_HOLLOW);
9325c51f124SMoriah Waterland set_depend_pkginfo_DB(B_TRUE);
9335c51f124SMoriah Waterland }
9345c51f124SMoriah Waterland
93532991bedSPeter Tribble /* if no device, get and validate default device */
9365c51f124SMoriah Waterland
93732991bedSPeter Tribble if (device == NULL) {
9385c51f124SMoriah Waterland device = devattr("spool", "pathname");
9395c51f124SMoriah Waterland if (device == NULL) {
9405c51f124SMoriah Waterland progerr(ERR_NODEVICE);
9415c51f124SMoriah Waterland quit(1);
9425c51f124SMoriah Waterland /* NOTREACHED */
9435c51f124SMoriah Waterland }
9445c51f124SMoriah Waterland }
9455c51f124SMoriah Waterland
9465c51f124SMoriah Waterland /* must be root if not directing results to spool directory */
9475c51f124SMoriah Waterland
9485c51f124SMoriah Waterland if ((getuid() != 0) && (spoolDir == NULL)) {
9495c51f124SMoriah Waterland progerr(ERR_NOT_ROOT, prog);
9505c51f124SMoriah Waterland exit(1);
9515c51f124SMoriah Waterland }
9525c51f124SMoriah Waterland
9535c51f124SMoriah Waterland /*
9545c51f124SMoriah Waterland * process response file argument
9555c51f124SMoriah Waterland */
9565c51f124SMoriah Waterland
9575c51f124SMoriah Waterland if (respfile) {
9585c51f124SMoriah Waterland echoDebug(DBG_PKGADD_RESPFILE,
9592e10def1SPeter Tribble respfile, respdir ? respdir : "");
9605c51f124SMoriah Waterland
9615c51f124SMoriah Waterland if (respfile[0] != '/') {
9625c51f124SMoriah Waterland progerr(ERR_RSP_FILE_NOTFULLPATH, respfile);
9635c51f124SMoriah Waterland quit(1);
9645c51f124SMoriah Waterland /* NOTREACHED */
9655c51f124SMoriah Waterland }
9665c51f124SMoriah Waterland if (respdir == NULL) {
9675c51f124SMoriah Waterland if (askflag) {
9685c51f124SMoriah Waterland if (access(respfile, F_OK) == 0) {
9695c51f124SMoriah Waterland progerr(ERR_NORESP, respfile);
9705c51f124SMoriah Waterland quit(1);
9715c51f124SMoriah Waterland /* NOTREACHED */
9725c51f124SMoriah Waterland }
9735c51f124SMoriah Waterland } else if (access(respfile, F_OK) != 0) {
9745c51f124SMoriah Waterland progerr(ERR_ACCRESP, respfile);
9755c51f124SMoriah Waterland quit(1);
9765c51f124SMoriah Waterland /* NOTREACHED */
9775c51f124SMoriah Waterland }
9785c51f124SMoriah Waterland }
9795c51f124SMoriah Waterland } else if (askflag) {
9805c51f124SMoriah Waterland progerr(ERR_RSP_FILE_NOT_GIVEN);
9815c51f124SMoriah Waterland usage();
9825c51f124SMoriah Waterland quit(1);
9835c51f124SMoriah Waterland /* NOTREACHED */
9845c51f124SMoriah Waterland }
9855c51f124SMoriah Waterland
9865c51f124SMoriah Waterland /* establish temporary directory to use */
9875c51f124SMoriah Waterland
9885c51f124SMoriah Waterland if ((tmpdir = getenv("TMPDIR")) == NULL) {
9895c51f124SMoriah Waterland /* use default - no override specified */
9905c51f124SMoriah Waterland tmpdir = P_tmpdir;
9915c51f124SMoriah Waterland }
9925c51f124SMoriah Waterland
9935c51f124SMoriah Waterland echoDebug(DBG_PKGADD_TMPDIR, tmpdir);
9945c51f124SMoriah Waterland
9955c51f124SMoriah Waterland /*
9965c51f124SMoriah Waterland * See if user wants this to be handled as an old style pkg.
9975c51f124SMoriah Waterland * NOTE : the ``exception_pkg()'' stuff is to be used only
9985c51f124SMoriah Waterland * through on495. This function comes out for on1095. See
9995c51f124SMoriah Waterland * PSARC 1993-546. -- JST
10005c51f124SMoriah Waterland */
10015c51f124SMoriah Waterland
10025c51f124SMoriah Waterland if (getenv("NONABI_SCRIPTS") != NULL) {
10035c51f124SMoriah Waterland old_pkg = 1;
10045c51f124SMoriah Waterland }
10055c51f124SMoriah Waterland
10065c51f124SMoriah Waterland /*
10075c51f124SMoriah Waterland * See if the user wants to process symlinks consistent with
10085c51f124SMoriah Waterland * the old behavior.
10095c51f124SMoriah Waterland */
10105c51f124SMoriah Waterland
10115c51f124SMoriah Waterland if (getenv("PKG_NONABI_SYMLINKS") != NULL) {
10125c51f124SMoriah Waterland old_symlinks = 1;
10135c51f124SMoriah Waterland }
10145c51f124SMoriah Waterland
10155c51f124SMoriah Waterland /*
10165c51f124SMoriah Waterland * See if the user wants the package name length restricted.
10175c51f124SMoriah Waterland */
10185c51f124SMoriah Waterland
10195c51f124SMoriah Waterland abiPtr = getenv("PKG_ABI_NAMELENGTH");
10205c51f124SMoriah Waterland if (abiPtr && strncasecmp(abiPtr, "TRUE", 4) == 0) {
10215c51f124SMoriah Waterland ABI_namelength = 1;
10225c51f124SMoriah Waterland }
10235c51f124SMoriah Waterland
10245c51f124SMoriah Waterland /*
10255c51f124SMoriah Waterland * validate the package source device - return pkgdev info that
10265c51f124SMoriah Waterland * describes the package source device.
10275c51f124SMoriah Waterland */
10285c51f124SMoriah Waterland
10295c51f124SMoriah Waterland if (devtype(device, &pkgdev)) {
10305c51f124SMoriah Waterland progerr(ERR_BAD_DEVICE, device);
10315c51f124SMoriah Waterland quit(1);
10325c51f124SMoriah Waterland /* NOTREACHED */
10335c51f124SMoriah Waterland }
10345c51f124SMoriah Waterland
10355c51f124SMoriah Waterland /*
10365c51f124SMoriah Waterland * If writing the packages into a spool directory instead of
10375c51f124SMoriah Waterland * installing the packages, open the package datastream and
10385c51f124SMoriah Waterland * invoke pkgtrans to perform the conversion and exit.
10395c51f124SMoriah Waterland */
10405c51f124SMoriah Waterland
10415c51f124SMoriah Waterland if (spoolDir != (char *)NULL) {
10425c51f124SMoriah Waterland boolean_t b;
10435c51f124SMoriah Waterland int n;
10445c51f124SMoriah Waterland
10455c51f124SMoriah Waterland echoDebug(DBG_INSTALLING_TO_SPOOL, spoolDir);
10465c51f124SMoriah Waterland
10475c51f124SMoriah Waterland b = open_package_datastream(argc, argv, spoolDir, device,
10482e10def1SPeter Tribble &repeat, &ids_name, tmpdir,
10492e10def1SPeter Tribble &pkgdev, optind);
10505c51f124SMoriah Waterland
10515c51f124SMoriah Waterland quitSetIdsName(ids_name);
10525c51f124SMoriah Waterland
10535c51f124SMoriah Waterland if (b != B_TRUE) {
10545c51f124SMoriah Waterland progerr(ERR_CANNOT_OPEN_PKG_STREAM, PSTR(device));
10555c51f124SMoriah Waterland quit(1);
10565c51f124SMoriah Waterland }
10575c51f124SMoriah Waterland
105832991bedSPeter Tribble n = pkgtrans(device, spoolDir, &argv[optind], 0);
10595c51f124SMoriah Waterland quit(n);
10605c51f124SMoriah Waterland /* NOTREACHED */
10615c51f124SMoriah Waterland }
10625c51f124SMoriah Waterland
10635c51f124SMoriah Waterland /*
10645c51f124SMoriah Waterland * error if there are packages on the command line and a category
10655c51f124SMoriah Waterland * was specified
10665c51f124SMoriah Waterland */
10675c51f124SMoriah Waterland
10685c51f124SMoriah Waterland if ((optind < argc) && (catg_arg != NULL)) {
10695c51f124SMoriah Waterland progerr(ERR_PKGS_AND_CAT_PKGADD);
10705c51f124SMoriah Waterland usage();
10715c51f124SMoriah Waterland quit(1);
10725c51f124SMoriah Waterland /* NOTREACHED */
10735c51f124SMoriah Waterland }
10745c51f124SMoriah Waterland
10755c51f124SMoriah Waterland /*
10765c51f124SMoriah Waterland * ********************************************************************
10775c51f124SMoriah Waterland * main package processing "loop"
10785c51f124SMoriah Waterland * ********************************************************************
10795c51f124SMoriah Waterland */
10805c51f124SMoriah Waterland
10815c51f124SMoriah Waterland ids_name = NULL;
10825c51f124SMoriah Waterland quitSetIdsName(ids_name);
10835c51f124SMoriah Waterland
10845c51f124SMoriah Waterland for (;;) {
10855c51f124SMoriah Waterland boolean_t b;
10865c51f124SMoriah Waterland char **pkglist; /* points to array of pkgs */
10875c51f124SMoriah Waterland
10885c51f124SMoriah Waterland /*
10895c51f124SMoriah Waterland * open next package data stream
10905c51f124SMoriah Waterland */
10915c51f124SMoriah Waterland
10925c51f124SMoriah Waterland b = open_package_datastream(argc, argv, spoolDir, device,
10932e10def1SPeter Tribble &repeat, &ids_name, tmpdir,
10942e10def1SPeter Tribble &pkgdev, optind);
10955c51f124SMoriah Waterland
10965c51f124SMoriah Waterland quitSetIdsName(ids_name);
10975c51f124SMoriah Waterland
10985c51f124SMoriah Waterland if (b == B_FALSE) {
10995c51f124SMoriah Waterland echoDebug(ERR_CANNOT_OPEN_PKG_STREAM, PSTR(device));
11005c51f124SMoriah Waterland continue;
11015c51f124SMoriah Waterland }
11025c51f124SMoriah Waterland
11035c51f124SMoriah Waterland /*
11045c51f124SMoriah Waterland * package source data stream open - get the package list
11055c51f124SMoriah Waterland */
11065c51f124SMoriah Waterland
11075c51f124SMoriah Waterland b = get_package_list(&pkglist, argv, catg_arg, category,
11082e10def1SPeter Tribble ids_name, &repeat);
11095c51f124SMoriah Waterland
11105c51f124SMoriah Waterland if (b == B_FALSE) {
11115c51f124SMoriah Waterland echoDebug(DBG_CANNOT_GET_PKGLIST);
11125c51f124SMoriah Waterland
11135c51f124SMoriah Waterland progerr(ERR_NOPKGS, pkgdev.dirname);
11145c51f124SMoriah Waterland quit(1);
11155c51f124SMoriah Waterland /* NOTREACHED */
11165c51f124SMoriah Waterland }
11175c51f124SMoriah Waterland
11185c51f124SMoriah Waterland /*
11195c51f124SMoriah Waterland * count the number of packages to install
11205c51f124SMoriah Waterland * NOTE: npkgs is a global variable that is referenced by quit.c
11215c51f124SMoriah Waterland * when error messages are generated - it is referenced directly
11225c51f124SMoriah Waterland * by the other functions called below...
11235c51f124SMoriah Waterland */
11245c51f124SMoriah Waterland
11255c51f124SMoriah Waterland for (npkgs = 0; pkglist[npkgs] != (char *)NULL; /* void */) {
11265c51f124SMoriah Waterland echoDebug(DBG_PKG_SELECTED, npkgs, pkglist[npkgs]);
11275c51f124SMoriah Waterland npkgs++;
11285c51f124SMoriah Waterland }
11295c51f124SMoriah Waterland
11305c51f124SMoriah Waterland /* output number of packages to be added */
11315c51f124SMoriah Waterland
11325c51f124SMoriah Waterland echoDebug(DBG_NUM_PKGS_TO_ADD, npkgs);
11335c51f124SMoriah Waterland
11345c51f124SMoriah Waterland /*
11355c51f124SMoriah Waterland * if pkgask and response container is a file (not a directory),
11365c51f124SMoriah Waterland * and there is more than one package to install, then it is an
11375c51f124SMoriah Waterland * error - too many packages to install when response container
11385c51f124SMoriah Waterland * is a file.
11395c51f124SMoriah Waterland */
11405c51f124SMoriah Waterland
11415c51f124SMoriah Waterland if ((askflag != 0) && (respdir == (char *)NULL) &&
11422e10def1SPeter Tribble (npkgs > 1)) {
11435c51f124SMoriah Waterland progerr(ERR_TOO_MANY_PKGS);
11445c51f124SMoriah Waterland quit(1);
11455c51f124SMoriah Waterland /* NOTREACHED */
11465c51f124SMoriah Waterland }
11475c51f124SMoriah Waterland
11485c51f124SMoriah Waterland /*
11495c51f124SMoriah Waterland * package list generated - add packages
11505c51f124SMoriah Waterland */
11515c51f124SMoriah Waterland
115232991bedSPeter Tribble b = add_packages(pkglist, ids_name, repeat,
11532e10def1SPeter Tribble altBinDir, device, noZones);
11545c51f124SMoriah Waterland
11555c51f124SMoriah Waterland /*
11565c51f124SMoriah Waterland * close open input data stream (source package) if left open.
11575c51f124SMoriah Waterland */
11585c51f124SMoriah Waterland
11595c51f124SMoriah Waterland if (ids_name) {
11605c51f124SMoriah Waterland echoDebug(DBG_CLOSING_STREAM, ids_name,
11612e10def1SPeter Tribble PSTR(pkgdev.dirname));
11625c51f124SMoriah Waterland (void) ds_close(1);
11635c51f124SMoriah Waterland rrmdir(pkgdev.dirname);
11645c51f124SMoriah Waterland ids_name = NULL;
11655c51f124SMoriah Waterland quitSetIdsName(ids_name);
11665c51f124SMoriah Waterland }
11675c51f124SMoriah Waterland
11685c51f124SMoriah Waterland /*
11695c51f124SMoriah Waterland * continue with next sequence of packages if continue set
11705c51f124SMoriah Waterland */
11715c51f124SMoriah Waterland
11725c51f124SMoriah Waterland if (b == B_TRUE) {
11735c51f124SMoriah Waterland continue;
11745c51f124SMoriah Waterland }
11755c51f124SMoriah Waterland
11765c51f124SMoriah Waterland /*
11775c51f124SMoriah Waterland * not continuing - quit with 0 exit code
11785c51f124SMoriah Waterland */
11795c51f124SMoriah Waterland
11805c51f124SMoriah Waterland quit(0);
11815c51f124SMoriah Waterland /* NOTREACHED */
11825c51f124SMoriah Waterland }
11835c51f124SMoriah Waterland
11845c51f124SMoriah Waterland /* NOTREACHED */
11855c51f124SMoriah Waterland }
11865c51f124SMoriah Waterland
11875c51f124SMoriah Waterland /*
11885c51f124SMoriah Waterland * *****************************************************************************
11895c51f124SMoriah Waterland * static internal (private) functions
11905c51f124SMoriah Waterland * *****************************************************************************
11915c51f124SMoriah Waterland */
11925c51f124SMoriah Waterland
11935c51f124SMoriah Waterland /*
11945c51f124SMoriah Waterland * Name: pkgZoneCheckInstall
11955c51f124SMoriah Waterland * Description: Invoke pkginstall in a specified zone to perform a preinstall
11965c51f124SMoriah Waterland * check of the a single package in the specified zone
11975c51f124SMoriah Waterland * Arguments: a_zoneName - pointer to string representing the name of the
11985c51f124SMoriah Waterland * zone to check install the package in.
11995c51f124SMoriah Waterland * a_zoneState - current state of the zone; must be mounted or
12005c51f124SMoriah Waterland * running.
12015c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
12025c51f124SMoriah Waterland * device (input data stream) containing the package to
12035c51f124SMoriah Waterland * be check installed.
12045c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
12055c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
12065c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
12075c51f124SMoriah Waterland * passed to pkginstall.
12085c51f124SMoriah Waterland * a_adminFile - pointer to string representing the admin
12095c51f124SMoriah Waterland * file to pass to pkginstall when installing the package.
12105c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
12115c51f124SMoriah Waterland * a_stdoutPath - pointer to string representing the local path
12125c51f124SMoriah Waterland * into which all output written by pkginstall to stdout
12135c51f124SMoriah Waterland * is stored.
12145c51f124SMoriah Waterland * If this is == NULL stdout is redirected to /dev/null
121562224350SCasper H.S. Dik * a_tmpzn - B_TRUE when this zone is booted by the package
121662224350SCasper H.S. Dik * command or B_FALSE if it was running before.
12175c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
12185c51f124SMoriah Waterland * 0 - success
12195c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
12205c51f124SMoriah Waterland * 2 - non-fatal error (warning)
12215c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
12225c51f124SMoriah Waterland * 4 - admin settings prevented operation
12235c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
12245c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
12255c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
12265c51f124SMoriah Waterland */
12275c51f124SMoriah Waterland
12285c51f124SMoriah Waterland static int
pkgZoneCheckInstall(char * a_zoneName,zone_state_t a_zoneState,char * a_idsName,char * a_altBinDir,char * a_adminFile,char * a_stdoutPath,boolean_t a_tmpzn)12296e1ae2a3SGary Pennington pkgZoneCheckInstall(char *a_zoneName, zone_state_t a_zoneState,
12302e10def1SPeter Tribble char *a_idsName, char *a_altBinDir, char *a_adminFile,
12312e10def1SPeter Tribble char *a_stdoutPath, boolean_t a_tmpzn)
12325c51f124SMoriah Waterland {
12335c51f124SMoriah Waterland char *arg[MAXARGS];
12345c51f124SMoriah Waterland char *p;
12355c51f124SMoriah Waterland char adminfd_path[PATH_MAX];
12365c51f124SMoriah Waterland char path[PATH_MAX];
12375c51f124SMoriah Waterland char pkgstreamfd_path[PATH_MAX];
12385c51f124SMoriah Waterland int fds[MAX_FDS];
12395c51f124SMoriah Waterland int maxfds;
12405c51f124SMoriah Waterland int n;
12415c51f124SMoriah Waterland int nargs;
12425c51f124SMoriah Waterland
12435c51f124SMoriah Waterland /* entry assertions */
12445c51f124SMoriah Waterland
12455c51f124SMoriah Waterland assert(a_zoneName != (char *)NULL);
12465c51f124SMoriah Waterland assert(*a_zoneName != '\0');
12475c51f124SMoriah Waterland
12485c51f124SMoriah Waterland /* entry debugging info */
12495c51f124SMoriah Waterland
12505c51f124SMoriah Waterland echoDebug(DBG_PKGZONECHECKINSTALL_ENTRY);
12515c51f124SMoriah Waterland echoDebug(DBG_PKGZONECHECKINSTALL_ARGS, a_zoneName, PSTR(pkginst),
12522e10def1SPeter Tribble PSTR(pkgdev.dirname), PSTR(pkgdev.mount), PSTR(pkgdev.bdevice),
12532e10def1SPeter Tribble a_zoneState == ZONE_STATE_MOUNTED ? "/a" : "/",
12542e10def1SPeter Tribble PSTR(a_idsName), PSTR(a_adminFile), PSTR(a_stdoutPath));
12555c51f124SMoriah Waterland
12565c51f124SMoriah Waterland /* generate full path to 'phatinstall' to run in zone */
12575c51f124SMoriah Waterland
12585c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/pkginstall",
12592e10def1SPeter Tribble "/usr/sadm/install/bin");
12605c51f124SMoriah Waterland
12615c51f124SMoriah Waterland /* start at first file descriptor */
12625c51f124SMoriah Waterland
12635c51f124SMoriah Waterland maxfds = 0;
12645c51f124SMoriah Waterland
12655c51f124SMoriah Waterland /*
12665c51f124SMoriah Waterland * generate argument list for call to pkginstall
12675c51f124SMoriah Waterland */
12685c51f124SMoriah Waterland
12695c51f124SMoriah Waterland /* start at argument 0 */
12705c51f124SMoriah Waterland
12715c51f124SMoriah Waterland nargs = 0;
12725c51f124SMoriah Waterland
12735c51f124SMoriah Waterland /* first argument is always: full path to executable */
12745c51f124SMoriah Waterland
12755c51f124SMoriah Waterland arg[nargs++] = path;
12765c51f124SMoriah Waterland
12775c51f124SMoriah Waterland /*
12785c51f124SMoriah Waterland * second argument is always: pass -O debug to pkginstall: debug mode
12795c51f124SMoriah Waterland */
12805c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
12815c51f124SMoriah Waterland arg[nargs++] = "-O";
12825c51f124SMoriah Waterland arg[nargs++] = "debug";
12835c51f124SMoriah Waterland }
12845c51f124SMoriah Waterland
12855c51f124SMoriah Waterland /* pkgadd -G: pass -G to pkginstall */
12865c51f124SMoriah Waterland
12875c51f124SMoriah Waterland if (globalZoneOnly == B_TRUE) {
12885c51f124SMoriah Waterland arg[nargs++] = "-G";
12895c51f124SMoriah Waterland }
12905c51f124SMoriah Waterland
12915c51f124SMoriah Waterland /* pkgadd -b dir: pass -b to pkginstall */
12925c51f124SMoriah Waterland
12935c51f124SMoriah Waterland if (a_altBinDir != (char *)NULL) {
12945c51f124SMoriah Waterland arg[nargs++] = "-b";
12955c51f124SMoriah Waterland arg[nargs++] = a_altBinDir;
12965c51f124SMoriah Waterland }
12975c51f124SMoriah Waterland
12985c51f124SMoriah Waterland /* pkgadd -C: pass -C to pkginstall: disable checksum */
12995c51f124SMoriah Waterland
13005c51f124SMoriah Waterland if (disableChecksum) {
13015c51f124SMoriah Waterland arg[nargs++] = "-C";
13025c51f124SMoriah Waterland }
13035c51f124SMoriah Waterland
13045c51f124SMoriah Waterland /* pkgadd -A: pass -A to pkginstall: disable attribute checking */
13055c51f124SMoriah Waterland
13065c51f124SMoriah Waterland if (disableAttributes) {
13075c51f124SMoriah Waterland arg[nargs++] = "-A";
13085c51f124SMoriah Waterland }
13095c51f124SMoriah Waterland
13105c51f124SMoriah Waterland /*
13115c51f124SMoriah Waterland * NONABI_SCRIPTS defined: pass -o to pkginstall; refers to a
13125c51f124SMoriah Waterland * pkg requiring operator interaction during a procedure script
13135c51f124SMoriah Waterland * (common before on1093)
13145c51f124SMoriah Waterland */
13155c51f124SMoriah Waterland
13165c51f124SMoriah Waterland if (old_pkg) {
13175c51f124SMoriah Waterland arg[nargs++] = "-o";
13185c51f124SMoriah Waterland }
13195c51f124SMoriah Waterland
13205c51f124SMoriah Waterland /*
13215c51f124SMoriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkginstall; process
13225c51f124SMoriah Waterland * symlinks consistent with old behavior
13235c51f124SMoriah Waterland */
13245c51f124SMoriah Waterland
13255c51f124SMoriah Waterland if (old_symlinks) {
13265c51f124SMoriah Waterland arg[nargs++] = "-y";
13275c51f124SMoriah Waterland }
13285c51f124SMoriah Waterland
13295c51f124SMoriah Waterland /*
13305c51f124SMoriah Waterland * PKG_ABI_NAMELENGTH defined: pass -e to pkginstall; causes
13315c51f124SMoriah Waterland * package name length to be restricted
13325c51f124SMoriah Waterland */
13335c51f124SMoriah Waterland
13345c51f124SMoriah Waterland if (ABI_namelength) {
13355c51f124SMoriah Waterland arg[nargs++] = "-e";
13365c51f124SMoriah Waterland }
13375c51f124SMoriah Waterland
13385c51f124SMoriah Waterland /* pkgadd -S: pass -S to pkginstall: suppress copyright notices */
13395c51f124SMoriah Waterland
13405c51f124SMoriah Waterland arg[nargs++] = "-S";
13415c51f124SMoriah Waterland
13425c51f124SMoriah Waterland /* pkgadd -M: pass -M to pkginstall: dont mount client file systems */
13435c51f124SMoriah Waterland
13445c51f124SMoriah Waterland arg[nargs++] = "-M";
13455c51f124SMoriah Waterland
13465c51f124SMoriah Waterland /* pkgadd -v: pass -v to pkginstall: never trace scripts */
13475c51f124SMoriah Waterland
13485c51f124SMoriah Waterland /* if running pkgask, pass -i to pkginstall: running pkgask */
13495c51f124SMoriah Waterland
13505c51f124SMoriah Waterland if (askflag) {
13515c51f124SMoriah Waterland return (0);
13525c51f124SMoriah Waterland }
13535c51f124SMoriah Waterland
13545c51f124SMoriah Waterland /* pass "-O enable-hollow-package-support" */
13555c51f124SMoriah Waterland
13565c51f124SMoriah Waterland if (is_depend_pkginfo_DB()) {
13575c51f124SMoriah Waterland arg[nargs++] = "-O";
13585c51f124SMoriah Waterland arg[nargs++] = "enable-hollow-package-support";
13595c51f124SMoriah Waterland }
13605c51f124SMoriah Waterland
13615c51f124SMoriah Waterland /* check is always in non-interactive mode */
13625c51f124SMoriah Waterland
13635c51f124SMoriah Waterland arg[nargs++] = "-n";
13645c51f124SMoriah Waterland
13655c51f124SMoriah Waterland /* pkgadd -a admin: pass -a admin to pkginstall in zone: admin file */
13665c51f124SMoriah Waterland
13675c51f124SMoriah Waterland if (a_adminFile) {
13685c51f124SMoriah Waterland int fd;
13695c51f124SMoriah Waterland fd = openLocal(a_adminFile, O_RDONLY, tmpdir);
13705c51f124SMoriah Waterland if (fd < 0) {
13715c51f124SMoriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
13722e10def1SPeter Tribble errno, strerror(errno));
13735c51f124SMoriah Waterland return (1);
13745c51f124SMoriah Waterland }
13755c51f124SMoriah Waterland (void) snprintf(adminfd_path, sizeof (adminfd_path),
13762e10def1SPeter Tribble "/proc/self/fd/%d", fd);
13775c51f124SMoriah Waterland fds[maxfds++] = fd;
13785c51f124SMoriah Waterland arg[nargs++] = "-a";
13795c51f124SMoriah Waterland arg[nargs++] = adminfd_path;
13805c51f124SMoriah Waterland }
13815c51f124SMoriah Waterland
13825c51f124SMoriah Waterland /* pkgadd -R root: pass -R /a to pkginstall when zone is mounted */
13835c51f124SMoriah Waterland
13845c51f124SMoriah Waterland if (a_zoneState == ZONE_STATE_MOUNTED) {
13855c51f124SMoriah Waterland arg[nargs++] = "-R";
13865c51f124SMoriah Waterland arg[nargs++] = "/a";
13875c51f124SMoriah Waterland }
13885c51f124SMoriah Waterland
13895c51f124SMoriah Waterland /* pass -N to pkginstall: program name to report */
13905c51f124SMoriah Waterland
13915c51f124SMoriah Waterland arg[nargs++] = "-N";
13925c51f124SMoriah Waterland arg[nargs++] = get_prog_name();
13935c51f124SMoriah Waterland
13945c51f124SMoriah Waterland /* pass "-O preinstallcheck" */
13955c51f124SMoriah Waterland
13965c51f124SMoriah Waterland arg[nargs++] = "-O";
13975c51f124SMoriah Waterland arg[nargs++] = "preinstallcheck";
13985c51f124SMoriah Waterland
13995c51f124SMoriah Waterland /* add "-O addzonename" */
14005c51f124SMoriah Waterland
14015c51f124SMoriah Waterland arg[nargs++] = "-O";
14025c51f124SMoriah Waterland arg[nargs++] = "addzonename";
14035c51f124SMoriah Waterland
14045c51f124SMoriah Waterland /*
14055c51f124SMoriah Waterland * add parent zone info/type
14065c51f124SMoriah Waterland */
14075c51f124SMoriah Waterland
14085c51f124SMoriah Waterland p = z_get_zonename();
14095c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) {
14105c51f124SMoriah Waterland char zn[MAXPATHLEN];
14115c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
14122e10def1SPeter Tribble "parent-zone-name=%s", p);
14135c51f124SMoriah Waterland arg[nargs++] = "-O";
14145c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
14155c51f124SMoriah Waterland }
14165c51f124SMoriah Waterland
14175c51f124SMoriah Waterland /* current zone type */
14185c51f124SMoriah Waterland
14195c51f124SMoriah Waterland arg[nargs++] = "-O";
14205c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
14215c51f124SMoriah Waterland char zn[MAXPATHLEN];
14225c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
14232e10def1SPeter Tribble "parent-zone-type=%s",
14242e10def1SPeter Tribble TAG_VALUE_GLOBAL_ZONE);
14255c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
14265c51f124SMoriah Waterland } else {
14275c51f124SMoriah Waterland char zn[MAXPATHLEN];
14285c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
14292e10def1SPeter Tribble "parent-zone-type=%s",
14302e10def1SPeter Tribble TAG_VALUE_NONGLOBAL_ZONE);
14315c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
14325c51f124SMoriah Waterland }
14335c51f124SMoriah Waterland
143462224350SCasper H.S. Dik /* Add the pkgserv options */
143562224350SCasper H.S. Dik arg[nargs++] = "-O";
143662224350SCasper H.S. Dik arg[nargs++] = pkgmodeargument(a_tmpzn ? RUN_ONCE : pkgservergetmode());
143762224350SCasper H.S. Dik
14385c51f124SMoriah Waterland /* add in the package stream file */
14395c51f124SMoriah Waterland
14405c51f124SMoriah Waterland if (a_idsName != NULL) {
14415c51f124SMoriah Waterland int fd;
14425c51f124SMoriah Waterland fd = openLocal(a_idsName, O_RDONLY, tmpdir);
14435c51f124SMoriah Waterland if (fd < 0) {
14445c51f124SMoriah Waterland progerr(ERR_STREAM_UNAVAILABLE, a_idsName,
14452e10def1SPeter Tribble pkginst, strerror(errno));
14465c51f124SMoriah Waterland quit(1);
14475c51f124SMoriah Waterland }
14485c51f124SMoriah Waterland (void) snprintf(pkgstreamfd_path, sizeof (pkgstreamfd_path),
14492e10def1SPeter Tribble "/proc/self/fd/%d", fd);
14505c51f124SMoriah Waterland fds[maxfds++] = fd;
14515c51f124SMoriah Waterland arg[nargs++] = pkgstreamfd_path;
14525c51f124SMoriah Waterland } else {
14535c51f124SMoriah Waterland progerr(ERR_PKGZONEINSTALL_NO_STREAM);
14545c51f124SMoriah Waterland quit(1);
14555c51f124SMoriah Waterland }
14565c51f124SMoriah Waterland
14575c51f124SMoriah Waterland /* add package instance name */
14585c51f124SMoriah Waterland
14595c51f124SMoriah Waterland arg[nargs++] = pkginst;
14605c51f124SMoriah Waterland
14615c51f124SMoriah Waterland /* terminate the argument list */
14625c51f124SMoriah Waterland
14635c51f124SMoriah Waterland arg[nargs++] = NULL;
14645c51f124SMoriah Waterland
14655c51f124SMoriah Waterland /*
14665c51f124SMoriah Waterland * run the appropriate pkginstall command in the specified zone
14675c51f124SMoriah Waterland */
14685c51f124SMoriah Waterland
14695c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
14705c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, a_zoneName, arg[0]);
14715c51f124SMoriah Waterland for (n = 0; arg[n]; n++) {
14725c51f124SMoriah Waterland echoDebug(DBG_ARG, n, arg[n]);
14735c51f124SMoriah Waterland }
14745c51f124SMoriah Waterland }
14755c51f124SMoriah Waterland
14765c51f124SMoriah Waterland /* terminate file descriptor list */
14775c51f124SMoriah Waterland
14785c51f124SMoriah Waterland fds[maxfds] = -1;
14795c51f124SMoriah Waterland
14805c51f124SMoriah Waterland /* exec command in zone */
14815c51f124SMoriah Waterland
14825c51f124SMoriah Waterland n = z_zone_exec(a_zoneName, path, arg, a_stdoutPath, (char *)NULL, fds);
14835c51f124SMoriah Waterland
14845c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_EXIT, a_zoneName, arg[0], n,
14852e10def1SPeter Tribble PSTR(a_stdoutPath));
14865c51f124SMoriah Waterland
14875c51f124SMoriah Waterland /*
14885c51f124SMoriah Waterland * close any files that were opened for use by the
14895c51f124SMoriah Waterland * /proc/self/fd interface so they could be passed to programs
14905c51f124SMoriah Waterland * via the z_zone_exec() interface
14915c51f124SMoriah Waterland */
14925c51f124SMoriah Waterland
14935c51f124SMoriah Waterland for (; maxfds > 0; maxfds--) {
14945c51f124SMoriah Waterland (void) close(fds[maxfds-1]);
14955c51f124SMoriah Waterland }
14965c51f124SMoriah Waterland
14975c51f124SMoriah Waterland /* return results of pkginstall in zone execution */
14985c51f124SMoriah Waterland
14995c51f124SMoriah Waterland return (n);
15005c51f124SMoriah Waterland }
15015c51f124SMoriah Waterland
15025c51f124SMoriah Waterland /*
15035c51f124SMoriah Waterland * Name: pkgZoneInstall
15045c51f124SMoriah Waterland * Description: Invoke pkginstall in a specified zone to perform an install
15055c51f124SMoriah Waterland * of a single package in the specified zone
15065c51f124SMoriah Waterland * Arguments: a_zoneName - pointer to string representing the name of the
15075c51f124SMoriah Waterland * zone to install the package in.
15085c51f124SMoriah Waterland * a_zoneState - current state of the zone; must be mounted or
15095c51f124SMoriah Waterland * running.
15105c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
15115c51f124SMoriah Waterland * device (input data stream) containing the package to
15125c51f124SMoriah Waterland * be installed.
15135c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
15145c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
15155c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
15165c51f124SMoriah Waterland * passed to pkginstall.
15175c51f124SMoriah Waterland * a_adminFile - pointer to string representing the admin
15185c51f124SMoriah Waterland * file to pass to pkginstall when installing the package.
15195c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
15205c51f124SMoriah Waterland * a_stdoutPath - pointer to string representing the local path
15215c51f124SMoriah Waterland * into which all output written by pkginstall to stdout
15225c51f124SMoriah Waterland * is stored.
15235c51f124SMoriah Waterland * If this is == NULL stdout is redirected to /dev/null
152462224350SCasper H.S. Dik * a_tmpzn - B_TRUE when this zone is booted by the package
152562224350SCasper H.S. Dik * command or B_FALSE if it was running before.
15265c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
15275c51f124SMoriah Waterland * 0 - success
15285c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
15295c51f124SMoriah Waterland * 2 - non-fatal error (warning)
15305c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
15315c51f124SMoriah Waterland * 4 - admin settings prevented operation
15325c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
15335c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
15345c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
15355c51f124SMoriah Waterland */
15365c51f124SMoriah Waterland
15375c51f124SMoriah Waterland static int
pkgZoneInstall(char * a_zoneName,zone_state_t a_zoneState,char * a_idsName,char * a_altBinDir,char * a_adminFile,boolean_t a_tmpzn)15386e1ae2a3SGary Pennington pkgZoneInstall(char *a_zoneName, zone_state_t a_zoneState, char *a_idsName,
15396e1ae2a3SGary Pennington char *a_altBinDir, char *a_adminFile, boolean_t a_tmpzn)
15405c51f124SMoriah Waterland {
15415c51f124SMoriah Waterland char *arg[MAXARGS];
15425c51f124SMoriah Waterland char *p;
15435c51f124SMoriah Waterland char adminfd_path[PATH_MAX];
15445c51f124SMoriah Waterland char path[PATH_MAX];
15455c51f124SMoriah Waterland char pkgstreamfd_path[PATH_MAX];
15465c51f124SMoriah Waterland char respfilefd_path[PATH_MAX];
15475c51f124SMoriah Waterland int fds[MAX_FDS];
15485c51f124SMoriah Waterland int maxfds;
15495c51f124SMoriah Waterland int n;
15505c51f124SMoriah Waterland int nargs;
15515c51f124SMoriah Waterland
15525c51f124SMoriah Waterland /* entry assertions */
15535c51f124SMoriah Waterland
15545c51f124SMoriah Waterland assert(a_zoneName != (char *)NULL);
15555c51f124SMoriah Waterland assert(*a_zoneName != '\0');
15565c51f124SMoriah Waterland
15575c51f124SMoriah Waterland /* entry debugging info */
15585c51f124SMoriah Waterland
15595c51f124SMoriah Waterland echoDebug(DBG_PKGZONEINSTALL_ENTRY);
15605c51f124SMoriah Waterland echoDebug(DBG_PKGZONEINSTALL_ARGS, a_zoneName, PSTR(pkginst),
15612e10def1SPeter Tribble PSTR(pkgdev.dirname), PSTR(pkgdev.mount), PSTR(pkgdev.bdevice),
15622e10def1SPeter Tribble a_zoneState == ZONE_STATE_MOUNTED ? "/a" : "", PSTR(a_idsName),
15632e10def1SPeter Tribble a_adminFile);
15645c51f124SMoriah Waterland
15655c51f124SMoriah Waterland /* generate path to pkginstall */
15665c51f124SMoriah Waterland
15675c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/pkginstall", PKGBIN);
15685c51f124SMoriah Waterland
15695c51f124SMoriah Waterland /* start at first file descriptor */
15705c51f124SMoriah Waterland
15715c51f124SMoriah Waterland maxfds = 0;
15725c51f124SMoriah Waterland
15735c51f124SMoriah Waterland /*
15745c51f124SMoriah Waterland * generate argument list for call to pkginstall
15755c51f124SMoriah Waterland */
15765c51f124SMoriah Waterland
15775c51f124SMoriah Waterland /* start at argument 0 */
15785c51f124SMoriah Waterland
15795c51f124SMoriah Waterland nargs = 0;
15805c51f124SMoriah Waterland
15815c51f124SMoriah Waterland /* first argument is path to executable */
15825c51f124SMoriah Waterland
15835c51f124SMoriah Waterland arg[nargs++] = path;
15845c51f124SMoriah Waterland
15855c51f124SMoriah Waterland /*
15865c51f124SMoriah Waterland * second argument is always: pass -O debug to pkginstall: debug mode
15875c51f124SMoriah Waterland */
15885c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
15895c51f124SMoriah Waterland arg[nargs++] = "-O";
15905c51f124SMoriah Waterland arg[nargs++] = "debug";
15915c51f124SMoriah Waterland }
15925c51f124SMoriah Waterland
15935c51f124SMoriah Waterland /* pkgadd -G: pass -G to pkginstall */
15945c51f124SMoriah Waterland
15955c51f124SMoriah Waterland if (globalZoneOnly == B_TRUE) {
15965c51f124SMoriah Waterland arg[nargs++] = "-G";
15975c51f124SMoriah Waterland }
15985c51f124SMoriah Waterland
15995c51f124SMoriah Waterland /* pkgadd -b dir: pass -b to pkginstall in zone */
16005c51f124SMoriah Waterland
16015c51f124SMoriah Waterland if (a_altBinDir != (char *)NULL) {
16025c51f124SMoriah Waterland arg[nargs++] = "-b";
16035c51f124SMoriah Waterland arg[nargs++] = a_altBinDir;
16045c51f124SMoriah Waterland }
16055c51f124SMoriah Waterland
16065c51f124SMoriah Waterland /* pkgadd -B blocksize: pass -B to pkginstall in zone */
16075c51f124SMoriah Waterland
16085c51f124SMoriah Waterland if (rw_block_size != NULL) {
16095c51f124SMoriah Waterland arg[nargs++] = "-B";
16105c51f124SMoriah Waterland arg[nargs++] = rw_block_size;
16115c51f124SMoriah Waterland }
16125c51f124SMoriah Waterland
16135c51f124SMoriah Waterland /* pkgadd -C: pass -C to pkgadd in zone: disable checksum */
16145c51f124SMoriah Waterland
16155c51f124SMoriah Waterland if (disableChecksum) {
16165c51f124SMoriah Waterland arg[nargs++] = "-C";
16175c51f124SMoriah Waterland }
16185c51f124SMoriah Waterland
16195c51f124SMoriah Waterland /* pkgadd -A: pass -A to pkgadd in zone: disable attribute checking */
16205c51f124SMoriah Waterland
16215c51f124SMoriah Waterland if (disableAttributes) {
16225c51f124SMoriah Waterland arg[nargs++] = "-A";
16235c51f124SMoriah Waterland }
16245c51f124SMoriah Waterland
16255c51f124SMoriah Waterland /* pkgadd -S: pass -S to pkgadd in zone: suppress copyright notices */
16265c51f124SMoriah Waterland
16275c51f124SMoriah Waterland arg[nargs++] = "-S";
16285c51f124SMoriah Waterland
16295c51f124SMoriah Waterland /* pkgadd -I: pass -I to pkgadd in zone: initial install */
16305c51f124SMoriah Waterland
16315c51f124SMoriah Waterland if (init_install) {
16325c51f124SMoriah Waterland arg[nargs++] = "-I";
16335c51f124SMoriah Waterland }
16345c51f124SMoriah Waterland
16355c51f124SMoriah Waterland /* pkgadd -M: pass -M to pkgadd in zone: dont mount client file sys */
16365c51f124SMoriah Waterland
16375c51f124SMoriah Waterland arg[nargs++] = "-M";
16385c51f124SMoriah Waterland
16395c51f124SMoriah Waterland /* pkgadd -v: pass -v to pkgadd in zone: trace scripts */
16405c51f124SMoriah Waterland
16415c51f124SMoriah Waterland if (pkgverbose) {
16425c51f124SMoriah Waterland arg[nargs++] = "-v";
16435c51f124SMoriah Waterland }
16445c51f124SMoriah Waterland
16455c51f124SMoriah Waterland /* pkgadd -z: pass -z to pkgadd in zone fresh inst from pkg save area */
16465c51f124SMoriah Waterland
16475c51f124SMoriah Waterland if (saveSpoolInstall) {
16485c51f124SMoriah Waterland arg[nargs++] = "-z";
16495c51f124SMoriah Waterland }
16505c51f124SMoriah Waterland
16515c51f124SMoriah Waterland /* pass "-O enable-hollow-package-support" */
16525c51f124SMoriah Waterland
16535c51f124SMoriah Waterland if (is_depend_pkginfo_DB()) {
16545c51f124SMoriah Waterland arg[nargs++] = "-O";
16555c51f124SMoriah Waterland arg[nargs++] = "enable-hollow-package-support";
16565c51f124SMoriah Waterland }
16575c51f124SMoriah Waterland
16585c51f124SMoriah Waterland /* pkgadd -t pass -t to pkgadd in zone disable save spool area create */
16595c51f124SMoriah Waterland
16605c51f124SMoriah Waterland if (disableSaveSpool) {
16615c51f124SMoriah Waterland arg[nargs++] = "-t";
16625c51f124SMoriah Waterland }
16635c51f124SMoriah Waterland
16645c51f124SMoriah Waterland /* if running pkgask, pass -i to pkgadd in zone: running pkgask */
16655c51f124SMoriah Waterland
16665c51f124SMoriah Waterland if (askflag) {
16675c51f124SMoriah Waterland echo(MSG_BYPASSING_ZONE, a_zoneName);
16685c51f124SMoriah Waterland return (0);
16695c51f124SMoriah Waterland }
16705c51f124SMoriah Waterland
16715c51f124SMoriah Waterland /*
16725c51f124SMoriah Waterland * pkgadd -n (not pkgask): pass -n to pkginstall: noninteractive mode
16735c51f124SMoriah Waterland */
16745c51f124SMoriah Waterland if (nointeract && !askflag) {
16755c51f124SMoriah Waterland arg[nargs++] = "-n";
16765c51f124SMoriah Waterland }
16775c51f124SMoriah Waterland
16785c51f124SMoriah Waterland /* pkgadd -a admin: pass -a admin to pkginstall in zone: admin file */
16795c51f124SMoriah Waterland
16805c51f124SMoriah Waterland if (a_adminFile) {
16815c51f124SMoriah Waterland int fd;
16825c51f124SMoriah Waterland fd = openLocal(a_adminFile, O_RDONLY, tmpdir);
16835c51f124SMoriah Waterland if (fd < 0) {
16845c51f124SMoriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
16852e10def1SPeter Tribble errno, strerror(errno));
16865c51f124SMoriah Waterland return (1);
16875c51f124SMoriah Waterland }
16885c51f124SMoriah Waterland (void) snprintf(adminfd_path, sizeof (adminfd_path),
16892e10def1SPeter Tribble "/proc/self/fd/%d", fd);
16905c51f124SMoriah Waterland fds[maxfds++] = fd;
16915c51f124SMoriah Waterland arg[nargs++] = "-a";
16925c51f124SMoriah Waterland arg[nargs++] = adminfd_path;
16935c51f124SMoriah Waterland }
16945c51f124SMoriah Waterland
16955c51f124SMoriah Waterland /* pkgadd -R root: pass -R /a to pkginstall when zone is mounted */
16965c51f124SMoriah Waterland if (a_zoneState == ZONE_STATE_MOUNTED) {
16975c51f124SMoriah Waterland arg[nargs++] = "-R";
16985c51f124SMoriah Waterland arg[nargs++] = "/a";
16995c51f124SMoriah Waterland }
17005c51f124SMoriah Waterland
17015c51f124SMoriah Waterland /*
17025c51f124SMoriah Waterland * pkgadd -D arg: pass -D dryrun to pkginstall in zone: dryrun
17035c51f124SMoriah Waterland * mode/file
17045c51f124SMoriah Waterland */
17055c51f124SMoriah Waterland if (pkgdrtarg) {
17065c51f124SMoriah Waterland arg[nargs++] = "-D";
17075c51f124SMoriah Waterland arg[nargs++] = pkgdrtarg;
17085c51f124SMoriah Waterland }
17095c51f124SMoriah Waterland
17105c51f124SMoriah Waterland /*
17115c51f124SMoriah Waterland * pkgadd -c cont: pass -c cont to pkginstall in zone: continuation
17125c51f124SMoriah Waterland * file
17135c51f124SMoriah Waterland */
17145c51f124SMoriah Waterland if (pkgcontsrc) {
17155c51f124SMoriah Waterland arg[nargs++] = "-c";
17165c51f124SMoriah Waterland arg[nargs++] = pkgcontsrc;
17175c51f124SMoriah Waterland }
17185c51f124SMoriah Waterland
17195c51f124SMoriah Waterland /* pkgadd -r resp: pass -r resp to pkginstall in zone: response file */
17205c51f124SMoriah Waterland
17215c51f124SMoriah Waterland if (respfile) {
17225c51f124SMoriah Waterland int fd;
17235c51f124SMoriah Waterland fd = openLocal(respfile, O_RDONLY, tmpdir);
17245c51f124SMoriah Waterland if (fd < 0) {
17255c51f124SMoriah Waterland progerr(ERR_CANNOT_COPY_LOCAL, a_adminFile,
17262e10def1SPeter Tribble errno, strerror(errno));
17275c51f124SMoriah Waterland return (1);
17285c51f124SMoriah Waterland }
17295c51f124SMoriah Waterland (void) snprintf(respfilefd_path,
17302e10def1SPeter Tribble sizeof (respfilefd_path),
17312e10def1SPeter Tribble "/proc/self/fd/%d", fd);
17325c51f124SMoriah Waterland fds[maxfds++] = fd;
17335c51f124SMoriah Waterland arg[nargs++] = "-r";
17345c51f124SMoriah Waterland arg[nargs++] = respfilefd_path;
17355c51f124SMoriah Waterland }
17365c51f124SMoriah Waterland
17375c51f124SMoriah Waterland /* add "-O addzonename" */
17385c51f124SMoriah Waterland
17395c51f124SMoriah Waterland arg[nargs++] = "-O";
17405c51f124SMoriah Waterland arg[nargs++] = "addzonename";
17415c51f124SMoriah Waterland
17425c51f124SMoriah Waterland /*
17435c51f124SMoriah Waterland * add parent zone info/type
17445c51f124SMoriah Waterland */
17455c51f124SMoriah Waterland
17465c51f124SMoriah Waterland p = z_get_zonename();
17475c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) {
17485c51f124SMoriah Waterland char zn[MAXPATHLEN];
17495c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
17502e10def1SPeter Tribble "parent-zone-name=%s", p);
17515c51f124SMoriah Waterland arg[nargs++] = "-O";
17525c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
17535c51f124SMoriah Waterland }
17545c51f124SMoriah Waterland
17555c51f124SMoriah Waterland /* current zone type */
17565c51f124SMoriah Waterland
17575c51f124SMoriah Waterland arg[nargs++] = "-O";
17585c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
17595c51f124SMoriah Waterland char zn[MAXPATHLEN];
17605c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
17612e10def1SPeter Tribble "parent-zone-type=%s",
17622e10def1SPeter Tribble TAG_VALUE_GLOBAL_ZONE);
17635c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
17645c51f124SMoriah Waterland } else {
17655c51f124SMoriah Waterland char zn[MAXPATHLEN];
17665c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
17672e10def1SPeter Tribble "parent-zone-type=%s",
17682e10def1SPeter Tribble TAG_VALUE_NONGLOBAL_ZONE);
17695c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
17705c51f124SMoriah Waterland }
17715c51f124SMoriah Waterland
177262224350SCasper H.S. Dik /* Add the pkgserv options */
177362224350SCasper H.S. Dik arg[nargs++] = "-O";
177462224350SCasper H.S. Dik arg[nargs++] = pkgmodeargument(a_tmpzn ? RUN_ONCE : pkgservergetmode());
177562224350SCasper H.S. Dik
17765c51f124SMoriah Waterland /* add in the package stream file */
17775c51f124SMoriah Waterland
17785c51f124SMoriah Waterland if (a_idsName != NULL) {
17795c51f124SMoriah Waterland int fd;
17805c51f124SMoriah Waterland fd = openLocal(a_idsName, O_RDONLY, tmpdir);
17815c51f124SMoriah Waterland if (fd < 0) {
17825c51f124SMoriah Waterland progerr(ERR_STREAM_UNAVAILABLE, a_idsName,
17832e10def1SPeter Tribble pkginst, strerror(errno));
17845c51f124SMoriah Waterland quit(1);
17855c51f124SMoriah Waterland }
17865c51f124SMoriah Waterland (void) snprintf(pkgstreamfd_path, sizeof (pkgstreamfd_path),
17872e10def1SPeter Tribble "/proc/self/fd/%d", fd);
17885c51f124SMoriah Waterland fds[maxfds++] = fd;
17895c51f124SMoriah Waterland arg[nargs++] = pkgstreamfd_path;
17905c51f124SMoriah Waterland } else {
17915c51f124SMoriah Waterland progerr(ERR_PKGZONEINSTALL_NO_STREAM);
17925c51f124SMoriah Waterland quit(1);
17935c51f124SMoriah Waterland }
17945c51f124SMoriah Waterland
17955c51f124SMoriah Waterland /* add package instance name */
17965c51f124SMoriah Waterland
17975c51f124SMoriah Waterland arg[nargs++] = pkginst;
17985c51f124SMoriah Waterland
17995c51f124SMoriah Waterland /* terminate the argument list */
18005c51f124SMoriah Waterland
18015c51f124SMoriah Waterland arg[nargs++] = NULL;
18025c51f124SMoriah Waterland
18035c51f124SMoriah Waterland /*
18045c51f124SMoriah Waterland * run the appropriate pkginstall command in the specified zone
18055c51f124SMoriah Waterland */
18065c51f124SMoriah Waterland
18075c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
18085c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, a_zoneName, arg[0]);
18095c51f124SMoriah Waterland for (n = 0; arg[n]; n++) {
18105c51f124SMoriah Waterland echoDebug(DBG_ARG, n, arg[n]);
18115c51f124SMoriah Waterland }
18125c51f124SMoriah Waterland }
18135c51f124SMoriah Waterland
18145c51f124SMoriah Waterland /* terminate file descriptor list */
18155c51f124SMoriah Waterland
18165c51f124SMoriah Waterland fds[maxfds] = -1;
18175c51f124SMoriah Waterland
18185c51f124SMoriah Waterland /* exec command in zone */
18195c51f124SMoriah Waterland
18205c51f124SMoriah Waterland n = z_zone_exec(a_zoneName, path, arg, (char *)NULL, (char *)NULL, fds);
18215c51f124SMoriah Waterland
18225c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_EXIT, a_zoneName, arg[0], n, "");
18235c51f124SMoriah Waterland
18245c51f124SMoriah Waterland /*
18255c51f124SMoriah Waterland * close any files that were opened for use by the
18265c51f124SMoriah Waterland * /proc/self/fd interface so they could be passed to programs
18275c51f124SMoriah Waterland * via the z_zone_exec() interface
18285c51f124SMoriah Waterland */
18295c51f124SMoriah Waterland
18305c51f124SMoriah Waterland for (; maxfds > 0; maxfds--) {
18315c51f124SMoriah Waterland (void) close(fds[maxfds-1]);
18325c51f124SMoriah Waterland }
18335c51f124SMoriah Waterland
18345c51f124SMoriah Waterland /* return results of pkginstall in zone execution */
18355c51f124SMoriah Waterland
18365c51f124SMoriah Waterland return (n);
18375c51f124SMoriah Waterland }
18385c51f124SMoriah Waterland
18395c51f124SMoriah Waterland /*
18405c51f124SMoriah Waterland * Name: pkgInstall
18415c51f124SMoriah Waterland * Description: Invoke pkginstall in the current zone to perform an install
18425c51f124SMoriah Waterland * of a single package to the current zone or standalone system
18435c51f124SMoriah Waterland * Arguments: a_altRoot - pointer to string representing the alternative
18445c51f124SMoriah Waterland * root to use for the install
18455c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
18465c51f124SMoriah Waterland * device (input data stream) containing the package to
18475c51f124SMoriah Waterland * be installed.
18485c51f124SMoriah Waterland * a_pkgDir - pointer to string representing the path to the
18495c51f124SMoriah Waterland * directory containing the package
18505c51f124SMoriah Waterland * a_altBinDir - pointer to string representing location of the
18515c51f124SMoriah Waterland * pkginstall executable to run. If not NULL, then pass
18525c51f124SMoriah Waterland * the path specified to the -b option to pkginstall.
18535c51f124SMoriah Waterland * Returns: int (see ckreturn() function for details)
18545c51f124SMoriah Waterland * 0 - success
18555c51f124SMoriah Waterland * 1 - package operation failed (fatal error)
18565c51f124SMoriah Waterland * 2 - non-fatal error (warning)
18575c51f124SMoriah Waterland * 3 - user selected quit (operation interrupted)
18585c51f124SMoriah Waterland * 4 - admin settings prevented operation
18595c51f124SMoriah Waterland * 5 - interaction required and -n (non-interactive) specified
18605c51f124SMoriah Waterland * "10" will be added to indicate "immediate reboot required"
18615c51f124SMoriah Waterland * "20" will be added to indicate "reboot after install required"
18625c51f124SMoriah Waterland * NOTE: Both a_idsName and a_pkgDir are used to determine where the
18635c51f124SMoriah Waterland * package to be installed is located. If a_idsName is != NULL
18645c51f124SMoriah Waterland * then it must be the path to a device containing a package
18655c51f124SMoriah Waterland * stream that contains the package to be installed. If a_idsName
18665c51f124SMoriah Waterland * is == NULL then a_pkgDir must contain a full path to a directory
18675c51f124SMoriah Waterland * that contains the package to be installed.
18685c51f124SMoriah Waterland */
18695c51f124SMoriah Waterland
18705c51f124SMoriah Waterland static int
pkgInstall(char * a_altRoot,char * a_idsName,char * a_pkgDir,char * a_altBinDir)18716e1ae2a3SGary Pennington pkgInstall(char *a_altRoot, char *a_idsName, char *a_pkgDir, char *a_altBinDir)
18725c51f124SMoriah Waterland {
18735c51f124SMoriah Waterland char *arg[MAXARGS];
18745c51f124SMoriah Waterland char *p;
18755c51f124SMoriah Waterland char path[PATH_MAX];
18765c51f124SMoriah Waterland char buffer[256];
18775c51f124SMoriah Waterland int n, nargs;
18785c51f124SMoriah Waterland
18795c51f124SMoriah Waterland /* entry debugging info */
18805c51f124SMoriah Waterland
18815c51f124SMoriah Waterland echoDebug(DBG_PKGINSTALL_ENTRY);
18825c51f124SMoriah Waterland echoDebug(DBG_PKGINSTALL_ARGS, PSTR(pkginst), PSTR(pkgdev.dirname),
18832e10def1SPeter Tribble PSTR(pkgdev.mount), PSTR(pkgdev.bdevice), PSTR(a_altRoot),
18842e10def1SPeter Tribble PSTR(a_idsName), PSTR(a_pkgDir));
18855c51f124SMoriah Waterland
18865c51f124SMoriah Waterland /* generate full path to 'pkginstall' to run in zone */
18875c51f124SMoriah Waterland
18885c51f124SMoriah Waterland (void) snprintf(path, sizeof (path), "%s/pkginstall",
18892e10def1SPeter Tribble a_altBinDir == (char *)NULL ? PKGBIN : a_altBinDir);
18905c51f124SMoriah Waterland /*
18915c51f124SMoriah Waterland * generate argument list for call to pkginstall
18925c51f124SMoriah Waterland */
18935c51f124SMoriah Waterland
18945c51f124SMoriah Waterland /* start at argument 0 */
18955c51f124SMoriah Waterland
18965c51f124SMoriah Waterland nargs = 0;
18975c51f124SMoriah Waterland
18985c51f124SMoriah Waterland /* first argument is path to executable */
18995c51f124SMoriah Waterland
19005c51f124SMoriah Waterland arg[nargs++] = path;
19015c51f124SMoriah Waterland
19025c51f124SMoriah Waterland /*
19035c51f124SMoriah Waterland * second argument is always: pass -O debug to pkginstall: debug mode
19045c51f124SMoriah Waterland */
19055c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
19065c51f124SMoriah Waterland arg[nargs++] = "-O";
19075c51f124SMoriah Waterland arg[nargs++] = "debug";
19085c51f124SMoriah Waterland }
19095c51f124SMoriah Waterland
191062224350SCasper H.S. Dik arg[nargs++] = "-O";
191162224350SCasper H.S. Dik arg[nargs++] = pkgmodeargument(pkgservergetmode());
191262224350SCasper H.S. Dik
19135c51f124SMoriah Waterland /*
19145c51f124SMoriah Waterland * pkgadd -G: pass -G to pkginstall if:
19155c51f124SMoriah Waterland * - the -G option is specified on the pkgadd command line
19165c51f124SMoriah Waterland * - this package is marked 'this zone only':
19175c51f124SMoriah Waterland * -- package has SUNW_PKG_THISZONE=true, or
19185c51f124SMoriah Waterland * -- package has a request script
19195c51f124SMoriah Waterland * Setting -G for pkginstall causes pkginstall to install the package
19205c51f124SMoriah Waterland * in the target zone. If running in the global zone, will install the
19215c51f124SMoriah Waterland * package and mark the package as installed "in the global zone only".
19225c51f124SMoriah Waterland * If running in a non-global zone, will just install the package.
19235c51f124SMoriah Waterland */
19245c51f124SMoriah Waterland
19255c51f124SMoriah Waterland if (globalZoneOnly == B_TRUE) {
19265c51f124SMoriah Waterland arg[nargs++] = "-G";
19275c51f124SMoriah Waterland } else if (pkgPackageIsThisZone(pkginst) == B_TRUE) {
19285c51f124SMoriah Waterland arg[nargs++] = "-G";
19295c51f124SMoriah Waterland }
19305c51f124SMoriah Waterland
19315c51f124SMoriah Waterland /* pkgadd -b dir: pass -b to pkginstall */
19325c51f124SMoriah Waterland
19335c51f124SMoriah Waterland if (a_altBinDir != (char *)NULL) {
19345c51f124SMoriah Waterland arg[nargs++] = "-b";
19355c51f124SMoriah Waterland arg[nargs++] = a_altBinDir;
19365c51f124SMoriah Waterland }
19375c51f124SMoriah Waterland
19385c51f124SMoriah Waterland /* pkgadd -B blocksize: pass -B to pkginstall */
19395c51f124SMoriah Waterland
19405c51f124SMoriah Waterland if (rw_block_size != NULL) {
19415c51f124SMoriah Waterland arg[nargs++] = "-B";
19425c51f124SMoriah Waterland arg[nargs++] = rw_block_size;
19435c51f124SMoriah Waterland }
19445c51f124SMoriah Waterland
19455c51f124SMoriah Waterland /* pkgadd -C: pass -C to pkginstall: disable checksum */
19465c51f124SMoriah Waterland
19475c51f124SMoriah Waterland if (disableChecksum) {
19485c51f124SMoriah Waterland arg[nargs++] = "-C";
19495c51f124SMoriah Waterland }
19505c51f124SMoriah Waterland
19515c51f124SMoriah Waterland /* pkgadd -A: pass -A to pkginstall: disable attribute checking */
19525c51f124SMoriah Waterland
19535c51f124SMoriah Waterland if (disableAttributes) {
19545c51f124SMoriah Waterland arg[nargs++] = "-A";
19555c51f124SMoriah Waterland }
19565c51f124SMoriah Waterland
19575c51f124SMoriah Waterland /*
19585c51f124SMoriah Waterland * NONABI_SCRIPTS defined: pass -o to pkginstall; refers to a
19595c51f124SMoriah Waterland * pkg requiring operator interaction during a procedure script
19605c51f124SMoriah Waterland * (common before on1093)
19615c51f124SMoriah Waterland */
19625c51f124SMoriah Waterland
19635c51f124SMoriah Waterland if (old_pkg) {
19645c51f124SMoriah Waterland arg[nargs++] = "-o";
19655c51f124SMoriah Waterland }
19665c51f124SMoriah Waterland
19675c51f124SMoriah Waterland /*
19685c51f124SMoriah Waterland * PKG_NONABI_SYMLINKS defined: pass -y to pkginstall; process
19695c51f124SMoriah Waterland * symlinks consistent with old behavior
19705c51f124SMoriah Waterland */
19715c51f124SMoriah Waterland
19725c51f124SMoriah Waterland if (old_symlinks) {
19735c51f124SMoriah Waterland arg[nargs++] = "-y";
19745c51f124SMoriah Waterland }
19755c51f124SMoriah Waterland
19765c51f124SMoriah Waterland /*
19775c51f124SMoriah Waterland * PKG_ABI_NAMELENGTH defined: pass -e to pkginstall; causes
19785c51f124SMoriah Waterland * package name length to be restricted
19795c51f124SMoriah Waterland */
19805c51f124SMoriah Waterland
19815c51f124SMoriah Waterland if (ABI_namelength) {
19825c51f124SMoriah Waterland arg[nargs++] = "-e";
19835c51f124SMoriah Waterland }
19845c51f124SMoriah Waterland
19855c51f124SMoriah Waterland /* pkgadd -S: pass -S to pkginstall: suppress copyright notices */
19865c51f124SMoriah Waterland
19875c51f124SMoriah Waterland if (suppressCopyright) {
19885c51f124SMoriah Waterland arg[nargs++] = "-S";
19895c51f124SMoriah Waterland }
19905c51f124SMoriah Waterland
19915c51f124SMoriah Waterland /* pkgadd -I: pass -I to pkginstall: initial install being performed */
19925c51f124SMoriah Waterland
19935c51f124SMoriah Waterland if (init_install) {
19945c51f124SMoriah Waterland arg[nargs++] = "-I";
19955c51f124SMoriah Waterland }
19965c51f124SMoriah Waterland
19975c51f124SMoriah Waterland /* pkgadd -M: pass -M to pkginstall: dont mount client file systems */
19985c51f124SMoriah Waterland
19995c51f124SMoriah Waterland if (no_map_client) {
20005c51f124SMoriah Waterland arg[nargs++] = "-M";
20015c51f124SMoriah Waterland }
20025c51f124SMoriah Waterland
20035c51f124SMoriah Waterland /* pkgadd -v: pass -v to pkginstall: trace scripts */
20045c51f124SMoriah Waterland
20055c51f124SMoriah Waterland if (pkgverbose) {
20065c51f124SMoriah Waterland arg[nargs++] = "-v";
20075c51f124SMoriah Waterland }
20085c51f124SMoriah Waterland
20095c51f124SMoriah Waterland /* pkgadd -z: pass -z to pkginstall: fresh install from pkg save area */
20105c51f124SMoriah Waterland
20115c51f124SMoriah Waterland if (saveSpoolInstall) {
20125c51f124SMoriah Waterland arg[nargs++] = "-z";
20135c51f124SMoriah Waterland }
20145c51f124SMoriah Waterland
20155c51f124SMoriah Waterland /*
20165c51f124SMoriah Waterland * if running in a non-global zone and the 'hollow' attribute is
20175c51f124SMoriah Waterland * passed in, then pass -h to pkginstall so that it knows how to
20185c51f124SMoriah Waterland * handle hollow packages for this local zone.
20195c51f124SMoriah Waterland */
20205c51f124SMoriah Waterland
20215c51f124SMoriah Waterland if (!z_running_in_global_zone() && is_depend_pkginfo_DB()) {
20225c51f124SMoriah Waterland arg[nargs++] = "-h";
20235c51f124SMoriah Waterland }
20245c51f124SMoriah Waterland
20255c51f124SMoriah Waterland /* pkgadd -t: pass -t to pkginstall: disable save spool area creation */
20265c51f124SMoriah Waterland
20275c51f124SMoriah Waterland if (disableSaveSpool) {
20285c51f124SMoriah Waterland arg[nargs++] = "-t";
20295c51f124SMoriah Waterland }
20305c51f124SMoriah Waterland
20315c51f124SMoriah Waterland /* if running pkgask, pass -i to pkginstall: running pkgask */
20325c51f124SMoriah Waterland
20335c51f124SMoriah Waterland if (askflag) {
20345c51f124SMoriah Waterland arg[nargs++] = "-i";
20355c51f124SMoriah Waterland }
20365c51f124SMoriah Waterland
20375c51f124SMoriah Waterland /* pkgadd -n (not pkgask): pass -n to pkginstall: noninteractive mode */
20385c51f124SMoriah Waterland
20395c51f124SMoriah Waterland if (nointeract && !askflag) {
20405c51f124SMoriah Waterland arg[nargs++] = "-n";
20415c51f124SMoriah Waterland }
20425c51f124SMoriah Waterland
20435c51f124SMoriah Waterland /* pkgadd -a admin: pass -a admin to pkginstall: admin file */
20445c51f124SMoriah Waterland
20455c51f124SMoriah Waterland if (admnfile) {
20465c51f124SMoriah Waterland arg[nargs++] = "-a";
20475c51f124SMoriah Waterland arg[nargs++] = admnfile;
20485c51f124SMoriah Waterland }
20495c51f124SMoriah Waterland
20505c51f124SMoriah Waterland /* pkgadd -D dryrun: pass -D dryrun to pkginstall: dryrun mode/file */
20515c51f124SMoriah Waterland
20525c51f124SMoriah Waterland if (pkgdrtarg) {
20535c51f124SMoriah Waterland arg[nargs++] = "-D";
20545c51f124SMoriah Waterland arg[nargs++] = pkgdrtarg;
20555c51f124SMoriah Waterland }
20565c51f124SMoriah Waterland
20575c51f124SMoriah Waterland /* pkgadd -c cont: pass -c cont to pkginstall: continuation file */
20585c51f124SMoriah Waterland
20595c51f124SMoriah Waterland if (pkgcontsrc) {
20605c51f124SMoriah Waterland arg[nargs++] = "-c";
20615c51f124SMoriah Waterland arg[nargs++] = pkgcontsrc;
20625c51f124SMoriah Waterland }
20635c51f124SMoriah Waterland
20645c51f124SMoriah Waterland /* pkgadd -V vfstab: pass -V vfstab to pkginstall: alternate vfstab */
20655c51f124SMoriah Waterland
20665c51f124SMoriah Waterland if (vfstab_file) {
20675c51f124SMoriah Waterland arg[nargs++] = "-V";
20685c51f124SMoriah Waterland arg[nargs++] = vfstab_file;
20695c51f124SMoriah Waterland }
20705c51f124SMoriah Waterland
20715c51f124SMoriah Waterland /* pkgadd -r resp: pass -r resp to pkginstall: response file */
20725c51f124SMoriah Waterland
20735c51f124SMoriah Waterland if (respfile) {
20745c51f124SMoriah Waterland arg[nargs++] = "-r";
20755c51f124SMoriah Waterland arg[nargs++] = respfile;
20765c51f124SMoriah Waterland }
20775c51f124SMoriah Waterland
20785c51f124SMoriah Waterland /* pkgadd -R root: pass -R root to pkginstall: alternative root */
20795c51f124SMoriah Waterland
20805c51f124SMoriah Waterland if (a_altRoot && *a_altRoot) {
20815c51f124SMoriah Waterland arg[nargs++] = "-R";
20825c51f124SMoriah Waterland arg[nargs++] = a_altRoot;
20835c51f124SMoriah Waterland }
20845c51f124SMoriah Waterland
20855c51f124SMoriah Waterland /*
20865c51f124SMoriah Waterland * If input data stream is available,
20875c51f124SMoriah Waterland * - add: -d ids_name -p number_of_parts
20885c51f124SMoriah Waterland * else,
20895c51f124SMoriah Waterland * - add: -d device -m mount [-f type]
20905c51f124SMoriah Waterland */
20915c51f124SMoriah Waterland
20925c51f124SMoriah Waterland if (a_idsName != NULL) {
20935c51f124SMoriah Waterland arg[nargs++] = "-d";
20945c51f124SMoriah Waterland arg[nargs++] = a_idsName;
20955c51f124SMoriah Waterland arg[nargs++] = "-p";
20965c51f124SMoriah Waterland ds_close(1);
20974656d474SGarrett D'Amore ds_putinfo(buffer, sizeof (buffer));
20985c51f124SMoriah Waterland arg[nargs++] = buffer;
20995c51f124SMoriah Waterland } else if (pkgdev.mount != NULL) {
21005c51f124SMoriah Waterland arg[nargs++] = "-d";
21015c51f124SMoriah Waterland arg[nargs++] = pkgdev.bdevice;
21025c51f124SMoriah Waterland arg[nargs++] = "-m";
21035c51f124SMoriah Waterland arg[nargs++] = pkgdev.mount;
21045c51f124SMoriah Waterland if (pkgdev.fstyp != NULL) {
21055c51f124SMoriah Waterland arg[nargs++] = "-f";
21065c51f124SMoriah Waterland arg[nargs++] = pkgdev.fstyp;
21075c51f124SMoriah Waterland }
21085c51f124SMoriah Waterland }
21095c51f124SMoriah Waterland
21105c51f124SMoriah Waterland /*
21115c51f124SMoriah Waterland * add parent zone info/type
21125c51f124SMoriah Waterland */
21135c51f124SMoriah Waterland
21145c51f124SMoriah Waterland p = z_get_zonename();
21155c51f124SMoriah Waterland if ((p != NULL) && (*p != '\0')) {
21165c51f124SMoriah Waterland char zn[MAXPATHLEN];
21175c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
21182e10def1SPeter Tribble "parent-zone-name=%s", p);
21195c51f124SMoriah Waterland arg[nargs++] = "-O";
21205c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
21215c51f124SMoriah Waterland }
21225c51f124SMoriah Waterland
21235c51f124SMoriah Waterland /* current zone type */
21245c51f124SMoriah Waterland
21255c51f124SMoriah Waterland arg[nargs++] = "-O";
21265c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
21275c51f124SMoriah Waterland char zn[MAXPATHLEN];
21285c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
21292e10def1SPeter Tribble "parent-zone-type=%s",
21302e10def1SPeter Tribble TAG_VALUE_GLOBAL_ZONE);
21315c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
21325c51f124SMoriah Waterland } else {
21335c51f124SMoriah Waterland char zn[MAXPATHLEN];
21345c51f124SMoriah Waterland (void) snprintf(zn, sizeof (zn),
21352e10def1SPeter Tribble "parent-zone-type=%s",
21362e10def1SPeter Tribble TAG_VALUE_NONGLOBAL_ZONE);
21375c51f124SMoriah Waterland arg[nargs++] = strdup(zn);
21385c51f124SMoriah Waterland }
21395c51f124SMoriah Waterland
21405c51f124SMoriah Waterland /* pass -N to pkginstall: program name to report */
21415c51f124SMoriah Waterland
21425c51f124SMoriah Waterland arg[nargs++] = "-N";
21435c51f124SMoriah Waterland arg[nargs++] = get_prog_name();
21445c51f124SMoriah Waterland
21455c51f124SMoriah Waterland /* add package directory name */
21465c51f124SMoriah Waterland
21475c51f124SMoriah Waterland arg[nargs++] = a_pkgDir;
21485c51f124SMoriah Waterland
21495c51f124SMoriah Waterland /* add package instance name */
21505c51f124SMoriah Waterland
21515c51f124SMoriah Waterland arg[nargs++] = pkginst;
21525c51f124SMoriah Waterland
21535c51f124SMoriah Waterland /* terminate the argument list */
21545c51f124SMoriah Waterland
21555c51f124SMoriah Waterland arg[nargs++] = NULL;
21565c51f124SMoriah Waterland
21575c51f124SMoriah Waterland /*
21585c51f124SMoriah Waterland * run the appropriate pkginstall command in the specified zone
21595c51f124SMoriah Waterland */
21605c51f124SMoriah Waterland
21615c51f124SMoriah Waterland if (debugFlag == B_TRUE) {
21625c51f124SMoriah Waterland echoDebug(DBG_ZONE_EXEC_ENTER, "global", arg[0]);
21635c51f124SMoriah Waterland for (n = 0; arg[n]; n++) {
21645c51f124SMoriah Waterland echoDebug(DBG_ARG, n, arg[n]);
21655c51f124SMoriah Waterland }
21665c51f124SMoriah Waterland }
21675c51f124SMoriah Waterland
21685c51f124SMoriah Waterland /* execute pkginstall command */
21695c51f124SMoriah Waterland
21705c51f124SMoriah Waterland n = pkgexecv(NULL, NULL, NULL, NULL, arg);
21715c51f124SMoriah Waterland
21725c51f124SMoriah Waterland /* return results of pkginstall execution */
21735c51f124SMoriah Waterland
21745c51f124SMoriah Waterland return (n);
21755c51f124SMoriah Waterland }
21765c51f124SMoriah Waterland
21775c51f124SMoriah Waterland /*
21785c51f124SMoriah Waterland * function to clear out any exisiting error return conditions that may have
21795c51f124SMoriah Waterland * been set by previous calls to ckreturn()
21805c51f124SMoriah Waterland */
21815c51f124SMoriah Waterland static void
resetreturn()21825c51f124SMoriah Waterland resetreturn()
21835c51f124SMoriah Waterland {
21845c51f124SMoriah Waterland admnflag = 0; /* != 0 if any pkg op admin setting failure (4) */
21855c51f124SMoriah Waterland doreboot = 0; /* != 0 if reboot required after installation (>= 10) */
21865c51f124SMoriah Waterland failflag = 0; /* != 0 if fatal error has occurred (1) */
21875c51f124SMoriah Waterland intrflag = 0; /* != 0 if user selected quit (3) */
21885c51f124SMoriah Waterland ireboot = 0; /* != 0 if immediate reboot required (>= 20) */
21895c51f124SMoriah Waterland nullflag = 0; /* != 0 if admin interaction required (5) */
21905c51f124SMoriah Waterland warnflag = 0; /* != 0 if non-fatal error has occurred (2) */
21915c51f124SMoriah Waterland interrupted = 0; /* last pkg op was quit (1,2,3,4,5) */
21925c51f124SMoriah Waterland needconsult = 0; /* essential ask admin now (1,2,3,5) */
21935c51f124SMoriah Waterland }
21945c51f124SMoriah Waterland
21955c51f124SMoriah Waterland /*
21965c51f124SMoriah Waterland * function which checks the indicated return value
21975c51f124SMoriah Waterland * and indicates disposition of installation
21985c51f124SMoriah Waterland */
21995c51f124SMoriah Waterland static void
ckreturn(int retcode)22005c51f124SMoriah Waterland ckreturn(int retcode)
22015c51f124SMoriah Waterland {
22025c51f124SMoriah Waterland /*
22035c51f124SMoriah Waterland * entry debugging info
22045c51f124SMoriah Waterland */
22055c51f124SMoriah Waterland
22065c51f124SMoriah Waterland echoDebug(DBG_PKGADD_CKRETURN, retcode, PSTR(pkginst));
22075c51f124SMoriah Waterland
22085c51f124SMoriah Waterland /* reset needconsult so it only reflects this call to ckreturn */
22095c51f124SMoriah Waterland needconsult = 0;
22105c51f124SMoriah Waterland
22115c51f124SMoriah Waterland switch (retcode) {
22122e10def1SPeter Tribble case 0: /* successful */
22132e10def1SPeter Tribble case 10:
22142e10def1SPeter Tribble case 20:
22155c51f124SMoriah Waterland break; /* empty case */
22165c51f124SMoriah Waterland
22172e10def1SPeter Tribble case 1: /* package operation failed (fatal error) */
22182e10def1SPeter Tribble case 11:
22192e10def1SPeter Tribble case 21:
22205c51f124SMoriah Waterland failflag++;
22215c51f124SMoriah Waterland interrupted++;
22225c51f124SMoriah Waterland needconsult++;
22235c51f124SMoriah Waterland break;
22245c51f124SMoriah Waterland
22252e10def1SPeter Tribble case 2: /* non-fatal error (warning) */
22262e10def1SPeter Tribble case 12:
22272e10def1SPeter Tribble case 22:
22285c51f124SMoriah Waterland warnflag++;
22295c51f124SMoriah Waterland interrupted++;
22305c51f124SMoriah Waterland needconsult++;
22315c51f124SMoriah Waterland break;
22325c51f124SMoriah Waterland
22332e10def1SPeter Tribble case 3: /* user selected quit; operation interrupted */
22342e10def1SPeter Tribble case 13:
22352e10def1SPeter Tribble case 23:
22365c51f124SMoriah Waterland intrflag++;
22375c51f124SMoriah Waterland interrupted++;
22385c51f124SMoriah Waterland needconsult++;
22395c51f124SMoriah Waterland break;
22405c51f124SMoriah Waterland
22412e10def1SPeter Tribble case 4: /* admin settings prevented operation */
22422e10def1SPeter Tribble case 14:
22432e10def1SPeter Tribble case 24:
22445c51f124SMoriah Waterland admnflag++;
22455c51f124SMoriah Waterland interrupted++;
22465c51f124SMoriah Waterland break;
22475c51f124SMoriah Waterland
22482e10def1SPeter Tribble case 5: /* administration: interaction req (no -n) */
22492e10def1SPeter Tribble case 15:
22502e10def1SPeter Tribble case 25:
22515c51f124SMoriah Waterland nullflag++;
22525c51f124SMoriah Waterland interrupted++;
22535c51f124SMoriah Waterland needconsult++;
22545c51f124SMoriah Waterland break;
22555c51f124SMoriah Waterland
22562e10def1SPeter Tribble default:
22575c51f124SMoriah Waterland failflag++;
22585c51f124SMoriah Waterland interrupted++;
22595c51f124SMoriah Waterland needconsult++;
22605c51f124SMoriah Waterland return;
22615c51f124SMoriah Waterland }
22625c51f124SMoriah Waterland
22635c51f124SMoriah Waterland if (retcode >= 20) {
22645c51f124SMoriah Waterland ireboot++;
22655c51f124SMoriah Waterland } else if (retcode >= 10) {
22665c51f124SMoriah Waterland doreboot++;
22675c51f124SMoriah Waterland }
22685c51f124SMoriah Waterland }
22695c51f124SMoriah Waterland
22705c51f124SMoriah Waterland static void
usage(void)22715c51f124SMoriah Waterland usage(void)
22725c51f124SMoriah Waterland {
22735c51f124SMoriah Waterland char *prog = get_prog_name();
22745c51f124SMoriah Waterland
22755c51f124SMoriah Waterland if (askflag) {
22765c51f124SMoriah Waterland (void) fprintf(stderr, ERR_USAGE_PKGASK, prog);
22775c51f124SMoriah Waterland } else if (z_running_in_global_zone() == B_FALSE) {
22785c51f124SMoriah Waterland (void) fprintf(stderr, ERR_USAGE_PKGADD_NONGLOBALZONE,
22792e10def1SPeter Tribble prog, prog);
22805c51f124SMoriah Waterland } else {
22815c51f124SMoriah Waterland (void) fprintf(stderr, ERR_USAGE_PKGADD_GLOBALZONE,
22822e10def1SPeter Tribble prog, prog);
22835c51f124SMoriah Waterland }
22845c51f124SMoriah Waterland }
22855c51f124SMoriah Waterland
22865c51f124SMoriah Waterland /*
22875c51f124SMoriah Waterland * Name: check_applicability
22885c51f124SMoriah Waterland * Description: determine if a package is installable in this zone; that is,
22895c51f124SMoriah Waterland * does the scope of install conflict with existing installation
22905c51f124SMoriah Waterland * or can the package be installed
22915c51f124SMoriah Waterland * Arguments: a_packageDir - [RO, *RO] - (char *)
22925c51f124SMoriah Waterland * Pointer to string representing the directory where the
22935c51f124SMoriah Waterland * package is located
22945c51f124SMoriah Waterland * a_pkgInst - [RO, *RO] - (char *)
22955c51f124SMoriah Waterland * Pointer to string representing the name of the package
22965c51f124SMoriah Waterland * to check
22975c51f124SMoriah Waterland * a_rootPath - [RO, *RO] - (char *)
22985c51f124SMoriah Waterland * Pointer to string representing path to the root of the
22995c51f124SMoriah Waterland * file system where the package is to be installed - this
23005c51f124SMoriah Waterland * is usually the same as the "-R" argument to pkgadd
23015c51f124SMoriah Waterland * a_flags - [RO, *RO] - (CAF_T)
23025c51f124SMoriah Waterland * Flags set by the caller to indicate the conditions
23035c51f124SMoriah Waterland * under which the package is to be installed:
23045c51f124SMoriah Waterland * CAF_IN_GLOBAL_ZONE - in global zone
23055c51f124SMoriah Waterland * CAF_SCOPE_GLOBAL - -G specified
23065c51f124SMoriah Waterland * Returns: boolean_t
23075c51f124SMoriah Waterland * B_TRUE - the package can be installed
23085c51f124SMoriah Waterland * B_FALSE - the package can not be installed
23095c51f124SMoriah Waterland */
23105c51f124SMoriah Waterland
23115c51f124SMoriah Waterland static boolean_t
check_applicability(char * a_packageDir,char * a_pkgInst,char * a_rootPath,CAF_T a_flags)23125c51f124SMoriah Waterland check_applicability(char *a_packageDir, char *a_pkgInst, char *a_rootPath,
23132e10def1SPeter Tribble CAF_T a_flags)
23145c51f124SMoriah Waterland {
23155c51f124SMoriah Waterland FILE *pkginfoFP;
23165c51f124SMoriah Waterland FILE *pkgmapFP;
23175c51f124SMoriah Waterland boolean_t all_zones; /* pkg is "all zones" only */
23185c51f124SMoriah Waterland boolean_t in_gz_only; /* pkg installed in global zone only */
23195c51f124SMoriah Waterland boolean_t is_hollow; /* pkg is "hollow" */
23205c51f124SMoriah Waterland boolean_t pkg_installed; /* pkg is installed */
23215c51f124SMoriah Waterland boolean_t this_zone; /* pkg is "this zone" only */
23225c51f124SMoriah Waterland boolean_t reqfile_found = B_FALSE;
23235c51f124SMoriah Waterland char instPkg[PKGSIZ+1]; /* installed pkg instance nam */
23245c51f124SMoriah Waterland char instPkgPath[PATH_MAX]; /* installed pkg toplevel dir */
23255c51f124SMoriah Waterland char pkginfoPath[PATH_MAX]; /* pkg 2 install pkginfo file */
23265c51f124SMoriah Waterland char pkgmapPath[PATH_MAX]; /* pkg 2 install pkgmap file */
23275c51f124SMoriah Waterland char pkgpath[PATH_MAX]; /* pkg 2 install toplevel dir */
23285c51f124SMoriah Waterland int len;
23295c51f124SMoriah Waterland char line[LINE_MAX];
23305c51f124SMoriah Waterland
23315c51f124SMoriah Waterland /* entry assertions */
23325c51f124SMoriah Waterland
23335c51f124SMoriah Waterland assert(a_packageDir != (char *)NULL);
23345c51f124SMoriah Waterland assert(*a_packageDir != '\0');
23355c51f124SMoriah Waterland assert(a_pkgInst != (char *)NULL);
23365c51f124SMoriah Waterland assert(*a_pkgInst != '\0');
23375c51f124SMoriah Waterland
23385c51f124SMoriah Waterland /* normalize root path */
23395c51f124SMoriah Waterland
23405c51f124SMoriah Waterland if (a_rootPath == (char *)NULL) {
23415c51f124SMoriah Waterland a_rootPath = "";
23425c51f124SMoriah Waterland }
23435c51f124SMoriah Waterland
23445c51f124SMoriah Waterland /* entry debugging info */
23455c51f124SMoriah Waterland
23465c51f124SMoriah Waterland echoDebug(DBG_CHECKAPP_ENTRY);
23475c51f124SMoriah Waterland echoDebug(DBG_CHECKAPP_ARGS, a_pkgInst, a_packageDir, a_rootPath);
23485c51f124SMoriah Waterland
23495c51f124SMoriah Waterland /*
23505c51f124SMoriah Waterland * calculate paths to various objects
23515c51f124SMoriah Waterland */
23525c51f124SMoriah Waterland
23535c51f124SMoriah Waterland /* path to package to be installed top level (main) directory */
23545c51f124SMoriah Waterland
23555c51f124SMoriah Waterland len = snprintf(pkgpath, sizeof (pkgpath), "%s/%s", a_packageDir,
23562e10def1SPeter Tribble a_pkgInst);
23575c51f124SMoriah Waterland if (len > sizeof (pkgpath)) {
23585c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, a_packageDir, a_pkgInst);
23595c51f124SMoriah Waterland return (B_FALSE);
23605c51f124SMoriah Waterland }
23615c51f124SMoriah Waterland
23625c51f124SMoriah Waterland /* error if package top level directory does not exist */
23635c51f124SMoriah Waterland
23645c51f124SMoriah Waterland if (isdir(pkgpath) != 0) {
23655c51f124SMoriah Waterland progerr(ERR_NO_PKGDIR, pkgpath, a_pkgInst, strerror(errno));
23665c51f124SMoriah Waterland return (B_FALSE);
23675c51f124SMoriah Waterland }
23685c51f124SMoriah Waterland
23695c51f124SMoriah Waterland /* path to pkginfo file within the package to be installed */
23705c51f124SMoriah Waterland
23715c51f124SMoriah Waterland len = snprintf(pkginfoPath, sizeof (pkginfoPath), "%s/pkginfo",
23722e10def1SPeter Tribble pkgpath);
23735c51f124SMoriah Waterland if (len > sizeof (pkginfoPath)) {
23745c51f124SMoriah Waterland progerr(ERR_CREATE_PATH_2, pkgpath, "pkginfo");
23755c51f124SMoriah Waterland return (B_FALSE);
23765c51f124SMoriah Waterland }
23775c51f124SMoriah Waterland
23785c51f124SMoriah Waterland /* path to highest instance of package currently installed */
23795c51f124SMoriah Waterland
23805c51f124SMoriah Waterland pkgLocateHighestInst(instPkgPath, sizeof (instPkgPath),
23812e10def1SPeter Tribble instPkg, sizeof (instPkg), a_rootPath, a_pkgInst);
23825c51f124SMoriah Waterland
23835c51f124SMoriah Waterland /*
23845c51f124SMoriah Waterland * gather information from this package's pkginfo file
23855c51f124SMoriah Waterland */
23865c51f124SMoriah Waterland
23875c51f124SMoriah Waterland pkginfoFP = fopen(pkginfoPath, "r");
23885c51f124SMoriah Waterland
23895c51f124SMoriah Waterland if (pkginfoFP == (FILE *)NULL) {
23905c51f124SMoriah Waterland progerr(ERR_NO_PKG_INFOFILE, a_pkgInst, pkginfoPath,
23912e10def1SPeter Tribble strerror(errno));
23925c51f124SMoriah Waterland return (B_FALSE);
23935c51f124SMoriah Waterland }
23945c51f124SMoriah Waterland
23955c51f124SMoriah Waterland /* determine "HOLLOW" setting for this package */
23965c51f124SMoriah Waterland
23975c51f124SMoriah Waterland is_hollow = pkginfoParamTruth(pkginfoFP, PKG_HOLLOW_VARIABLE,
23982e10def1SPeter Tribble "true", B_FALSE);
23995c51f124SMoriah Waterland
24005c51f124SMoriah Waterland /* determine "ALLZONES" setting for this package */
24015c51f124SMoriah Waterland
24025c51f124SMoriah Waterland all_zones = pkginfoParamTruth(pkginfoFP, PKG_ALLZONES_VARIABLE,
24032e10def1SPeter Tribble "true", B_FALSE);
24045c51f124SMoriah Waterland
24055c51f124SMoriah Waterland /* determine "THISZONE" setting for this package */
24065c51f124SMoriah Waterland
24075c51f124SMoriah Waterland this_zone = pkginfoParamTruth(pkginfoFP, PKG_THISZONE_VARIABLE,
24082e10def1SPeter Tribble "true", B_FALSE);
24095c51f124SMoriah Waterland
24105c51f124SMoriah Waterland /* close pkginfo file */
24115c51f124SMoriah Waterland
24125c51f124SMoriah Waterland (void) fclose(pkginfoFP);
24135c51f124SMoriah Waterland
24145c51f124SMoriah Waterland /*
24155c51f124SMoriah Waterland * If request file is not found, it may be in the datastream which
24165c51f124SMoriah Waterland * is not yet unpacked. Check in the pkgmap file.
24175c51f124SMoriah Waterland */
24185c51f124SMoriah Waterland if (isfile(pkgpath, REQUEST_FILE) != 0) {
24195c51f124SMoriah Waterland
24205c51f124SMoriah Waterland /* path to pkgmap file within the package to be installed */
24215c51f124SMoriah Waterland (void) snprintf(pkgmapPath, sizeof (pkgmapPath), "%s/pkgmap",
24225c51f124SMoriah Waterland pkgpath);
24235c51f124SMoriah Waterland
24245c51f124SMoriah Waterland pkgmapFP = fopen(pkgmapPath, "r");
24255c51f124SMoriah Waterland
24265c51f124SMoriah Waterland if (pkgmapFP == NULL) {
24275c51f124SMoriah Waterland progerr(ERR_NO_PKG_MAPFILE, a_pkgInst,
24285c51f124SMoriah Waterland pkgmapPath, strerror(errno));
24295c51f124SMoriah Waterland return (B_FALSE);
24305c51f124SMoriah Waterland }
24315c51f124SMoriah Waterland
24325c51f124SMoriah Waterland while (fgets(line, LINE_MAX, pkgmapFP) != NULL) {
24335c51f124SMoriah Waterland if (strstr(line, " i request") != NULL) {
24345c51f124SMoriah Waterland reqfile_found = B_TRUE;
24355c51f124SMoriah Waterland break;
24365c51f124SMoriah Waterland }
24375c51f124SMoriah Waterland }
24385c51f124SMoriah Waterland (void) fclose(pkgmapFP);
24395c51f124SMoriah Waterland } else {
24405c51f124SMoriah Waterland reqfile_found = B_TRUE;
24415c51f124SMoriah Waterland }
24425c51f124SMoriah Waterland
24435c51f124SMoriah Waterland /*
24445c51f124SMoriah Waterland * If this package is not marked for installation in this zone only,
24455c51f124SMoriah Waterland * check to see if this package has a request script. If this package
24465c51f124SMoriah Waterland * does have a request script, then mark the package for installation
24475c51f124SMoriah Waterland * in this zone only. Any package with a request script cannot be
24485c51f124SMoriah Waterland * installed outside of the zone the pkgadd command is being run in,
24495c51f124SMoriah Waterland * nor can such a package be installed as part of a new zone install.
24505c51f124SMoriah Waterland * A new zone install must be non-interactive, which is required
24515c51f124SMoriah Waterland * by all packages integrated into the Solaris WOS.
24525c51f124SMoriah Waterland */
24535c51f124SMoriah Waterland
24545c51f124SMoriah Waterland if ((!this_zone) && (reqfile_found)) {
24555c51f124SMoriah Waterland if (a_flags & CAF_IN_GLOBAL_ZONE) {
24565c51f124SMoriah Waterland echoDebug(DBG_CHECKAPP_THISZONE_REQUEST, a_pkgInst);
24575c51f124SMoriah Waterland }
24585c51f124SMoriah Waterland this_zone = B_TRUE;
24595c51f124SMoriah Waterland }
24605c51f124SMoriah Waterland
24615c51f124SMoriah Waterland /*
24625c51f124SMoriah Waterland * If this package is already installed, see if the current installation
24635c51f124SMoriah Waterland * of the package has a request file - if it does, then act as though
24645c51f124SMoriah Waterland * the current package to be added has a request file - install the
24655c51f124SMoriah Waterland * package in the current zone only.
24665c51f124SMoriah Waterland */
24675c51f124SMoriah Waterland
24685c51f124SMoriah Waterland if ((!this_zone) && (instPkgPath[0] != '\0') &&
24692e10def1SPeter Tribble (isfile(instPkgPath, REQUEST_FILE) == 0)) {
24705c51f124SMoriah Waterland if (a_flags & CAF_IN_GLOBAL_ZONE) {
24715c51f124SMoriah Waterland echoDebug(DBG_CHECKAPP_THISZONE_INSTREQ,
24722e10def1SPeter Tribble a_pkgInst, instPkg);
24735c51f124SMoriah Waterland }
24745c51f124SMoriah Waterland this_zone = B_TRUE;
24755c51f124SMoriah Waterland }
24765c51f124SMoriah Waterland
24775c51f124SMoriah Waterland /* gather information from the global zone only file */
24785c51f124SMoriah Waterland
24795c51f124SMoriah Waterland in_gz_only = B_FALSE;
24805c51f124SMoriah Waterland if (a_flags & CAF_IN_GLOBAL_ZONE) {
24815c51f124SMoriah Waterland in_gz_only = pkgIsPkgInGzOnly(a_rootPath, a_pkgInst);
24825c51f124SMoriah Waterland }
24835c51f124SMoriah Waterland
24845c51f124SMoriah Waterland /* determine if this package is currently installed */
24855c51f124SMoriah Waterland
24865c51f124SMoriah Waterland pkg_installed = pkginfoIsPkgInstalled((struct pkginfo **)NULL,
24872e10def1SPeter Tribble a_pkgInst);
24885c51f124SMoriah Waterland
24895c51f124SMoriah Waterland /*
24905c51f124SMoriah Waterland * verify package applicability based on information gathered,
24915c51f124SMoriah Waterland * and validate the three SUNW_PKG_ options:
24925c51f124SMoriah Waterland *
24935c51f124SMoriah Waterland * -----------|--------------|-------------|-------------|-----------
24945c51f124SMoriah Waterland * - - - - - -| GLOBAL ZONE -| GLOBAL ZONE | LOCAL ZONE | LOCAL ZONE
24955c51f124SMoriah Waterland * - - - - - -| - - pkgadd - | pkgadd -G | pkgadd | pkgadd -G
24965c51f124SMoriah Waterland * ----1------|--------------|-------------|-------------|------------
24975c51f124SMoriah Waterland * ALLZONES f | add to gz | add to gz | add to ls | add to ls
24985c51f124SMoriah Waterland * HOLLOW f | current lz | not to curr | only - - - -| only - - -
24995c51f124SMoriah Waterland * THISZONE f | futr lz - - -| or futr lz | - - - - - - | - - - - - -
25005c51f124SMoriah Waterland * ----2------|--------------|-------------|-------------|------------
25015c51f124SMoriah Waterland * ALLZONES T | add to gz | operation | operation | operation
25025c51f124SMoriah Waterland * HOLLOW f | current lz | not allowed | not allowed | not allowed
25035c51f124SMoriah Waterland * THISZONE f | future lz | - - - - - - | - - - - - - | - - - - - -
25045c51f124SMoriah Waterland * ----3------|--------------|-------------|-------------|------------
25055c51f124SMoriah Waterland * ALLZONES T | add to gz | operation | operation | operation
25065c51f124SMoriah Waterland * HOLLOW T | pkg db only | not allowed | not allowed | not allowed
25075c51f124SMoriah Waterland * THISZONE f | curr/futr lz | - - - - - - | - - - - - - | - - - - - -
25085c51f124SMoriah Waterland * ----4------|--------------|-------------|-------------|------------
25095c51f124SMoriah Waterland * ALLZONES T | bad option | bad option | bad option | bad option
25105c51f124SMoriah Waterland * HOLLOW * | combo - - - -| combo - - - | combo - - - | combo - -
25115c51f124SMoriah Waterland * THISZONE T | - - - - - - -|- - - - - - -|- - - - - - -|- - - - - -
25125c51f124SMoriah Waterland * ----5------|--------------|-------------|-------------|------------
25135c51f124SMoriah Waterland * ALLZONES f | bad option | bad option | bad option | bad option
25145c51f124SMoriah Waterland * HOLLOW T | combo - - - -| combo - - - | combo - - - | combo - - -
25155c51f124SMoriah Waterland * THISZONE * | - - - - - - -| - - - - - - | - - - - - - | - - - - - -
25165c51f124SMoriah Waterland * ----6------|--------------|-------------|-------------|------------
25175c51f124SMoriah Waterland * ALLZONES f | add to gz | add to gz | add to lz | add to lz
25185c51f124SMoriah Waterland * HOLLOW f | not current | not current | only - - - | only - - -
25195c51f124SMoriah Waterland * THISZONE T | or future lz | or futr lz | - - - - - - | - - - - - -
25205c51f124SMoriah Waterland * -----------|--------------|-------------|-------------|-----------
25215c51f124SMoriah Waterland */
25225c51f124SMoriah Waterland
25235c51f124SMoriah Waterland /* pkg "all zones" && "this zone" (#4) */
25245c51f124SMoriah Waterland
25255c51f124SMoriah Waterland if (all_zones && this_zone) {
25265c51f124SMoriah Waterland progerr(ERR_ALLZONES_AND_THISZONE, a_pkgInst,
25272e10def1SPeter Tribble PKG_ALLZONES_VARIABLE, PKG_THISZONE_VARIABLE);
25285c51f124SMoriah Waterland return (B_FALSE);
25295c51f124SMoriah Waterland }
25305c51f124SMoriah Waterland
25315c51f124SMoriah Waterland /* pkg "!all zones" && "hollow" (#5) */
25325c51f124SMoriah Waterland
25335c51f124SMoriah Waterland if ((!all_zones) && is_hollow) {
25345c51f124SMoriah Waterland progerr(ERR_NOW_ALLZONES_AND_HOLLOW, a_pkgInst,
25352e10def1SPeter Tribble PKG_ALLZONES_VARIABLE, PKG_HOLLOW_VARIABLE);
25365c51f124SMoriah Waterland return (B_FALSE);
25375c51f124SMoriah Waterland }
25385c51f124SMoriah Waterland
25395c51f124SMoriah Waterland /* pkg ALLZONES=true & not running in global zone (#2/#3) */
25405c51f124SMoriah Waterland
25415c51f124SMoriah Waterland if (all_zones && (!(a_flags & CAF_IN_GLOBAL_ZONE))) {
25425c51f124SMoriah Waterland progerr(ERR_ALLZONES_AND_IN_LZ, a_pkgInst);
25435c51f124SMoriah Waterland return (B_FALSE);
25445c51f124SMoriah Waterland }
25455c51f124SMoriah Waterland
25465c51f124SMoriah Waterland /* pkg "in gz only" & pkg "NOT installed" */
25475c51f124SMoriah Waterland
25485c51f124SMoriah Waterland if (in_gz_only && (!pkg_installed)) {
25495c51f124SMoriah Waterland /* MAKE A WARNING */
25505c51f124SMoriah Waterland echo(ERR_IN_GZ_AND_NOT_INSTALLED, a_pkgInst,
25512e10def1SPeter Tribble pkgGetGzOnlyPath());
25525c51f124SMoriah Waterland }
25535c51f124SMoriah Waterland
25545c51f124SMoriah Waterland /* pkg ALLZONES=true & pkg "in gz only" & pkg "is installed" */
25555c51f124SMoriah Waterland
25565c51f124SMoriah Waterland if (all_zones && in_gz_only && pkg_installed) {
25575c51f124SMoriah Waterland progerr(ERR_IN_GZ_AND_ALLZONES_AND_INSTALLED, a_pkgInst);
25585c51f124SMoriah Waterland return (B_FALSE);
25595c51f124SMoriah Waterland }
25605c51f124SMoriah Waterland
25615c51f124SMoriah Waterland /* pkg ALLZONES=true && -G specified (#2/#3) */
25625c51f124SMoriah Waterland
25635c51f124SMoriah Waterland if (all_zones && (a_flags & CAF_SCOPE_GLOBAL)) {
25645c51f124SMoriah Waterland progerr(ERR_ALLZONES_AND_G_USED, a_pkgInst);
25655c51f124SMoriah Waterland return (B_FALSE);
25665c51f124SMoriah Waterland }
25675c51f124SMoriah Waterland
25685c51f124SMoriah Waterland /* pkg "!this zone" && "in gz only" & -G not specified */
25695c51f124SMoriah Waterland
25705c51f124SMoriah Waterland if ((!this_zone) && in_gz_only && (!(a_flags & CAF_SCOPE_GLOBAL))) {
25715c51f124SMoriah Waterland progerr(ERR_IN_GZ_AND_NO_G_USED, a_pkgInst);
25725c51f124SMoriah Waterland return (B_FALSE);
25735c51f124SMoriah Waterland }
25745c51f124SMoriah Waterland
25755c51f124SMoriah Waterland /*
25765c51f124SMoriah Waterland * If this package is marked 'this zone only', then mark the package
25775c51f124SMoriah Waterland * as "add to this zone only". This is referenced by the various
25785c51f124SMoriah Waterland * add_package_... functions to determine if the package should be
25795c51f124SMoriah Waterland * added to the current zone, or to all zones, depending on the
25805c51f124SMoriah Waterland * zone in which the command is being run.
25815c51f124SMoriah Waterland */
25825c51f124SMoriah Waterland
25835c51f124SMoriah Waterland if (this_zone) {
25845c51f124SMoriah Waterland pkgAddThisZonePackage(a_pkgInst);
25855c51f124SMoriah Waterland }
25865c51f124SMoriah Waterland
25875c51f124SMoriah Waterland return (B_TRUE);
25885c51f124SMoriah Waterland }
25895c51f124SMoriah Waterland
25905c51f124SMoriah Waterland /*
25915c51f124SMoriah Waterland * Name: create_zone_adminfile
25925c51f124SMoriah Waterland * Description: Given a zone temporary directory and optionally an existing
25935c51f124SMoriah Waterland * administration file, generate an administration file that
25945c51f124SMoriah Waterland * can be used to perform "non-interactive" operations in a
25955c51f124SMoriah Waterland * non-global zone.
25965c51f124SMoriah Waterland * Arguments: r_zoneAdminFile - pointer to handle that will contain a
25975c51f124SMoriah Waterland * string representing the path to the temporary
25985c51f124SMoriah Waterland * administration file created - this must be NULL
25995c51f124SMoriah Waterland * before the first call to this function - on
26005c51f124SMoriah Waterland * subsequent calls if the pointer is NOT null then
26015c51f124SMoriah Waterland * the existing string will NOT be overwritten.
26025c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the path
26035c51f124SMoriah Waterland * to the zone temporary directory to create the
26045c51f124SMoriah Waterland * temporary administration file in
26055c51f124SMoriah Waterland * a_admnfile - pointer to string representing the path to
26065c51f124SMoriah Waterland * an existing "user" administration file - the
26075c51f124SMoriah Waterland * administration file created will contain the
26085c51f124SMoriah Waterland * settings contained in this file, modified as
26095c51f124SMoriah Waterland * appropriate to supress any interaction;
26105c51f124SMoriah Waterland * If this is == NULL then the administration file
26115c51f124SMoriah Waterland * created will not contain any extra settings
26125c51f124SMoriah Waterland * Returns: void
26135c51f124SMoriah Waterland * NOTE: Any string returned is placed in new storage for the
26145c51f124SMoriah Waterland * calling method. The caller must use 'free' to dispose
26155c51f124SMoriah Waterland * of the storage once the string is no longer needed.
26165c51f124SMoriah Waterland * NOTE: On any error this function will call 'quit(1)'
26175c51f124SMoriah Waterland */
26185c51f124SMoriah Waterland
26195c51f124SMoriah Waterland static void
create_zone_adminfile(char ** r_zoneAdminFile,char * a_zoneTempDir,char * a_admnfile)26205c51f124SMoriah Waterland create_zone_adminfile(char **r_zoneAdminFile, char *a_zoneTempDir,
26212e10def1SPeter Tribble char *a_admnfile)
26225c51f124SMoriah Waterland {
26235c51f124SMoriah Waterland boolean_t b;
26245c51f124SMoriah Waterland
26255c51f124SMoriah Waterland /* entry assertions */
26265c51f124SMoriah Waterland
26275c51f124SMoriah Waterland assert(r_zoneAdminFile != (char **)NULL);
26285c51f124SMoriah Waterland assert(a_zoneTempDir != (char *)NULL);
26295c51f124SMoriah Waterland assert(*a_zoneTempDir != '\0');
26305c51f124SMoriah Waterland
26315c51f124SMoriah Waterland /* entry debugging info */
26325c51f124SMoriah Waterland
26335c51f124SMoriah Waterland echoDebug(DBG_CREATE_ZONE_ADMINFILE, a_zoneTempDir, PSTR(a_admnfile));
26345c51f124SMoriah Waterland
26355c51f124SMoriah Waterland /* if temporary name already exists, do not overwrite */
26365c51f124SMoriah Waterland
26375c51f124SMoriah Waterland if (*r_zoneAdminFile != (char *)NULL) {
26385c51f124SMoriah Waterland return;
26395c51f124SMoriah Waterland }
26405c51f124SMoriah Waterland
26415c51f124SMoriah Waterland /* create temporary name */
26425c51f124SMoriah Waterland
26435c51f124SMoriah Waterland *r_zoneAdminFile = tempnam(a_zoneTempDir, "zadmn");
26445c51f124SMoriah Waterland b = z_create_zone_admin_file(*r_zoneAdminFile, a_admnfile);
26455c51f124SMoriah Waterland if (b == B_FALSE) {
26465c51f124SMoriah Waterland progerr(ERR_CREATE_TMPADMIN, *r_zoneAdminFile,
26472e10def1SPeter Tribble strerror(errno));
26485c51f124SMoriah Waterland quit(1);
26495c51f124SMoriah Waterland /* NOTREACHED */
26505c51f124SMoriah Waterland }
26515c51f124SMoriah Waterland
26525c51f124SMoriah Waterland echoDebug(DBG_CREATED_ZONE_ADMINFILE, *r_zoneAdminFile);
26535c51f124SMoriah Waterland }
26545c51f124SMoriah Waterland
26555c51f124SMoriah Waterland /*
26565c51f124SMoriah Waterland * Name: create_zone_tempdir
26575c51f124SMoriah Waterland * Description: Given a system temporary directory, create a "zone" specific
26585c51f124SMoriah Waterland * temporary directory and return the path to the directory
26595c51f124SMoriah Waterland * created.
26605c51f124SMoriah Waterland * Arguments: r_zoneTempDir - pointer to handle that will contain a
26615c51f124SMoriah Waterland * string representing the path to the temporary
26625c51f124SMoriah Waterland * directory created - this must be NULL before the
26635c51f124SMoriah Waterland * first call to this function - on subsequent calls
26645c51f124SMoriah Waterland * if the pointer is NOT null then the existing string
26655c51f124SMoriah Waterland * will NOT be overwritten.
26665c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the path
26675c51f124SMoriah Waterland * to the system temporary directory to create the
26685c51f124SMoriah Waterland * temporary zone directory in
26695c51f124SMoriah Waterland * Returns: void
26705c51f124SMoriah Waterland * NOTE: Any string returned is placed in new storage for the
26715c51f124SMoriah Waterland * calling method. The caller must use 'free' to dispose
26725c51f124SMoriah Waterland * of the storage once the string is no longer needed.
26735c51f124SMoriah Waterland * NOTE: On any error this function will call 'quit(1)'
26745c51f124SMoriah Waterland * NOTE: This function calls "quitSetZoneTmpdir" on success to
26755c51f124SMoriah Waterland * register the directory created with quit() so that the
26765c51f124SMoriah Waterland * directory will be automatically deleted on exit.
26775c51f124SMoriah Waterland */
26785c51f124SMoriah Waterland
26795c51f124SMoriah Waterland static void
create_zone_tempdir(char ** r_zoneTempDir,char * a_tmpdir)26805c51f124SMoriah Waterland create_zone_tempdir(char **r_zoneTempDir, char *a_tmpdir)
26815c51f124SMoriah Waterland {
26825c51f124SMoriah Waterland boolean_t b;
26835c51f124SMoriah Waterland
26845c51f124SMoriah Waterland /* entry assertions */
26855c51f124SMoriah Waterland
26865c51f124SMoriah Waterland assert(r_zoneTempDir != (char **)NULL);
26875c51f124SMoriah Waterland assert(a_tmpdir != (char *)NULL);
26885c51f124SMoriah Waterland assert(*a_tmpdir != '\0');
26895c51f124SMoriah Waterland
26905c51f124SMoriah Waterland /* entry debugging info */
26915c51f124SMoriah Waterland
26925c51f124SMoriah Waterland echoDebug(DBG_CREATE_ZONE_TEMPDIR, a_tmpdir);
26935c51f124SMoriah Waterland
26945c51f124SMoriah Waterland /* if temporary directory already exists, do not overwrite */
26955c51f124SMoriah Waterland
26965c51f124SMoriah Waterland if (*r_zoneTempDir != (char *)NULL) {
26975c51f124SMoriah Waterland return;
26985c51f124SMoriah Waterland }
26995c51f124SMoriah Waterland
27005c51f124SMoriah Waterland /* create temporary directory */
27015c51f124SMoriah Waterland
27025c51f124SMoriah Waterland b = setup_temporary_directory(r_zoneTempDir, a_tmpdir, "ztemp");
27035c51f124SMoriah Waterland if (b == B_FALSE) {
27045c51f124SMoriah Waterland progerr(ERR_ZONETEMPDIR, a_tmpdir, strerror(errno));
27055c51f124SMoriah Waterland quit(1);
27065c51f124SMoriah Waterland /* NOTREACHED */
27075c51f124SMoriah Waterland }
27085c51f124SMoriah Waterland
27095c51f124SMoriah Waterland /* register with quit() so directory is removed on exit */
27105c51f124SMoriah Waterland
27115c51f124SMoriah Waterland quitSetZoneTmpdir(*r_zoneTempDir);
27125c51f124SMoriah Waterland
27135c51f124SMoriah Waterland /* exit debugging info */
27145c51f124SMoriah Waterland
27155c51f124SMoriah Waterland echoDebug(DBG_CREATED_ZONE_TEMPDIR, *r_zoneTempDir);
27165c51f124SMoriah Waterland }
27175c51f124SMoriah Waterland
27185c51f124SMoriah Waterland /*
27195c51f124SMoriah Waterland * Name: continue_installation
27205c51f124SMoriah Waterland * Description: Called from within a loop that is installing packages,
27215c51f124SMoriah Waterland * this function examines various global variables and decides
27225c51f124SMoriah Waterland * whether or not to ask an appropriate question, and wait for
27235c51f124SMoriah Waterland * and appropriate reply.
27245c51f124SMoriah Waterland * Arguments: <<global variables>>
27255c51f124SMoriah Waterland * Returns: B_TRUE - continue processing with next package
27265c51f124SMoriah Waterland * B_FALSE - do not continue processing with next package
27275c51f124SMoriah Waterland */
27285c51f124SMoriah Waterland
27295c51f124SMoriah Waterland static boolean_t
continue_installation(void)27305c51f124SMoriah Waterland continue_installation(void)
27315c51f124SMoriah Waterland {
27325c51f124SMoriah Waterland char ans[MAX_INPUT];
27335c51f124SMoriah Waterland int n;
27345c51f124SMoriah Waterland
27355c51f124SMoriah Waterland /* return TRUE if not interrupted */
27365c51f124SMoriah Waterland
27375c51f124SMoriah Waterland if (!interrupted) {
27385c51f124SMoriah Waterland return (B_TRUE);
27395c51f124SMoriah Waterland }
27405c51f124SMoriah Waterland
27415c51f124SMoriah Waterland /*
27425c51f124SMoriah Waterland * process interrupted - determine whether or not to continue
27435c51f124SMoriah Waterland */
27445c51f124SMoriah Waterland
27455c51f124SMoriah Waterland /* output appropriate interrupted message */
27465c51f124SMoriah Waterland
27475c51f124SMoriah Waterland if (askflag) {
27485c51f124SMoriah Waterland echo(npkgs == 1 ? MSG_1MORE_PROC : MSG_MORE_PROC, npkgs);
27495c51f124SMoriah Waterland } else {
27505c51f124SMoriah Waterland echo(npkgs == 1 ? MSG_1MORE_INST : MSG_MORE_INST, npkgs);
27515c51f124SMoriah Waterland }
27525c51f124SMoriah Waterland
27535c51f124SMoriah Waterland /* if running with no interaction (-n) do not ask question */
27545c51f124SMoriah Waterland
27555c51f124SMoriah Waterland if (nointeract) {
27565c51f124SMoriah Waterland /* if admin required return 'dont continue' */
27575c51f124SMoriah Waterland if (needconsult) {
27585c51f124SMoriah Waterland return (B_FALSE);
27595c51f124SMoriah Waterland }
27605c51f124SMoriah Waterland ckquit = 1;
27615c51f124SMoriah Waterland return (B_TRUE);
27625c51f124SMoriah Waterland }
27635c51f124SMoriah Waterland
27645c51f124SMoriah Waterland /* interaction possible: ask question */
27655c51f124SMoriah Waterland
27665c51f124SMoriah Waterland ckquit = 0;
27675c51f124SMoriah Waterland n = ckyorn(ans, NULL, NULL, NULL, ASK_CONTINUE_ADD);
27685c51f124SMoriah Waterland if (n != 0) {
27695c51f124SMoriah Waterland quit(n);
27705c51f124SMoriah Waterland /* NOTREACHED */
27715c51f124SMoriah Waterland }
27725c51f124SMoriah Waterland ckquit = 1;
27735c51f124SMoriah Waterland if (strchr("yY", *ans) == NULL) {
27745c51f124SMoriah Waterland return (B_FALSE);
27755c51f124SMoriah Waterland }
27765c51f124SMoriah Waterland return (B_TRUE);
27775c51f124SMoriah Waterland }
27785c51f124SMoriah Waterland
27795c51f124SMoriah Waterland /*
27805c51f124SMoriah Waterland * package can be in a number of formats:
27815c51f124SMoriah Waterland * - file containing package stream (pkgadd -d file [pkgs])
27825c51f124SMoriah Waterland * - directory containing packages (pkgadd -d /dir [pkgs])
27835c51f124SMoriah Waterland * - device containing packages (pkgadd -d diskette1 [pkgs])
27845c51f124SMoriah Waterland * non-global zones can be passed open files and strings as arguments
27855c51f124SMoriah Waterland * - for file containing package stream
27865c51f124SMoriah Waterland * -- the stream can be passed directly to the non-global zone
27875c51f124SMoriah Waterland * - for directory
27885c51f124SMoriah Waterland * -- convert packages to datastream to pass to the non-global zone
27895c51f124SMoriah Waterland * - for device
27905c51f124SMoriah Waterland * -- ?
27915c51f124SMoriah Waterland */
27925c51f124SMoriah Waterland
27935c51f124SMoriah Waterland static boolean_t
unpack_and_check_packages(char ** a_pkgList,char * a_idsName,char * a_packageDir)27945c51f124SMoriah Waterland unpack_and_check_packages(char **a_pkgList, char *a_idsName, char *a_packageDir)
27955c51f124SMoriah Waterland {
27965c51f124SMoriah Waterland int savenpkgs = npkgs;
27975c51f124SMoriah Waterland int i;
27985c51f124SMoriah Waterland CAF_T flags = 0;
27995c51f124SMoriah Waterland
28005c51f124SMoriah Waterland /* entry assertions */
28015c51f124SMoriah Waterland
28025c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
28035c51f124SMoriah Waterland
28045c51f124SMoriah Waterland /* entry debugging info */
28055c51f124SMoriah Waterland
28065c51f124SMoriah Waterland echoDebug(DBG_UNPACKCHECK_ENTRY);
28075c51f124SMoriah Waterland echoDebug(DBG_UNPACKCHECK_ARGS, PSTR(a_idsName), PSTR(a_packageDir));
28085c51f124SMoriah Waterland
28095c51f124SMoriah Waterland /*
28105c51f124SMoriah Waterland * set flags for applicability check
28115c51f124SMoriah Waterland */
28125c51f124SMoriah Waterland
28135c51f124SMoriah Waterland /* determine if running in the global zone */
28145c51f124SMoriah Waterland
28155c51f124SMoriah Waterland if (z_running_in_global_zone() == B_TRUE) {
28165c51f124SMoriah Waterland flags |= CAF_IN_GLOBAL_ZONE;
28175c51f124SMoriah Waterland }
28185c51f124SMoriah Waterland
28195c51f124SMoriah Waterland /* set -G flag */
28205c51f124SMoriah Waterland
28215c51f124SMoriah Waterland if (globalZoneOnly == B_TRUE) {
28225c51f124SMoriah Waterland flags |= CAF_SCOPE_GLOBAL;
28235c51f124SMoriah Waterland }
28245c51f124SMoriah Waterland
28255c51f124SMoriah Waterland /*
28265c51f124SMoriah Waterland * for each package to install:
28275c51f124SMoriah Waterland * - if packages from datastream, unpack package into package dir
28285c51f124SMoriah Waterland * - check applicability of installing package on this system/zone
28295c51f124SMoriah Waterland */
28305c51f124SMoriah Waterland
28315c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
28325c51f124SMoriah Waterland if (a_idsName != (char *)NULL) {
28335c51f124SMoriah Waterland /* create stream out of package if not already one */
28345c51f124SMoriah Waterland if (unpack_package_from_stream(a_idsName, pkginst,
28352e10def1SPeter Tribble a_packageDir) == B_FALSE) {
28365c51f124SMoriah Waterland progerr(ERR_CANNOT_UNPACK_PKGSTRM,
28372e10def1SPeter Tribble PSTR(pkginst), PSTR(a_idsName),
28382e10def1SPeter Tribble PSTR(a_packageDir));
28395c51f124SMoriah Waterland
28405c51f124SMoriah Waterland npkgs = savenpkgs;
28415c51f124SMoriah Waterland return (B_FALSE);
28425c51f124SMoriah Waterland }
28435c51f124SMoriah Waterland } else {
28445c51f124SMoriah Waterland echoDebug(DBG_PKG_IN_DIR, pkginst, a_packageDir);
28455c51f124SMoriah Waterland }
28465c51f124SMoriah Waterland
28475c51f124SMoriah Waterland /* check package applicability */
28485c51f124SMoriah Waterland if (check_applicability(a_packageDir,
28492e10def1SPeter Tribble pkginst, get_inst_root(), flags) == B_FALSE) {
28505c51f124SMoriah Waterland progerr(ERR_PKG_NOT_INSTALLABLE, pkginst);
28515c51f124SMoriah Waterland npkgs = savenpkgs;
28525c51f124SMoriah Waterland return (B_FALSE);
28535c51f124SMoriah Waterland }
28545c51f124SMoriah Waterland npkgs--;
28555c51f124SMoriah Waterland }
28565c51f124SMoriah Waterland
28575c51f124SMoriah Waterland npkgs = savenpkgs;
28585c51f124SMoriah Waterland return (B_TRUE);
28595c51f124SMoriah Waterland }
28605c51f124SMoriah Waterland
28615c51f124SMoriah Waterland /*
28625c51f124SMoriah Waterland * returns:
28635c51f124SMoriah Waterland * B_TRUE - package list generated
28645c51f124SMoriah Waterland * B_FALSE - failed to generate package list
28655c51f124SMoriah Waterland * Will call quit(n) on fatal error.
28665c51f124SMoriah Waterland */
28675c51f124SMoriah Waterland
28685c51f124SMoriah Waterland static boolean_t
get_package_list(char *** r_pkgList,char ** a_argv,char * a_categories,char ** a_categoryList,char * a_idsName,int * r_repeat)28695c51f124SMoriah Waterland get_package_list(char ***r_pkgList, char **a_argv, char *a_categories,
28702e10def1SPeter Tribble char **a_categoryList, char *a_idsName, int *r_repeat)
28715c51f124SMoriah Waterland {
28725c51f124SMoriah Waterland int n;
28735c51f124SMoriah Waterland
28745c51f124SMoriah Waterland /* entry assertions */
28755c51f124SMoriah Waterland
28765c51f124SMoriah Waterland assert(r_repeat != (int *)NULL);
28775c51f124SMoriah Waterland
28785c51f124SMoriah Waterland /* entry debugging info */
28795c51f124SMoriah Waterland
28805c51f124SMoriah Waterland echoDebug(DBG_GETPKGLIST_ENTRY);
28815c51f124SMoriah Waterland echoDebug(DBG_GETPKGLIST_ARGS, PSTR(a_idsName), PSTR(pkgdev.dirname),
28822e10def1SPeter Tribble *r_repeat);
28835c51f124SMoriah Waterland
28845c51f124SMoriah Waterland /*
28855c51f124SMoriah Waterland * get the list of the packages to add
28865c51f124SMoriah Waterland */
28875c51f124SMoriah Waterland
28885c51f124SMoriah Waterland n = pkgGetPackageList(r_pkgList, a_argv, optind, a_categories,
28892e10def1SPeter Tribble a_categoryList, &pkgdev);
28905c51f124SMoriah Waterland
28915c51f124SMoriah Waterland switch (n) {
28925c51f124SMoriah Waterland case -1: /* no packages found */
28935c51f124SMoriah Waterland echoDebug(DBG_PKGLIST_NONFOUND, PSTR(a_idsName),
28942e10def1SPeter Tribble pkgdev.dirname);
28955c51f124SMoriah Waterland return (B_FALSE);
28965c51f124SMoriah Waterland
28975c51f124SMoriah Waterland case 0: /* packages found */
28985c51f124SMoriah Waterland break;
28995c51f124SMoriah Waterland
29005c51f124SMoriah Waterland default: /* "quit" error */
29015c51f124SMoriah Waterland echoDebug(DBG_PKGLIST_ERROR, PSTR(a_idsName),
29022e10def1SPeter Tribble pkgdev.dirname, n);
29035c51f124SMoriah Waterland quit(n);
29045c51f124SMoriah Waterland /* NOTREACHED */
29055c51f124SMoriah Waterland }
29065c51f124SMoriah Waterland
29075c51f124SMoriah Waterland /* order package list if input data stream specified */
29085c51f124SMoriah Waterland
29095c51f124SMoriah Waterland if (a_idsName) {
29105c51f124SMoriah Waterland ds_order(*r_pkgList);
29115c51f124SMoriah Waterland }
29125c51f124SMoriah Waterland
29135c51f124SMoriah Waterland return (B_TRUE);
29145c51f124SMoriah Waterland }
29155c51f124SMoriah Waterland
29165c51f124SMoriah Waterland /*
29175c51f124SMoriah Waterland * Name: install_in_one_zone
29185c51f124SMoriah Waterland * Description: Install a single package in a single zone
29196e1ae2a3SGary Pennington * Arguments: a_zoneName - pointer to string representing the name of the
29205c51f124SMoriah Waterland * zone to install the package into.
29215c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
29225c51f124SMoriah Waterland * device (input data stream) containing the package to
29235c51f124SMoriah Waterland * be installed.
29245c51f124SMoriah Waterland * If this is == NULL the package is assumed to be
29255c51f124SMoriah Waterland * spooled in the zone temporary directory.
29265c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
29275c51f124SMoriah Waterland * file to pass to pkginstall when installing the package.
29285c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
29295c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the temporary
29305c51f124SMoriah Waterland * directory in which spooled packages can be found if
29315c51f124SMoriah Waterland * a_idsName is == NULL.
29325c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
29335c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
29345c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
29355c51f124SMoriah Waterland * passed to pkginstall.
29365c51f124SMoriah Waterland * a_scratchName - pointer to string representing the name of the
29375c51f124SMoriah Waterland * scratch zone to use for installation.
29385c51f124SMoriah Waterland * a_zoneState - state of the zone; must be mounted or running.
293962224350SCasper H.S. Dik * a_tmpzn - B_TRUE when this zone is booted by the package
294062224350SCasper H.S. Dik * command or B_FALSE if it was running before.
29415c51f124SMoriah Waterland * Returns: void
29425c51f124SMoriah Waterland * NOTE: As a side effect, "ckreturn" is called on the result returned
29435c51f124SMoriah Waterland * from running 'pkginstall' in the zone; this sets several global
29445c51f124SMoriah Waterland * variables which allows the caller to determine the result of
29455c51f124SMoriah Waterland * the installation operation.
29465c51f124SMoriah Waterland */
29475c51f124SMoriah Waterland
29485c51f124SMoriah Waterland static void
install_in_one_zone(char * a_zoneName,char * a_idsName,char * a_zoneAdminFile,char * a_zoneTempDir,char * a_altBinDir,zone_state_t a_zoneState,boolean_t a_tmpzn)29496e1ae2a3SGary Pennington install_in_one_zone(char *a_zoneName, char *a_idsName,
29502e10def1SPeter Tribble char *a_zoneAdminFile, char *a_zoneTempDir,
29512e10def1SPeter Tribble char *a_altBinDir, zone_state_t a_zoneState, boolean_t a_tmpzn)
29525c51f124SMoriah Waterland {
29535c51f124SMoriah Waterland char zoneStreamName[PATH_MAX] = {'\0'};
29545c51f124SMoriah Waterland int n;
29555c51f124SMoriah Waterland
29565c51f124SMoriah Waterland /* entry assertions */
29575c51f124SMoriah Waterland
29585c51f124SMoriah Waterland assert(a_zoneName != (char *)NULL);
29595c51f124SMoriah Waterland assert(*a_zoneName != '\0');
29605c51f124SMoriah Waterland
29615c51f124SMoriah Waterland /* entry debugging info */
29625c51f124SMoriah Waterland
29635c51f124SMoriah Waterland echoDebug(DBG_INSTINONEZONE_ENTRY);
29645c51f124SMoriah Waterland echoDebug(DBG_INSTINONEZONE_ARGS, a_zoneName, PSTR(a_idsName),
29652e10def1SPeter Tribble PSTR(a_zoneAdminFile), PSTR(a_zoneTempDir),
29662e10def1SPeter Tribble PSTR(a_altBinDir));
29675c51f124SMoriah Waterland
29685c51f124SMoriah Waterland /* echo operation to perform to stdout */
29695c51f124SMoriah Waterland
29705c51f124SMoriah Waterland echo(MSG_INSTALL_PKG_IN_ZONE, pkginst, a_zoneName);
29715c51f124SMoriah Waterland
29725c51f124SMoriah Waterland /* determine path to the package stream */
29735c51f124SMoriah Waterland
29745c51f124SMoriah Waterland if (a_idsName == (char *)NULL) {
29755c51f124SMoriah Waterland /* locate temp stream created earlier */
29765c51f124SMoriah Waterland (void) snprintf(zoneStreamName, sizeof (zoneStreamName),
29772e10def1SPeter Tribble "%s/%s.dstream", a_zoneTempDir, pkginst);
29785c51f124SMoriah Waterland } else {
29795c51f124SMoriah Waterland /* use stream passed in on command line */
29805c51f124SMoriah Waterland (void) snprintf(zoneStreamName, sizeof (zoneStreamName),
29812e10def1SPeter Tribble "%s", a_idsName);
29825c51f124SMoriah Waterland }
29835c51f124SMoriah Waterland
29845c51f124SMoriah Waterland echoDebug(DBG_INSTALL_IN_ZONE, pkginst, a_zoneName, zoneStreamName);
29855c51f124SMoriah Waterland
29866e1ae2a3SGary Pennington n = pkgZoneInstall(a_zoneName, a_zoneState, zoneStreamName,
29876e1ae2a3SGary Pennington a_altBinDir, a_zoneAdminFile, a_tmpzn);
29885c51f124SMoriah Waterland
29895c51f124SMoriah Waterland /* set success/fail condition variables */
29905c51f124SMoriah Waterland
29915c51f124SMoriah Waterland ckreturn(n);
29925c51f124SMoriah Waterland
29935c51f124SMoriah Waterland /* exit debugging info */
29945c51f124SMoriah Waterland
29955c51f124SMoriah Waterland echoDebug(DBG_INSTALL_FLAG_VALUES, "after install", admnflag, doreboot,
29962e10def1SPeter Tribble failflag, interrupted, intrflag, ireboot, needconsult,
29972e10def1SPeter Tribble nullflag, warnflag);
29985c51f124SMoriah Waterland }
29995c51f124SMoriah Waterland
30005c51f124SMoriah Waterland /*
30015c51f124SMoriah Waterland * Name: install_in_zones
30025c51f124SMoriah Waterland * Description: Install a single package in the zones that are running from
30035c51f124SMoriah Waterland * a list of zones
30045c51f124SMoriah Waterland * Arguments: a_zlst - list of zones to install the package into
30055c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
30065c51f124SMoriah Waterland * device (input data stream) containing the package to
30075c51f124SMoriah Waterland * be installed.
30085c51f124SMoriah Waterland * If this is == NULL the package is assumed to be
30095c51f124SMoriah Waterland * spooled in the zone temporary directory.
30105c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
30115c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
30125c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
30135c51f124SMoriah Waterland * passed to pkginstall.
30145c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
30155c51f124SMoriah Waterland * file to pass to pkginstall when installing the package.
30165c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
30175c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the temporary
30185c51f124SMoriah Waterland * directory in which spooled packages can be found if
30195c51f124SMoriah Waterland * a_idsName is == NULL.
30205c51f124SMoriah Waterland */
30215c51f124SMoriah Waterland
30225c51f124SMoriah Waterland static int
install_in_zones(zoneList_t a_zlst,char * a_idsName,char * a_altBinDir,char * a_zoneAdminFile,char * a_zoneTempDir)30235c51f124SMoriah Waterland install_in_zones(zoneList_t a_zlst, char *a_idsName, char *a_altBinDir,
30242e10def1SPeter Tribble char *a_zoneAdminFile, char *a_zoneTempDir)
30255c51f124SMoriah Waterland {
30265c51f124SMoriah Waterland char *zoneName;
30275c51f124SMoriah Waterland int zoneIndex;
30285c51f124SMoriah Waterland int zonesSkipped = 0;
30295c51f124SMoriah Waterland zone_state_t zst;
30305c51f124SMoriah Waterland
30315c51f124SMoriah Waterland /* entry assertions */
30325c51f124SMoriah Waterland
30335c51f124SMoriah Waterland assert(a_zlst != (zoneList_t)NULL);
30345c51f124SMoriah Waterland
30355c51f124SMoriah Waterland /* entry debugging info */
30365c51f124SMoriah Waterland
30375c51f124SMoriah Waterland echoDebug(DBG_INSTALLINZONES_ENTRY);
30385c51f124SMoriah Waterland echoDebug(DBG_INSTALLINZONES_ARGS, PSTR(a_idsName),
30392e10def1SPeter Tribble PSTR(a_zoneAdminFile), PSTR(a_zoneTempDir));
30405c51f124SMoriah Waterland
30415c51f124SMoriah Waterland /* process each zone in the list */
30425c51f124SMoriah Waterland
30435c51f124SMoriah Waterland for (zoneIndex = 0;
30442e10def1SPeter Tribble (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) != NULL;
30452e10def1SPeter Tribble zoneIndex++) {
30465c51f124SMoriah Waterland
30475c51f124SMoriah Waterland /* skip the zone if it is NOT running */
30485c51f124SMoriah Waterland
30495c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
30505c51f124SMoriah Waterland if (zst != ZONE_STATE_RUNNING && zst != ZONE_STATE_MOUNTED) {
30515c51f124SMoriah Waterland zonesSkipped++;
30525c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE, zoneName);
30535c51f124SMoriah Waterland continue;
30545c51f124SMoriah Waterland }
30555c51f124SMoriah Waterland
30565c51f124SMoriah Waterland /* install the package in this zone */
30575c51f124SMoriah Waterland
30586e1ae2a3SGary Pennington install_in_one_zone(z_zlist_get_scratch(a_zlst, zoneIndex),
30596e1ae2a3SGary Pennington a_idsName, a_zoneAdminFile, a_zoneTempDir, a_altBinDir,
30606e1ae2a3SGary Pennington zst, B_FALSE);
30615c51f124SMoriah Waterland }
30625c51f124SMoriah Waterland
30635c51f124SMoriah Waterland return (zonesSkipped);
30645c51f124SMoriah Waterland }
30655c51f124SMoriah Waterland
30665c51f124SMoriah Waterland /*
30675c51f124SMoriah Waterland * Name: boot_and_install_in_zones
30685c51f124SMoriah Waterland * Description: Install a single package in the zones that are NOT running from
30695c51f124SMoriah Waterland * a list of zones - each zone is booted, the package installed,
30705c51f124SMoriah Waterland * and the zone is halted
30715c51f124SMoriah Waterland * Arguments: a_zlst - list of zones to install the package into
30725c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
30735c51f124SMoriah Waterland * device (input data stream) containing the package to
30745c51f124SMoriah Waterland * be installed.
30755c51f124SMoriah Waterland * If this is == NULL the package is assumed to be
30765c51f124SMoriah Waterland * spooled in the zone temporary directory.
30775c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
30785c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
30795c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
30805c51f124SMoriah Waterland * passed to pkginstall.
30815c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
30825c51f124SMoriah Waterland * file to pass to pkginstall when installing the package.
30835c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
30845c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the temporary
30855c51f124SMoriah Waterland * directory in which spooled packages can be found if
30865c51f124SMoriah Waterland * a_idsName is == NULL.
30875c51f124SMoriah Waterland */
30885c51f124SMoriah Waterland
30895c51f124SMoriah Waterland static int
boot_and_install_in_zones(zoneList_t a_zlst,char * a_idsName,char * a_altBinDir,char * a_zoneAdminFile,char * a_zoneTempDir)30905c51f124SMoriah Waterland boot_and_install_in_zones(zoneList_t a_zlst, char *a_idsName, char *a_altBinDir,
30912e10def1SPeter Tribble char *a_zoneAdminFile, char *a_zoneTempDir)
30925c51f124SMoriah Waterland {
30935c51f124SMoriah Waterland boolean_t b;
30945c51f124SMoriah Waterland char *zoneName;
30955c51f124SMoriah Waterland int zoneIndex;
30965c51f124SMoriah Waterland int zonesSkipped = 0;
30975c51f124SMoriah Waterland zone_state_t zst;
30985c51f124SMoriah Waterland
30995c51f124SMoriah Waterland /* entry assertions */
31005c51f124SMoriah Waterland
31015c51f124SMoriah Waterland assert(a_zlst != (zoneList_t)NULL);
31025c51f124SMoriah Waterland
31035c51f124SMoriah Waterland /* entry debugging info */
31045c51f124SMoriah Waterland
31055c51f124SMoriah Waterland echoDebug(DBG_BOOTINSTALLINZONES_ENTRY);
31065c51f124SMoriah Waterland echoDebug(DBG_BOOTINSTALLINZONES_ARGS, PSTR(a_idsName),
31072e10def1SPeter Tribble PSTR(a_zoneAdminFile), PSTR(a_zoneTempDir));
31085c51f124SMoriah Waterland
31095c51f124SMoriah Waterland /* process each zone in the list */
31105c51f124SMoriah Waterland
31115c51f124SMoriah Waterland for (zoneIndex = 0;
31122e10def1SPeter Tribble (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) != NULL;
31132e10def1SPeter Tribble zoneIndex++) {
31145c51f124SMoriah Waterland
31155c51f124SMoriah Waterland /* skip the zone if it IS running */
31165c51f124SMoriah Waterland
31175c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
31185c51f124SMoriah Waterland if (zst == ZONE_STATE_RUNNING || zst == ZONE_STATE_MOUNTED) {
31195c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_BOOT, zoneName);
31205c51f124SMoriah Waterland continue;
31215c51f124SMoriah Waterland }
31225c51f124SMoriah Waterland
31235c51f124SMoriah Waterland /* skip the zone if it is NOT bootable */
31245c51f124SMoriah Waterland
31255c51f124SMoriah Waterland if (z_zlist_is_zone_runnable(a_zlst, zoneIndex) == B_FALSE) {
31265c51f124SMoriah Waterland echo(MSG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
31275c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
31285c51f124SMoriah Waterland continue;
31295c51f124SMoriah Waterland }
31305c51f124SMoriah Waterland
31315c51f124SMoriah Waterland /* mount up the zone */
31325c51f124SMoriah Waterland
31335c51f124SMoriah Waterland echo(MSG_BOOTING_ZONE, zoneName);
31345c51f124SMoriah Waterland echoDebug(DBG_BOOTING_ZONE, zoneName);
31355c51f124SMoriah Waterland
31365c51f124SMoriah Waterland b = z_zlist_change_zone_state(a_zlst, zoneIndex,
31372e10def1SPeter Tribble ZONE_STATE_MOUNTED);
31385c51f124SMoriah Waterland if (b == B_FALSE) {
31395c51f124SMoriah Waterland progerr(ERR_CANNOT_BOOT_ZONE, zoneName);
31405c51f124SMoriah Waterland /* set fatal error return condition */
31415c51f124SMoriah Waterland ckreturn(1);
31425c51f124SMoriah Waterland zonesSkipped++;
31435c51f124SMoriah Waterland continue;
31445c51f124SMoriah Waterland }
31455c51f124SMoriah Waterland
31465c51f124SMoriah Waterland /* install the package in this zone */
31475c51f124SMoriah Waterland
31486e1ae2a3SGary Pennington install_in_one_zone(z_zlist_get_scratch(a_zlst, zoneIndex),
31496e1ae2a3SGary Pennington a_idsName, a_zoneAdminFile, a_zoneTempDir, a_altBinDir,
315062224350SCasper H.S. Dik ZONE_STATE_MOUNTED, B_TRUE);
31515c51f124SMoriah Waterland
31525c51f124SMoriah Waterland /* restore original state of zone */
31535c51f124SMoriah Waterland
31545c51f124SMoriah Waterland echo(MSG_RESTORE_ZONE_STATE, zoneName);
31555c51f124SMoriah Waterland echoDebug(DBG_RESTORE_ZONE_STATE, zoneName);
31565c51f124SMoriah Waterland
31575c51f124SMoriah Waterland b = z_zlist_restore_zone_state(a_zlst, zoneIndex);
31585c51f124SMoriah Waterland }
31595c51f124SMoriah Waterland
31605c51f124SMoriah Waterland return (zonesSkipped);
31615c51f124SMoriah Waterland }
31625c51f124SMoriah Waterland
31635c51f124SMoriah Waterland /*
31645c51f124SMoriah Waterland * Name: pkginstall_check_in_one_zone
31655c51f124SMoriah Waterland * Description: Do a pre install check of a single package in a single zone
31666e1ae2a3SGary Pennington * Arguments: a_zoneName - pointer to string representing the name of the
31675c51f124SMoriah Waterland * zone to check install the package in.
31685c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
31695c51f124SMoriah Waterland * device (input data stream) containing the package to
31705c51f124SMoriah Waterland * be check installed.
31715c51f124SMoriah Waterland * If this is == NULL the package is assumed to be
31725c51f124SMoriah Waterland * spooled in the zone temporary directory.
31735c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
31745c51f124SMoriah Waterland * file to pass to pkginstall when installing the package.
31755c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
31765c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the temporary
31775c51f124SMoriah Waterland * directory in which spooled packages can be found if
31785c51f124SMoriah Waterland * a_idsName is == NULL.
31795c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
31805c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
31815c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
31825c51f124SMoriah Waterland * passed to pkginstall.
31835c51f124SMoriah Waterland * a_scratchName - pointer to string representing the name of the
31845c51f124SMoriah Waterland * scratch zone to use for installation.
31855c51f124SMoriah Waterland * a_zoneState - state of the zone; must be mounted or running.
318662224350SCasper H.S. Dik * a_tmpzn - B_TRUE when this zone is booted by the package
318762224350SCasper H.S. Dik * command or B_FALSE if it was running before.
31885c51f124SMoriah Waterland * Returns: void
31895c51f124SMoriah Waterland * NOTE: As a side effect, "ckreturn" is called on the result returned
31905c51f124SMoriah Waterland * from running 'pkginstall' in the zone; this sets several global
31915c51f124SMoriah Waterland * variables which allows the caller to determine the result of
31925c51f124SMoriah Waterland * the pre installation check operation.
31935c51f124SMoriah Waterland */
31945c51f124SMoriah Waterland
31955c51f124SMoriah Waterland static void
pkginstall_check_in_one_zone(char * a_zoneName,char * a_idsName,char * a_zoneAdminFile,char * a_zoneTempDir,char * a_altBinDir,char * a_scratchName,zone_state_t a_zoneState,boolean_t a_tmpzn)31966e1ae2a3SGary Pennington pkginstall_check_in_one_zone(char *a_zoneName,
31972e10def1SPeter Tribble char *a_idsName, char *a_zoneAdminFile, char *a_zoneTempDir,
31982e10def1SPeter Tribble char *a_altBinDir, char *a_scratchName, zone_state_t a_zoneState,
31992e10def1SPeter Tribble boolean_t a_tmpzn)
32005c51f124SMoriah Waterland {
32015c51f124SMoriah Waterland char preinstallcheckPath[PATH_MAX+1];
32025c51f124SMoriah Waterland char zoneStreamName[PATH_MAX] = {'\0'};
32035c51f124SMoriah Waterland int n;
32045c51f124SMoriah Waterland
32055c51f124SMoriah Waterland echo(MSG_CHECKINSTALL_PKG_IN_ZONE, pkginst, a_zoneName);
32065c51f124SMoriah Waterland echoDebug(MSG_CHECKINSTALL_PKG_IN_ZONE, pkginst, a_zoneName);
32075c51f124SMoriah Waterland
32085c51f124SMoriah Waterland (void) snprintf(preinstallcheckPath, sizeof (preinstallcheckPath),
32092e10def1SPeter Tribble "%s/%s.%s.preinstallcheck.txt", a_zoneTempDir, pkginst,
32102e10def1SPeter Tribble a_zoneName);
32115c51f124SMoriah Waterland
32125c51f124SMoriah Waterland if (a_idsName == (char *)NULL) {
32135c51f124SMoriah Waterland /* locate temporary stream created earlier */
32145c51f124SMoriah Waterland (void) snprintf(zoneStreamName, sizeof (zoneStreamName),
32152e10def1SPeter Tribble "%s/%s.dstream", a_zoneTempDir, pkginst);
32165c51f124SMoriah Waterland } else {
32175c51f124SMoriah Waterland (void) snprintf(zoneStreamName, sizeof (zoneStreamName),
32182e10def1SPeter Tribble "%s", a_idsName);
32195c51f124SMoriah Waterland }
32205c51f124SMoriah Waterland
32215c51f124SMoriah Waterland echoDebug(DBG_CHECKINSTALL_IN_ZONE, pkginst, a_zoneName,
32222e10def1SPeter Tribble zoneStreamName);
32235c51f124SMoriah Waterland
32246e1ae2a3SGary Pennington n = pkgZoneCheckInstall(a_scratchName, a_zoneState, zoneStreamName,
32256e1ae2a3SGary Pennington a_altBinDir, a_zoneAdminFile, preinstallcheckPath, a_tmpzn);
32265c51f124SMoriah Waterland
32275c51f124SMoriah Waterland /* set success/fail condition variables */
32285c51f124SMoriah Waterland
32295c51f124SMoriah Waterland ckreturn(n);
32305c51f124SMoriah Waterland
32315c51f124SMoriah Waterland echoDebug(DBG_INSTALL_FLAG_VALUES, "after preinstall check",
32322e10def1SPeter Tribble admnflag, doreboot, failflag, interrupted, intrflag,
32332e10def1SPeter Tribble ireboot, needconsult, nullflag, warnflag);
32345c51f124SMoriah Waterland }
32355c51f124SMoriah Waterland
32365c51f124SMoriah Waterland /*
32375c51f124SMoriah Waterland * Name: pkginstall_check_in_zones
32385c51f124SMoriah Waterland * Description: Check installation of a single package in the zones that
32395c51f124SMoriah Waterland * are running from a list of zones
32405c51f124SMoriah Waterland * Arguments: a_zlst - list of zones to check install the package
32415c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
32425c51f124SMoriah Waterland * device (input data stream) containing the package to
32435c51f124SMoriah Waterland * be check installed.
32445c51f124SMoriah Waterland * If this is == NULL the package is assumed to be
32455c51f124SMoriah Waterland * spooled in the zone temporary directory.
32465c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
32475c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
32485c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
32495c51f124SMoriah Waterland * passed to pkginstall.
32505c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
32515c51f124SMoriah Waterland * file to pass to pkginstall when checking the installing
32525c51f124SMoriah Waterland * of the package.
32535c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
32545c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the temporary
32555c51f124SMoriah Waterland * directory in which spooled packages can be found if
32565c51f124SMoriah Waterland * a_idsName is == NULL.
32575c51f124SMoriah Waterland */
32585c51f124SMoriah Waterland
32595c51f124SMoriah Waterland static int
pkginstall_check_in_zones(zoneList_t a_zlst,char * a_idsName,char * a_altBinDir,char * a_zoneAdminFile,char * a_zoneTempDir)32605c51f124SMoriah Waterland pkginstall_check_in_zones(zoneList_t a_zlst, char *a_idsName, char *a_altBinDir,
32612e10def1SPeter Tribble char *a_zoneAdminFile, char *a_zoneTempDir)
32625c51f124SMoriah Waterland {
32635c51f124SMoriah Waterland char *zoneName;
32645c51f124SMoriah Waterland int zoneIndex;
32655c51f124SMoriah Waterland int zonesSkipped = 0;
32665c51f124SMoriah Waterland zone_state_t zst;
32675c51f124SMoriah Waterland
32685c51f124SMoriah Waterland for (zoneIndex = 0;
32692e10def1SPeter Tribble (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) != NULL;
32702e10def1SPeter Tribble zoneIndex++) {
32715c51f124SMoriah Waterland
32725c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
32735c51f124SMoriah Waterland if (zst != ZONE_STATE_RUNNING && zst != ZONE_STATE_MOUNTED) {
32745c51f124SMoriah Waterland zonesSkipped++;
32755c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE, zoneName);
32765c51f124SMoriah Waterland continue;
32775c51f124SMoriah Waterland }
32785c51f124SMoriah Waterland
32796e1ae2a3SGary Pennington pkginstall_check_in_one_zone(zoneName, a_idsName,
32806e1ae2a3SGary Pennington a_zoneAdminFile, a_zoneTempDir, a_altBinDir,
328162224350SCasper H.S. Dik z_zlist_get_scratch(a_zlst, zoneIndex), zst, B_FALSE);
32825c51f124SMoriah Waterland }
32835c51f124SMoriah Waterland
32845c51f124SMoriah Waterland return (zonesSkipped);
32855c51f124SMoriah Waterland }
32865c51f124SMoriah Waterland
32875c51f124SMoriah Waterland /*
32885c51f124SMoriah Waterland * Name: boot_and_pkginstall_check_in_zones
32895c51f124SMoriah Waterland * Description: Check installation of a single package in the zones that
32905c51f124SMoriah Waterland * are NOT running from a list of zones - each zone is booted,
32915c51f124SMoriah Waterland * the package installation is checked, and the zone is halted.
32925c51f124SMoriah Waterland * Arguments: a_zlst - list of zones to install the package into
32935c51f124SMoriah Waterland * a_idsName - pointer to string representing the data stream
32945c51f124SMoriah Waterland * device (input data stream) containing the package to
32955c51f124SMoriah Waterland * be check installed.
32965c51f124SMoriah Waterland * If this is == NULL the package is assumed to be
32975c51f124SMoriah Waterland * spooled in the zone temporary directory.
32985c51f124SMoriah Waterland * a_altBinDir - pointer to string representing an alternative
32995c51f124SMoriah Waterland * binary location directory to pass to pkginstall.
33005c51f124SMoriah Waterland * If this is == NULL no alternative binary location is
33015c51f124SMoriah Waterland * passed to pkginstall.
33025c51f124SMoriah Waterland * a_zoneAdminFile - pointer to string representing the admin
33035c51f124SMoriah Waterland * file to pass to pkginstall when check installing the
33045c51f124SMoriah Waterland * package.
33055c51f124SMoriah Waterland * If this is == NULL no admin file is given to pkginstall.
33065c51f124SMoriah Waterland * a_zoneTempDir - pointer to string representing the temporary
33075c51f124SMoriah Waterland * directory in which spooled packages can be found if
33085c51f124SMoriah Waterland * a_idsName is == NULL.
33095c51f124SMoriah Waterland */
33105c51f124SMoriah Waterland
33115c51f124SMoriah Waterland static int
boot_and_pkginstall_check_in_zones(zoneList_t a_zlst,char * a_idsName,char * a_altBinDir,char * a_zoneAdminFile,char * a_zoneTempDir)33125c51f124SMoriah Waterland boot_and_pkginstall_check_in_zones(zoneList_t a_zlst, char *a_idsName,
33132e10def1SPeter Tribble char *a_altBinDir, char *a_zoneAdminFile, char *a_zoneTempDir)
33145c51f124SMoriah Waterland {
33155c51f124SMoriah Waterland int zoneIndex;
33165c51f124SMoriah Waterland int zonesSkipped = 0;
33175c51f124SMoriah Waterland char *zoneName;
33185c51f124SMoriah Waterland boolean_t b;
33195c51f124SMoriah Waterland zone_state_t zst;
33205c51f124SMoriah Waterland
33215c51f124SMoriah Waterland /* entry assertions */
33225c51f124SMoriah Waterland
33235c51f124SMoriah Waterland assert(a_zlst != (zoneList_t)NULL);
33245c51f124SMoriah Waterland
33255c51f124SMoriah Waterland /* entry debugging info */
33265c51f124SMoriah Waterland
33275c51f124SMoriah Waterland echoDebug(DBG_BOOTCHECKINSTALLINZONES_ENTRY);
33285c51f124SMoriah Waterland echoDebug(DBG_BOOTCHECKINSTALLINZONES_ARGS, PSTR(a_idsName),
33292e10def1SPeter Tribble PSTR(a_zoneAdminFile), PSTR(a_zoneTempDir));
33305c51f124SMoriah Waterland
33315c51f124SMoriah Waterland /* process each zone in the list */
33325c51f124SMoriah Waterland
33335c51f124SMoriah Waterland for (zoneIndex = 0;
33342e10def1SPeter Tribble (zoneName = z_zlist_get_zonename(a_zlst, zoneIndex)) != NULL;
33352e10def1SPeter Tribble zoneIndex++) {
33365c51f124SMoriah Waterland
33375c51f124SMoriah Waterland /* skip the zone if it IS running */
33385c51f124SMoriah Waterland
33395c51f124SMoriah Waterland zst = z_zlist_get_current_state(a_zlst, zoneIndex);
33405c51f124SMoriah Waterland if (zst == ZONE_STATE_RUNNING || zst == ZONE_STATE_MOUNTED) {
33415c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_BOOT, zoneName);
33425c51f124SMoriah Waterland continue;
33435c51f124SMoriah Waterland }
33445c51f124SMoriah Waterland
33455c51f124SMoriah Waterland /* skip the zone if it is NOT bootable */
33465c51f124SMoriah Waterland
33475c51f124SMoriah Waterland if (z_zlist_is_zone_runnable(a_zlst, zoneIndex) == B_FALSE) {
33485c51f124SMoriah Waterland echo(MSG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
33495c51f124SMoriah Waterland echoDebug(DBG_SKIPPING_ZONE_NOT_RUNNABLE, zoneName);
33505c51f124SMoriah Waterland continue;
33515c51f124SMoriah Waterland }
33525c51f124SMoriah Waterland
33535c51f124SMoriah Waterland /* mount up the zone */
33545c51f124SMoriah Waterland
33555c51f124SMoriah Waterland echo(MSG_BOOTING_ZONE, zoneName);
33565c51f124SMoriah Waterland echoDebug(DBG_BOOTING_ZONE, zoneName);
33575c51f124SMoriah Waterland
33585c51f124SMoriah Waterland b = z_zlist_change_zone_state(a_zlst, zoneIndex,
33595c51f124SMoriah Waterland ZONE_STATE_MOUNTED);
33605c51f124SMoriah Waterland if (b == B_FALSE) {
33615c51f124SMoriah Waterland progerr(ERR_CANNOT_BOOT_ZONE, zoneName);
33625c51f124SMoriah Waterland /* set fatal error return condition */
33635c51f124SMoriah Waterland ckreturn(1);
33645c51f124SMoriah Waterland zonesSkipped++;
33655c51f124SMoriah Waterland continue;
33665c51f124SMoriah Waterland }
33675c51f124SMoriah Waterland
33685c51f124SMoriah Waterland /* pre-installation check of the package in this zone */
33695c51f124SMoriah Waterland
33706e1ae2a3SGary Pennington pkginstall_check_in_one_zone(zoneName, a_idsName,
33716e1ae2a3SGary Pennington a_zoneAdminFile, a_zoneTempDir, a_altBinDir,
33725c51f124SMoriah Waterland z_zlist_get_scratch(a_zlst, zoneIndex),
337362224350SCasper H.S. Dik ZONE_STATE_MOUNTED, B_TRUE);
33745c51f124SMoriah Waterland
33755c51f124SMoriah Waterland /* restore original state of zone */
33765c51f124SMoriah Waterland
33775c51f124SMoriah Waterland echo(MSG_RESTORE_ZONE_STATE, zoneName);
33785c51f124SMoriah Waterland echoDebug(DBG_RESTORE_ZONE_STATE, zoneName);
33795c51f124SMoriah Waterland
33805c51f124SMoriah Waterland b = z_zlist_restore_zone_state(a_zlst, zoneIndex);
33815c51f124SMoriah Waterland }
33825c51f124SMoriah Waterland
33835c51f124SMoriah Waterland return (zonesSkipped);
33845c51f124SMoriah Waterland }
33855c51f124SMoriah Waterland
33865c51f124SMoriah Waterland /*
33875c51f124SMoriah Waterland * Function: add_packages_in_global_with_zones
33885c51f124SMoriah Waterland * Description: call this function to add a list of packages in the global zone
33895c51f124SMoriah Waterland * when one or more non-global zones exist
33905c51f124SMoriah Waterland * returns:
33915c51f124SMoriah Waterland * B_TRUE to process next data stream
33925c51f124SMoriah Waterland * B_FALSE to exit
33935c51f124SMoriah Waterland */
33945c51f124SMoriah Waterland
33955c51f124SMoriah Waterland static boolean_t
add_packages_in_global_with_zones(char ** a_pkgList,char * a_idsName,int a_repeat,char * a_altBinDir,char * a_device,zoneList_t a_zlst)339632991bedSPeter Tribble add_packages_in_global_with_zones(char **a_pkgList,
33972e10def1SPeter Tribble char *a_idsName, int a_repeat, char *a_altBinDir,
33982e10def1SPeter Tribble char *a_device, zoneList_t a_zlst)
33995c51f124SMoriah Waterland {
34005c51f124SMoriah Waterland static char *zoneTempDir = (char *)NULL;
34015c51f124SMoriah Waterland static char *zoneAdminFile = (char *)NULL;
34025c51f124SMoriah Waterland
34035c51f124SMoriah Waterland boolean_t b;
34045c51f124SMoriah Waterland char *packageDir;
34055c51f124SMoriah Waterland char instdir[PATH_MAX];
34065c51f124SMoriah Waterland char respfile_path[PATH_MAX];
34075c51f124SMoriah Waterland char zoneStreamName[PATH_MAX] = {'\0'};
34085c51f124SMoriah Waterland int i;
34095c51f124SMoriah Waterland int n;
34105c51f124SMoriah Waterland int savenpkgs = npkgs;
34115c51f124SMoriah Waterland int zonesSkipped;
34125c51f124SMoriah Waterland boolean_t globalPresent;
34135c51f124SMoriah Waterland
34145c51f124SMoriah Waterland /* entry assertions */
34155c51f124SMoriah Waterland
34165c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
34175c51f124SMoriah Waterland assert(a_zlst != (zoneList_t)NULL);
34185c51f124SMoriah Waterland
34195c51f124SMoriah Waterland echoDebug(DBG_ADDPACKAGES_GZ_W_LZ_ENTRY);
342032991bedSPeter Tribble echoDebug(DBG_ADDPACKAGES_GZ_W_LZ_ARGS, npkgs,
34212e10def1SPeter Tribble PSTR(a_idsName), a_repeat, PSTR(a_device));
34225c51f124SMoriah Waterland
34235c51f124SMoriah Waterland /* create temporary directory for use by zone operations */
34245c51f124SMoriah Waterland
34255c51f124SMoriah Waterland create_zone_tempdir(&zoneTempDir, tmpdir);
34265c51f124SMoriah Waterland
34275c51f124SMoriah Waterland /* create hands off settings admin file for use in a non-global zone */
34285c51f124SMoriah Waterland
34295c51f124SMoriah Waterland create_zone_adminfile(&zoneAdminFile, zoneTempDir, admnfile);
34305c51f124SMoriah Waterland
34315c51f124SMoriah Waterland /* determine directory where packages can be found */
34325c51f124SMoriah Waterland
34335c51f124SMoriah Waterland if (a_idsName == (char *)NULL) {
34345c51f124SMoriah Waterland /* no stream - directory containing packages provided */
34355c51f124SMoriah Waterland packageDir = pkgdev.dirname;
34365c51f124SMoriah Waterland } else {
34375c51f124SMoriah Waterland packageDir = zoneTempDir;
34385c51f124SMoriah Waterland }
34395c51f124SMoriah Waterland
34405c51f124SMoriah Waterland /* unpack and check all packages */
34415c51f124SMoriah Waterland
34425c51f124SMoriah Waterland b = unpack_and_check_packages(a_pkgList, a_idsName, packageDir);
34435c51f124SMoriah Waterland if (b != B_TRUE) {
34445c51f124SMoriah Waterland quit(1);
34455c51f124SMoriah Waterland }
34465c51f124SMoriah Waterland
34475c51f124SMoriah Waterland /*
34485c51f124SMoriah Waterland * if the packages are contained in a directory, convert the
34495c51f124SMoriah Waterland * packages into individual streams because pkgZoneInstall is only able
34505c51f124SMoriah Waterland * to pass a stream to the non-global zone's pkginstall command.
34515c51f124SMoriah Waterland * After this code is executed:
34525c51f124SMoriah Waterland * if the original input was a datastream:
34535c51f124SMoriah Waterland * -> that datastream has been unpacked into "instdir"
34545c51f124SMoriah Waterland * if the original input was a directory with packages in it:
34555c51f124SMoriah Waterland * -> those packages have been placed into a single datastream
34565c51f124SMoriah Waterland */
34575c51f124SMoriah Waterland
34585c51f124SMoriah Waterland if (a_idsName == (char *)NULL) {
34595c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
34605c51f124SMoriah Waterland char *pkgs[2];
34615c51f124SMoriah Waterland
34625c51f124SMoriah Waterland /* package is not a stream - create one */
34635c51f124SMoriah Waterland
34645c51f124SMoriah Waterland (void) snprintf(zoneStreamName, sizeof (zoneStreamName),
34652e10def1SPeter Tribble "%s/%s.dstream", zoneTempDir, pkginst);
34665c51f124SMoriah Waterland
34675c51f124SMoriah Waterland echoDebug(DBG_CONVERTING_PKG, packageDir, pkginst,
34682e10def1SPeter Tribble zoneStreamName);
34695c51f124SMoriah Waterland
34705c51f124SMoriah Waterland /* set up list of packages to be this package only */
34715c51f124SMoriah Waterland
34725c51f124SMoriah Waterland pkgs[0] = pkginst;
34735c51f124SMoriah Waterland pkgs[1] = (char *)NULL;
34745c51f124SMoriah Waterland
34755c51f124SMoriah Waterland n = pkgtrans(packageDir, zoneStreamName, pkgs,
34762e10def1SPeter Tribble PT_SILENT|PT_ODTSTREAM);
34775c51f124SMoriah Waterland if (n != 0) {
34785c51f124SMoriah Waterland progerr(ERR_CANNOT_CONVERT_PKGSTRM,
34792e10def1SPeter Tribble pkginst, packageDir, zoneStreamName);
34805c51f124SMoriah Waterland quit(1);
34815c51f124SMoriah Waterland }
34825c51f124SMoriah Waterland npkgs--;
34835c51f124SMoriah Waterland }
34845c51f124SMoriah Waterland npkgs = savenpkgs;
34855c51f124SMoriah Waterland }
34865c51f124SMoriah Waterland
34875c51f124SMoriah Waterland /*
34885c51f124SMoriah Waterland * Phase I - run collect dependency information for all packages for all
34895c51f124SMoriah Waterland * zones - this involves running pkginstall with the "preinstallcheck"
34905c51f124SMoriah Waterland * option which causes all dependency checks to be performed without
34915c51f124SMoriah Waterland * actually doing the installation of the packages. This information is
34925c51f124SMoriah Waterland * gathered in the zone temporary directory and is used later to present
34935c51f124SMoriah Waterland * the dependency check results to the system administrator depending
34945c51f124SMoriah Waterland * on the administration settings.
34955c51f124SMoriah Waterland */
34965c51f124SMoriah Waterland
34975c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
34985c51f124SMoriah Waterland
34995c51f124SMoriah Waterland /* reset interrupted flag before calling pkginstall */
35005c51f124SMoriah Waterland
35015c51f124SMoriah Waterland interrupted = 0; /* last action was NOT quit */
35025c51f124SMoriah Waterland
35035c51f124SMoriah Waterland /*
35045c51f124SMoriah Waterland * if this package is marked "install in this zone only", then
35055c51f124SMoriah Waterland * do not check dependencies in any other zone
35065c51f124SMoriah Waterland */
35075c51f124SMoriah Waterland
35085c51f124SMoriah Waterland if (pkgPackageIsThisZone(pkginst) == B_TRUE) {
35095c51f124SMoriah Waterland echoDebug(DBG_VERIFY_SKIP_THISZONE, pkginst);
35105c51f124SMoriah Waterland npkgs--;
35115c51f124SMoriah Waterland continue;
35125c51f124SMoriah Waterland }
35135c51f124SMoriah Waterland
35145c51f124SMoriah Waterland /*
35155c51f124SMoriah Waterland * if operation failed in global zone do not propagate
35165c51f124SMoriah Waterland * to any non-global zones
35175c51f124SMoriah Waterland */
35185c51f124SMoriah Waterland
35195c51f124SMoriah Waterland if (interrupted != 0) {
35205c51f124SMoriah Waterland echo(MSG_CHECKINSTALL_INTERRUPT_B4_Z, pkginst);
35215c51f124SMoriah Waterland echoDebug(MSG_CHECKINSTALL_INTERRUPT_B4_Z, pkginst);
35225c51f124SMoriah Waterland break;
35235c51f124SMoriah Waterland }
35245c51f124SMoriah Waterland
35255c51f124SMoriah Waterland echoDebug(DBG_INSTALL_FLAG_VALUES, "after pkginstall",
35262e10def1SPeter Tribble admnflag, doreboot, failflag, interrupted, intrflag,
35272e10def1SPeter Tribble ireboot, needconsult, nullflag, warnflag);
35285c51f124SMoriah Waterland
35295c51f124SMoriah Waterland /*
35305c51f124SMoriah Waterland * call pkginstall to verify this package for all non-global
35315c51f124SMoriah Waterland * zones that are currently booted
35325c51f124SMoriah Waterland */
35335c51f124SMoriah Waterland
35345c51f124SMoriah Waterland zonesSkipped = pkginstall_check_in_zones(a_zlst, a_idsName,
35352e10def1SPeter Tribble a_altBinDir, admnfile, zoneTempDir);
35365c51f124SMoriah Waterland
35375c51f124SMoriah Waterland /*
35385c51f124SMoriah Waterland * if any zones were skipped (becuase they are not currently
35395c51f124SMoriah Waterland * booted), boot each zone one at a time and call pkginstall
35405c51f124SMoriah Waterland * to verify this package for each such non-global zone
35415c51f124SMoriah Waterland */
35425c51f124SMoriah Waterland
35435c51f124SMoriah Waterland if (zonesSkipped > 0) {
35445c51f124SMoriah Waterland echoDebug(DBG_ZONES_SKIPPED, zonesSkipped);
35455c51f124SMoriah Waterland
35465c51f124SMoriah Waterland zonesSkipped =
35472e10def1SPeter Tribble boot_and_pkginstall_check_in_zones(a_zlst,
35482e10def1SPeter Tribble a_idsName, a_altBinDir, admnfile,
35492e10def1SPeter Tribble zoneTempDir);
35505c51f124SMoriah Waterland
35515c51f124SMoriah Waterland if (zonesSkipped > 0) {
35525c51f124SMoriah Waterland progerr(ERR_INSTALL_ZONES_SKIPPED,
35532e10def1SPeter Tribble zonesSkipped);
35545c51f124SMoriah Waterland }
35555c51f124SMoriah Waterland }
35565c51f124SMoriah Waterland
35575c51f124SMoriah Waterland npkgs--;
35585c51f124SMoriah Waterland }
35595c51f124SMoriah Waterland
35605c51f124SMoriah Waterland /*
35615c51f124SMoriah Waterland * At this point, all of the dependency information has been gathered
35625c51f124SMoriah Waterland * and is ready to be analyzed. This function processes all of that
35635c51f124SMoriah Waterland * dependency information and presents the results to the system
35645c51f124SMoriah Waterland * administrator, depending on the current administration settings.
35655c51f124SMoriah Waterland */
35665c51f124SMoriah Waterland
35675c51f124SMoriah Waterland i = preinstall_verify(a_pkgList, a_zlst, zoneTempDir);
35685c51f124SMoriah Waterland if (i != 0) {
35695c51f124SMoriah Waterland /* dependency checks failed - exit */
35705c51f124SMoriah Waterland quit(i);
35715c51f124SMoriah Waterland }
35725c51f124SMoriah Waterland
35735c51f124SMoriah Waterland npkgs = savenpkgs;
35745c51f124SMoriah Waterland
35755c51f124SMoriah Waterland /*
35765c51f124SMoriah Waterland * reset all error return condition variables that may have been
35775c51f124SMoriah Waterland * set during package installation dependency checking so that they
35785c51f124SMoriah Waterland * do not reflect on the success/failure of the actual package
35795c51f124SMoriah Waterland * installation operations
35805c51f124SMoriah Waterland */
35815c51f124SMoriah Waterland
35825c51f124SMoriah Waterland resetreturn();
35835c51f124SMoriah Waterland
35845c51f124SMoriah Waterland /*
35855c51f124SMoriah Waterland * At this point, all of the dependency checking is completed, and
35865c51f124SMoriah Waterland * the installation of the packages can proceed. Install each package
35875c51f124SMoriah Waterland * one at a time, starting with the global zone, and the for each
35885c51f124SMoriah Waterland * non-global zone that is booted, and then for each non-global zone
35895c51f124SMoriah Waterland * that is not currently booted.
35905c51f124SMoriah Waterland */
35915c51f124SMoriah Waterland
35925c51f124SMoriah Waterland globalPresent = z_on_zone_spec(GLOBAL_ZONENAME);
35935c51f124SMoriah Waterland
35945c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
35955c51f124SMoriah Waterland /*
35965c51f124SMoriah Waterland * if immediate reboot required from last package and this is
35975c51f124SMoriah Waterland * not 'pkgask' then suspend installation of remaining packages
35985c51f124SMoriah Waterland */
35995c51f124SMoriah Waterland
36005c51f124SMoriah Waterland if ((ireboot != 0) && (askflag == 0)) {
36015c51f124SMoriah Waterland ptext(stderr, MSG_SUSPEND_ADD, pkginst);
36025c51f124SMoriah Waterland continue;
36035c51f124SMoriah Waterland }
36045c51f124SMoriah Waterland
36055c51f124SMoriah Waterland /*
36065c51f124SMoriah Waterland * handle interrupt if the previous pkginstall was interrupted
36075c51f124SMoriah Waterland */
36085c51f124SMoriah Waterland
36095c51f124SMoriah Waterland if (continue_installation() == B_FALSE) {
36105c51f124SMoriah Waterland return (B_FALSE);
36115c51f124SMoriah Waterland }
36125c51f124SMoriah Waterland
36135c51f124SMoriah Waterland /*
36145c51f124SMoriah Waterland * if pkgask, handle response file creation:
36155c51f124SMoriah Waterland * - if the response file is a directory, then create a path to
36165c51f124SMoriah Waterland * -- a package instance within the response file directory.
36175c51f124SMoriah Waterland * - If the response file is NOT a directory, if more than one
36185c51f124SMoriah Waterland * -- package is to be installed.
36195c51f124SMoriah Waterland */
36205c51f124SMoriah Waterland
36215c51f124SMoriah Waterland if ((askflag != 0) && (respdir != (char *)NULL)) {
36225c51f124SMoriah Waterland (void) snprintf(respfile_path, sizeof (respfile_path),
36232e10def1SPeter Tribble "%s/%s", respdir, pkginst);
36245c51f124SMoriah Waterland respfile = respfile_path;
36255c51f124SMoriah Waterland }
36265c51f124SMoriah Waterland
362732991bedSPeter Tribble echo(MSG_PROC_INST, pkginst, a_device);
36285c51f124SMoriah Waterland
36295c51f124SMoriah Waterland /*
36305c51f124SMoriah Waterland * If we're installing another package in the same
36315c51f124SMoriah Waterland * session, the second through nth pkginstall, must
36325c51f124SMoriah Waterland * continue from where the prior one left off. For this
36335c51f124SMoriah Waterland * reason, the continuation feature (implied by the
36345c51f124SMoriah Waterland * nature of the command) is used for the remaining
36355c51f124SMoriah Waterland * packages.
36365c51f124SMoriah Waterland */
36375c51f124SMoriah Waterland
36385c51f124SMoriah Waterland if ((i == 1) && (pkgdrtarg != (char *)NULL)) {
36395c51f124SMoriah Waterland pkgcontsrc = pkgdrtarg;
36405c51f124SMoriah Waterland }
36415c51f124SMoriah Waterland
36425c51f124SMoriah Waterland if (globalPresent) {
36435c51f124SMoriah Waterland /*
36445c51f124SMoriah Waterland * call pkginstall for this package for the global zone
36455c51f124SMoriah Waterland */
36465c51f124SMoriah Waterland
36475c51f124SMoriah Waterland echo(MSG_INSTALLING_PKG_IN_GZ, pkginst);
36485c51f124SMoriah Waterland
36495c51f124SMoriah Waterland /* reset interrupted flag before calling pkginstall */
36505c51f124SMoriah Waterland
36515c51f124SMoriah Waterland interrupted = 0; /* last action was NOT quit */
36525c51f124SMoriah Waterland
36535c51f124SMoriah Waterland n = pkgInstall(get_inst_root(), NULL, packageDir,
36546e1ae2a3SGary Pennington a_altBinDir);
36555c51f124SMoriah Waterland
36565c51f124SMoriah Waterland /* set success/fail condition variables */
36575c51f124SMoriah Waterland
36585c51f124SMoriah Waterland ckreturn(n);
36595c51f124SMoriah Waterland
36605c51f124SMoriah Waterland /*
36615c51f124SMoriah Waterland * if operation failed in global zone do not propagate
36625c51f124SMoriah Waterland * to any non-global zones
36635c51f124SMoriah Waterland */
36645c51f124SMoriah Waterland
36655c51f124SMoriah Waterland if (interrupted != 0) {
36665c51f124SMoriah Waterland echo(MSG_INSTALL_INTERRUPT_B4_ZONES, pkginst);
36675c51f124SMoriah Waterland echoDebug(MSG_INSTALL_INTERRUPT_B4_ZONES,
36685c51f124SMoriah Waterland pkginst);
36695c51f124SMoriah Waterland break;
36705c51f124SMoriah Waterland }
36715c51f124SMoriah Waterland }
36725c51f124SMoriah Waterland
36735c51f124SMoriah Waterland /*
36745c51f124SMoriah Waterland * if this package is marked "install in this zone only",
36755c51f124SMoriah Waterland * then only need to install the package in the global zone;
36765c51f124SMoriah Waterland * skip installation in any non-global zones.
36775c51f124SMoriah Waterland */
36785c51f124SMoriah Waterland
36795c51f124SMoriah Waterland if (pkgPackageIsThisZone(pkginst) == B_TRUE) {
36805c51f124SMoriah Waterland echoDebug(DBG_INSTALL_SKIP_THISZONE, pkginst);
36815c51f124SMoriah Waterland npkgs--;
36825c51f124SMoriah Waterland continue;
36835c51f124SMoriah Waterland }
36845c51f124SMoriah Waterland
36855c51f124SMoriah Waterland echoDebug(DBG_INSTALL_FLAG_VALUES, "install in running zones",
36862e10def1SPeter Tribble admnflag, doreboot, failflag, interrupted, intrflag,
36872e10def1SPeter Tribble ireboot, needconsult, nullflag, warnflag);
36885c51f124SMoriah Waterland
36895c51f124SMoriah Waterland /* install package in currently booted zones */
36905c51f124SMoriah Waterland
36915c51f124SMoriah Waterland zonesSkipped = install_in_zones(a_zlst, a_idsName, a_altBinDir,
36922e10def1SPeter Tribble zoneAdminFile, zoneTempDir);
36935c51f124SMoriah Waterland
36945c51f124SMoriah Waterland /* install package in zones that are not currently booted */
36955c51f124SMoriah Waterland
36965c51f124SMoriah Waterland if (zonesSkipped > 0) {
36975c51f124SMoriah Waterland echoDebug(DBG_ZONES_SKIPPED, zonesSkipped);
36985c51f124SMoriah Waterland
36995c51f124SMoriah Waterland zonesSkipped = boot_and_install_in_zones(a_zlst,
37002e10def1SPeter Tribble a_idsName, a_altBinDir, zoneAdminFile,
37012e10def1SPeter Tribble zoneTempDir);
37025c51f124SMoriah Waterland
37035c51f124SMoriah Waterland if (zonesSkipped > 0) {
37045c51f124SMoriah Waterland progerr(ERR_INSTALL_ZONES_SKIPPED,
37052e10def1SPeter Tribble zonesSkipped);
37065c51f124SMoriah Waterland }
37075c51f124SMoriah Waterland }
37085c51f124SMoriah Waterland
37095c51f124SMoriah Waterland /*
37105c51f124SMoriah Waterland * package completely installed - remove any temporary stream
37115c51f124SMoriah Waterland * of the package that might have been created
37125c51f124SMoriah Waterland */
37135c51f124SMoriah Waterland
37145c51f124SMoriah Waterland if (a_idsName == (char *)NULL) {
37155c51f124SMoriah Waterland /* locate temporary stream created earlier */
37165c51f124SMoriah Waterland (void) snprintf(zoneStreamName, sizeof (zoneStreamName),
37172e10def1SPeter Tribble "%s/%s.dstream", zoneTempDir, pkginst);
37185c51f124SMoriah Waterland /* remove stream - no longer needed */
37195c51f124SMoriah Waterland echoDebug(DBG_REMOVING_DSTREAM_PKGDIR, zoneStreamName,
37202e10def1SPeter Tribble pkginst);
37215c51f124SMoriah Waterland (void) remove(zoneStreamName);
37225c51f124SMoriah Waterland } else {
37235c51f124SMoriah Waterland /* remove package - no longer needed */
37245c51f124SMoriah Waterland if (snprintf(instdir, sizeof (instdir), "%s/%s",
37252e10def1SPeter Tribble zoneTempDir, pkginst) >= PATH_MAX) {
37265c51f124SMoriah Waterland progerr(ERR_CANNOT_CREATE_PKGPATH, tmpdir);
37275c51f124SMoriah Waterland quit(1);
37285c51f124SMoriah Waterland }
37295c51f124SMoriah Waterland echoDebug(DBG_REMOVING_PKG_TMPDIR, instdir, pkginst);
37305c51f124SMoriah Waterland (void) remove(instdir);
37315c51f124SMoriah Waterland }
37325c51f124SMoriah Waterland
37335c51f124SMoriah Waterland /* decrement number of packages left to install */
37345c51f124SMoriah Waterland
37355c51f124SMoriah Waterland npkgs--;
37365c51f124SMoriah Waterland
37375c51f124SMoriah Waterland /*
37385c51f124SMoriah Waterland * if no packages left to install, unmount package source
37395c51f124SMoriah Waterland * device if appropriate
37405c51f124SMoriah Waterland */
37415c51f124SMoriah Waterland
37425c51f124SMoriah Waterland if ((npkgs <= 0) && (pkgdev.mount || a_idsName)) {
37435c51f124SMoriah Waterland (void) chdir("/");
37445c51f124SMoriah Waterland if (!a_idsName) {
37455c51f124SMoriah Waterland echoDebug(DBG_UNMOUNTING_DEV,
37462e10def1SPeter Tribble PSTR(pkgdev.mount));
37475c51f124SMoriah Waterland (void) pkgumount(&pkgdev);
37485c51f124SMoriah Waterland }
37495c51f124SMoriah Waterland }
37505c51f124SMoriah Waterland }
37515c51f124SMoriah Waterland
37525c51f124SMoriah Waterland /*
37535c51f124SMoriah Waterland * all packages in the package list have been installed.
37545c51f124SMoriah Waterland * Continue with installation if:
37555c51f124SMoriah Waterland * -- immediate reboot is NOT required
37565c51f124SMoriah Waterland * -- there are more packages to install
37575c51f124SMoriah Waterland * -- the package source is a path to a file
37585c51f124SMoriah Waterland * else return do NOT continue.
37595c51f124SMoriah Waterland */
37605c51f124SMoriah Waterland
37615c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0) &&
37622e10def1SPeter Tribble (pkgdev.pathname == (char *)NULL)) {
37635c51f124SMoriah Waterland return (B_TRUE);
37645c51f124SMoriah Waterland }
37655c51f124SMoriah Waterland
37665c51f124SMoriah Waterland /* return 'dont continue' */
37675c51f124SMoriah Waterland
37685c51f124SMoriah Waterland return (B_FALSE);
37695c51f124SMoriah Waterland }
37705c51f124SMoriah Waterland
37715c51f124SMoriah Waterland /*
37725c51f124SMoriah Waterland * Function: add_packages_in_nonglobal_zone
37735c51f124SMoriah Waterland * Description: call this function to add a list of packages in a non-global
37745c51f124SMoriah Waterland * zone
37755c51f124SMoriah Waterland * returns:
37765c51f124SMoriah Waterland * B_TRUE to process next data stream
37775c51f124SMoriah Waterland * B_FALSE to exit
37785c51f124SMoriah Waterland */
37795c51f124SMoriah Waterland
37805c51f124SMoriah Waterland static boolean_t
add_packages_in_nonglobal_zone(char ** a_pkgList,char * a_idsName,int a_repeat,char * a_altBinDir,char * a_device)378132991bedSPeter Tribble add_packages_in_nonglobal_zone(char **a_pkgList,
37822e10def1SPeter Tribble char *a_idsName, int a_repeat, char *a_altBinDir, char *a_device)
37835c51f124SMoriah Waterland {
37845c51f124SMoriah Waterland static char *zoneTempDir = (char *)NULL;
37855c51f124SMoriah Waterland
37865c51f124SMoriah Waterland char *packageDir;
37875c51f124SMoriah Waterland char respfile_path[PATH_MAX];
37885c51f124SMoriah Waterland int i;
37895c51f124SMoriah Waterland int n;
37905c51f124SMoriah Waterland boolean_t b;
37915c51f124SMoriah Waterland int savenpkgs = npkgs;
37925c51f124SMoriah Waterland
37935c51f124SMoriah Waterland /* entry assertions */
37945c51f124SMoriah Waterland
37955c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
37965c51f124SMoriah Waterland
37975c51f124SMoriah Waterland /* entry debugging info */
37985c51f124SMoriah Waterland
37995c51f124SMoriah Waterland echoDebug(DBG_ADDPACKAGES_LZ_ENTRY);
380032991bedSPeter Tribble echoDebug(DBG_ADDPACKAGES_LZ_ARGS, npkgs, PSTR(a_idsName),
38012e10def1SPeter Tribble a_repeat, PSTR(a_device));
38025c51f124SMoriah Waterland
38035c51f124SMoriah Waterland /* create temporary directory for use by zone operations */
38045c51f124SMoriah Waterland
38055c51f124SMoriah Waterland create_zone_tempdir(&zoneTempDir, tmpdir);
38065c51f124SMoriah Waterland
38075c51f124SMoriah Waterland /*
38085c51f124SMoriah Waterland * package can be in a number of formats:
38095c51f124SMoriah Waterland * - file containing package stream (pkgadd -d file [pkgs])
38105c51f124SMoriah Waterland * - directory containing packages (pkgadd -d /dir [pkgs])
38115c51f124SMoriah Waterland * - device containing packages (pkgadd -d diskette1 [pkgs])
38125c51f124SMoriah Waterland * non-global zones can be passed open file drescriptors and
38135c51f124SMoriah Waterland * strings as arguments
38145c51f124SMoriah Waterland * - for file containing package stream
38155c51f124SMoriah Waterland * -- the stream can be passed directly to the non-global zone
38165c51f124SMoriah Waterland * - for directory
38175c51f124SMoriah Waterland * -- convert packages to datastream to pass to the non-global zone
38185c51f124SMoriah Waterland * - for device
38195c51f124SMoriah Waterland */
38205c51f124SMoriah Waterland
38215c51f124SMoriah Waterland /* determine directory where packages can be found */
38225c51f124SMoriah Waterland
38235c51f124SMoriah Waterland if (a_idsName == (char *)NULL) {
38245c51f124SMoriah Waterland /* no stream - directory containing packages provided */
38255c51f124SMoriah Waterland packageDir = pkgdev.dirname;
38265c51f124SMoriah Waterland } else {
38275c51f124SMoriah Waterland packageDir = zoneTempDir;
38285c51f124SMoriah Waterland }
38295c51f124SMoriah Waterland
38305c51f124SMoriah Waterland b = unpack_and_check_packages(a_pkgList, a_idsName, packageDir);
38315c51f124SMoriah Waterland if (b != B_TRUE) {
38325c51f124SMoriah Waterland quit(1);
38335c51f124SMoriah Waterland }
38345c51f124SMoriah Waterland
38355c51f124SMoriah Waterland /*
38365c51f124SMoriah Waterland * this is the main loop where all of the packages (as listed in the
38375c51f124SMoriah Waterland * package list) are added one at a time.
38385c51f124SMoriah Waterland */
38395c51f124SMoriah Waterland
38405c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
38415c51f124SMoriah Waterland npkgs--;
38425c51f124SMoriah Waterland }
38435c51f124SMoriah Waterland
38445c51f124SMoriah Waterland npkgs = savenpkgs;
38455c51f124SMoriah Waterland
38465c51f124SMoriah Waterland /*
38475c51f124SMoriah Waterland * this is the main loop where all of the packages (as listed in the
38485c51f124SMoriah Waterland * package list) are added one at a time.
38495c51f124SMoriah Waterland */
38505c51f124SMoriah Waterland
38515c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
38525c51f124SMoriah Waterland /*
38535c51f124SMoriah Waterland * if immediate reboot required from last package and this is
38545c51f124SMoriah Waterland * not 'pkgask' then suspend installation of remaining packages
38555c51f124SMoriah Waterland */
38565c51f124SMoriah Waterland
38575c51f124SMoriah Waterland if ((ireboot != 0) && (askflag == 0)) {
38585c51f124SMoriah Waterland ptext(stderr, MSG_SUSPEND_ADD, pkginst);
38595c51f124SMoriah Waterland continue;
38605c51f124SMoriah Waterland }
38615c51f124SMoriah Waterland
38625c51f124SMoriah Waterland /*
38635c51f124SMoriah Waterland * handle interrupt if the previous pkginstall was interrupted
38645c51f124SMoriah Waterland */
38655c51f124SMoriah Waterland
38665c51f124SMoriah Waterland if (continue_installation() == B_FALSE) {
38675c51f124SMoriah Waterland return (B_FALSE);
38685c51f124SMoriah Waterland }
38695c51f124SMoriah Waterland
38705c51f124SMoriah Waterland /*
38715c51f124SMoriah Waterland * if pkgask, handle response file creation:
38725c51f124SMoriah Waterland * - if the response file is a directory, then create a path to
38735c51f124SMoriah Waterland * -- a package instance within the response file directory.
38745c51f124SMoriah Waterland * - If the response file is NOT a directory, if more than one
38755c51f124SMoriah Waterland * -- package is to be installed.
38765c51f124SMoriah Waterland */
38775c51f124SMoriah Waterland
38785c51f124SMoriah Waterland if ((askflag != 0) && (respdir != (char *)NULL)) {
38795c51f124SMoriah Waterland (void) snprintf(respfile_path, sizeof (respfile_path),
38802e10def1SPeter Tribble "%s/%s", respdir, pkginst);
38815c51f124SMoriah Waterland respfile = respfile_path;
38825c51f124SMoriah Waterland }
38835c51f124SMoriah Waterland
388432991bedSPeter Tribble echo(MSG_PROC_INST, pkginst, a_device);
38855c51f124SMoriah Waterland
38865c51f124SMoriah Waterland /*
38875c51f124SMoriah Waterland * If we're installing another package in the same
38885c51f124SMoriah Waterland * session, the second through nth pkginstall, must
38895c51f124SMoriah Waterland * continue from where the prior one left off. For this
38905c51f124SMoriah Waterland * reason, the continuation feature (implied by the
38915c51f124SMoriah Waterland * nature of the command) is used for the remaining
38925c51f124SMoriah Waterland * packages.
38935c51f124SMoriah Waterland */
38945c51f124SMoriah Waterland
38955c51f124SMoriah Waterland if ((i == 1) && (pkgdrtarg != (char *)NULL)) {
38965c51f124SMoriah Waterland pkgcontsrc = pkgdrtarg;
38975c51f124SMoriah Waterland }
38985c51f124SMoriah Waterland
38995c51f124SMoriah Waterland /* reset interrupted flag before calling pkginstall */
39005c51f124SMoriah Waterland
39015c51f124SMoriah Waterland interrupted = 0; /* last action was NOT quit */
39025c51f124SMoriah Waterland
39035c51f124SMoriah Waterland /* call pkginstall for this package */
39045c51f124SMoriah Waterland
39055c51f124SMoriah Waterland n = pkgInstall(get_inst_root(), NULL,
39062e10def1SPeter Tribble packageDir, a_altBinDir);
39075c51f124SMoriah Waterland
39085c51f124SMoriah Waterland /* set success/fail condition variables */
39095c51f124SMoriah Waterland
39105c51f124SMoriah Waterland ckreturn(n);
39115c51f124SMoriah Waterland
39125c51f124SMoriah Waterland /* decrement number of packages left to install */
39135c51f124SMoriah Waterland
39145c51f124SMoriah Waterland npkgs--;
39155c51f124SMoriah Waterland
39165c51f124SMoriah Waterland /*
39175c51f124SMoriah Waterland * if no packages left to install, unmount package source
39185c51f124SMoriah Waterland * device if appropriate
39195c51f124SMoriah Waterland */
39205c51f124SMoriah Waterland
39215c51f124SMoriah Waterland if ((npkgs <= 0) && (pkgdev.mount || a_idsName)) {
39225c51f124SMoriah Waterland (void) chdir("/");
39235c51f124SMoriah Waterland if (!a_idsName) {
39245c51f124SMoriah Waterland (void) pkgumount(&pkgdev);
39255c51f124SMoriah Waterland }
39265c51f124SMoriah Waterland }
39275c51f124SMoriah Waterland }
39285c51f124SMoriah Waterland
39295c51f124SMoriah Waterland /*
39305c51f124SMoriah Waterland * all packages in the package list have been installed.
39315c51f124SMoriah Waterland * Continue with installation if:
39325c51f124SMoriah Waterland * -- immediate reboot is NOT required
39335c51f124SMoriah Waterland * -- there are more packages to install
39345c51f124SMoriah Waterland * -- the package source is a path to a file
39355c51f124SMoriah Waterland * else return do NOT continue.
39365c51f124SMoriah Waterland */
39375c51f124SMoriah Waterland
39385c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0) &&
39392e10def1SPeter Tribble (pkgdev.pathname == (char *)NULL)) {
39405c51f124SMoriah Waterland return (B_TRUE);
39415c51f124SMoriah Waterland }
39425c51f124SMoriah Waterland
39435c51f124SMoriah Waterland /* return 'dont continue' */
39445c51f124SMoriah Waterland
39455c51f124SMoriah Waterland return (B_FALSE);
39465c51f124SMoriah Waterland }
39475c51f124SMoriah Waterland
39485c51f124SMoriah Waterland /*
39495c51f124SMoriah Waterland * Function: add_packages_in_global_no_zones
39505c51f124SMoriah Waterland * Description: call this function to add a list of packages in the global zone
39515c51f124SMoriah Waterland * when no non-global zones exist
39525c51f124SMoriah Waterland * returns:
39535c51f124SMoriah Waterland * B_TRUE to process next data stream
39545c51f124SMoriah Waterland * B_FALSE to exit
39555c51f124SMoriah Waterland */
39565c51f124SMoriah Waterland
39575c51f124SMoriah Waterland static boolean_t
add_packages_in_global_no_zones(char ** a_pkgList,char * a_idsName,int a_repeat,char * a_altBinDir,char * a_device)395832991bedSPeter Tribble add_packages_in_global_no_zones(char **a_pkgList,
39592e10def1SPeter Tribble char *a_idsName, int a_repeat, char *a_altBinDir, char *a_device)
39605c51f124SMoriah Waterland {
39615c51f124SMoriah Waterland int n;
39625c51f124SMoriah Waterland int i;
39635c51f124SMoriah Waterland char respfile_path[PATH_MAX];
39645c51f124SMoriah Waterland CAF_T flags = 0;
39655c51f124SMoriah Waterland
39665c51f124SMoriah Waterland /* entry assertions */
39675c51f124SMoriah Waterland
39685c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
39695c51f124SMoriah Waterland
39705c51f124SMoriah Waterland echoDebug(DBG_ADDPACKAGES_GZ_NO_LZ_ENTRY);
397132991bedSPeter Tribble echoDebug(DBG_ADDPACKAGES_GZ_NO_LZ_ARGS, npkgs,
39722e10def1SPeter Tribble PSTR(a_idsName), a_repeat, PSTR(a_device));
39735c51f124SMoriah Waterland
39745c51f124SMoriah Waterland /*
39755c51f124SMoriah Waterland * set flags for applicability check
39765c51f124SMoriah Waterland */
39775c51f124SMoriah Waterland
39785c51f124SMoriah Waterland /* in the global zone */
39795c51f124SMoriah Waterland
39805c51f124SMoriah Waterland flags |= CAF_IN_GLOBAL_ZONE;
39815c51f124SMoriah Waterland
39825c51f124SMoriah Waterland /* set -G flag */
39835c51f124SMoriah Waterland
39845c51f124SMoriah Waterland if (globalZoneOnly == B_TRUE) {
39855c51f124SMoriah Waterland flags |= CAF_SCOPE_GLOBAL;
39865c51f124SMoriah Waterland }
39875c51f124SMoriah Waterland
39885c51f124SMoriah Waterland /*
39895c51f124SMoriah Waterland * this is the main loop where all of the packages (as listed in the
39905c51f124SMoriah Waterland * package list) are added one at a time.
39915c51f124SMoriah Waterland */
39925c51f124SMoriah Waterland
39935c51f124SMoriah Waterland for (i = 0; (pkginst = a_pkgList[i]) != NULL; i++) {
39945c51f124SMoriah Waterland /*
39955c51f124SMoriah Waterland * if immediate reboot required from last package and this is
39965c51f124SMoriah Waterland * not 'pkgask' then suspend installation of remaining packages
39975c51f124SMoriah Waterland */
39985c51f124SMoriah Waterland
39995c51f124SMoriah Waterland if ((ireboot != 0) && (askflag == 0)) {
40005c51f124SMoriah Waterland ptext(stderr, MSG_SUSPEND_ADD, pkginst);
40015c51f124SMoriah Waterland continue;
40025c51f124SMoriah Waterland }
40035c51f124SMoriah Waterland
40045c51f124SMoriah Waterland /*
40055c51f124SMoriah Waterland * handle interrupt if the previous pkginstall was interrupted
40065c51f124SMoriah Waterland */
40075c51f124SMoriah Waterland
40085c51f124SMoriah Waterland if (continue_installation() == B_FALSE) {
40095c51f124SMoriah Waterland return (B_FALSE);
40105c51f124SMoriah Waterland }
40115c51f124SMoriah Waterland
40125c51f124SMoriah Waterland /*
40135c51f124SMoriah Waterland * check package applicability to install in this context
40145c51f124SMoriah Waterland */
40155c51f124SMoriah Waterland
40165c51f124SMoriah Waterland if (check_applicability(pkgdev.dirname,
40172e10def1SPeter Tribble pkginst, get_inst_root(), flags) == B_FALSE) {
40185c51f124SMoriah Waterland progerr(ERR_PKG_NOT_APPLICABLE, pkginst);
40195c51f124SMoriah Waterland quit(1);
40205c51f124SMoriah Waterland }
40215c51f124SMoriah Waterland
40225c51f124SMoriah Waterland /*
40235c51f124SMoriah Waterland * if pkgask, handle response file creation:
40245c51f124SMoriah Waterland * - if the response file is a directory, then create a path to
40255c51f124SMoriah Waterland * -- a package instance within the response file directory.
40265c51f124SMoriah Waterland * - If the response file is NOT a directory, if more than one
40275c51f124SMoriah Waterland * -- package is to be installed.
40285c51f124SMoriah Waterland */
40295c51f124SMoriah Waterland
40305c51f124SMoriah Waterland if ((askflag != 0) && (respdir != (char *)NULL)) {
40315c51f124SMoriah Waterland (void) snprintf(respfile_path, sizeof (respfile_path),
40322e10def1SPeter Tribble "%s/%s", respdir, pkginst);
40335c51f124SMoriah Waterland respfile = respfile_path;
40345c51f124SMoriah Waterland }
40355c51f124SMoriah Waterland
403632991bedSPeter Tribble echo(MSG_PROC_INST, pkginst, a_device);
40375c51f124SMoriah Waterland
40385c51f124SMoriah Waterland /*
40395c51f124SMoriah Waterland * If we're installing another package in the same
40405c51f124SMoriah Waterland * session, the second through nth pkginstall, must
40415c51f124SMoriah Waterland * continue from where the prior one left off. For this
40425c51f124SMoriah Waterland * reason, the continuation feature (implied by the
40435c51f124SMoriah Waterland * nature of the command) is used for the remaining
40445c51f124SMoriah Waterland * packages.
40455c51f124SMoriah Waterland */
40465c51f124SMoriah Waterland
40475c51f124SMoriah Waterland if ((i == 1) && (pkgdrtarg != (char *)NULL)) {
40485c51f124SMoriah Waterland pkgcontsrc = pkgdrtarg;
40495c51f124SMoriah Waterland }
40505c51f124SMoriah Waterland
40515c51f124SMoriah Waterland /* reset interrupted flag before calling pkginstall */
40525c51f124SMoriah Waterland
40535c51f124SMoriah Waterland interrupted = 0; /* last action was NOT quit */
40545c51f124SMoriah Waterland
40555c51f124SMoriah Waterland /* call pkginstall for this package */
40565c51f124SMoriah Waterland
40575c51f124SMoriah Waterland n = pkgInstall(get_inst_root(), a_idsName,
40582e10def1SPeter Tribble pkgdev.dirname, a_altBinDir);
40595c51f124SMoriah Waterland
40605c51f124SMoriah Waterland /* set success/fail condition variables */
40615c51f124SMoriah Waterland
40625c51f124SMoriah Waterland ckreturn(n);
40635c51f124SMoriah Waterland
40645c51f124SMoriah Waterland /* decrement number of packages left to install */
40655c51f124SMoriah Waterland
40665c51f124SMoriah Waterland npkgs--;
40675c51f124SMoriah Waterland
40685c51f124SMoriah Waterland /*
40695c51f124SMoriah Waterland * if no packages left to install, unmount package source
40705c51f124SMoriah Waterland * device if appropriate
40715c51f124SMoriah Waterland */
40725c51f124SMoriah Waterland
40735c51f124SMoriah Waterland if ((npkgs <= 0) && (pkgdev.mount || a_idsName)) {
40745c51f124SMoriah Waterland (void) chdir("/");
40755c51f124SMoriah Waterland if (!a_idsName) {
40765c51f124SMoriah Waterland (void) pkgumount(&pkgdev);
40775c51f124SMoriah Waterland }
40785c51f124SMoriah Waterland }
40795c51f124SMoriah Waterland }
40805c51f124SMoriah Waterland
40815c51f124SMoriah Waterland /*
40825c51f124SMoriah Waterland * all packages in the package list have been installed.
40835c51f124SMoriah Waterland * Continue with installation if:
40845c51f124SMoriah Waterland * -- immediate reboot is NOT required
40855c51f124SMoriah Waterland * -- there are more packages to install
40865c51f124SMoriah Waterland * -- the package source is a path to a file
40875c51f124SMoriah Waterland * else return do NOT continue.
40885c51f124SMoriah Waterland */
40895c51f124SMoriah Waterland
40905c51f124SMoriah Waterland if ((ireboot == 0) && (a_repeat != 0) &&
40912e10def1SPeter Tribble (pkgdev.pathname == (char *)NULL)) {
40925c51f124SMoriah Waterland return (B_TRUE);
40935c51f124SMoriah Waterland }
40945c51f124SMoriah Waterland
40955c51f124SMoriah Waterland /* return 'dont continue' */
40965c51f124SMoriah Waterland
40975c51f124SMoriah Waterland return (B_FALSE);
40985c51f124SMoriah Waterland }
40995c51f124SMoriah Waterland
41005c51f124SMoriah Waterland /*
41015c51f124SMoriah Waterland * returns:
41025c51f124SMoriah Waterland * B_TRUE to process next data stream
41035c51f124SMoriah Waterland * B_FALSE to exit
41045c51f124SMoriah Waterland */
41055c51f124SMoriah Waterland
41065c51f124SMoriah Waterland static boolean_t
add_packages(char ** a_pkgList,char * a_idsName,int a_repeat,char * a_altBinDir,char * a_device,boolean_t a_noZones)410732991bedSPeter Tribble add_packages(char **a_pkgList,
41082e10def1SPeter Tribble char *a_idsName, int a_repeat, char *a_altBinDir, char *a_device,
41092e10def1SPeter Tribble boolean_t a_noZones)
41105c51f124SMoriah Waterland {
41115c51f124SMoriah Waterland zoneList_t zlst;
41125c51f124SMoriah Waterland boolean_t b;
41135c51f124SMoriah Waterland
41145c51f124SMoriah Waterland /* entry assertions */
41155c51f124SMoriah Waterland
41165c51f124SMoriah Waterland assert(a_pkgList != (char **)NULL);
41175c51f124SMoriah Waterland
41185c51f124SMoriah Waterland echoDebug(DBG_ADDPACKAGES_ENTRY);
411932991bedSPeter Tribble echoDebug(DBG_ADDPACKAGES_ARGS, npkgs, PSTR(a_idsName),
41202e10def1SPeter Tribble a_repeat, PSTR(a_altBinDir), PSTR(a_device));
41215c51f124SMoriah Waterland
41225c51f124SMoriah Waterland /*
41235c51f124SMoriah Waterland * if running in the global zone AND one or more non-global
41245c51f124SMoriah Waterland * zones exist, add packages in a 'zones aware' manner, else
41255c51f124SMoriah Waterland * add packages in the standard 'non-zones aware' manner.
41265c51f124SMoriah Waterland */
41275c51f124SMoriah Waterland
41285c51f124SMoriah Waterland if ((a_noZones == B_FALSE) && (z_running_in_global_zone() == B_FALSE)) {
41295c51f124SMoriah Waterland /* in non-global zone */
41305c51f124SMoriah Waterland
41315c51f124SMoriah Waterland echoDebug(DBG_IN_LZ);
41325c51f124SMoriah Waterland
41335c51f124SMoriah Waterland b = z_lock_this_zone(ZLOCKS_PKG_ADMIN);
41345c51f124SMoriah Waterland if (b != B_TRUE) {
41355c51f124SMoriah Waterland progerr(ERR_CANNOT_LOCK_THIS_ZONE);
41365c51f124SMoriah Waterland /* set fatal error return condition */
41375c51f124SMoriah Waterland ckreturn(1);
41385c51f124SMoriah Waterland return (B_FALSE);
41395c51f124SMoriah Waterland }
41405c51f124SMoriah Waterland
414132991bedSPeter Tribble b = add_packages_in_nonglobal_zone(a_pkgList, a_idsName,
41422e10def1SPeter Tribble a_repeat, a_altBinDir, a_device);
41435c51f124SMoriah Waterland
41445c51f124SMoriah Waterland (void) z_unlock_this_zone(ZLOCKS_ALL);
41455c51f124SMoriah Waterland
41465c51f124SMoriah Waterland return (B_FALSE);
41475c51f124SMoriah Waterland }
41485c51f124SMoriah Waterland
41495c51f124SMoriah Waterland /* running in the global zone */
41505c51f124SMoriah Waterland
41515c51f124SMoriah Waterland b = z_non_global_zones_exist();
41525c51f124SMoriah Waterland if ((a_noZones == B_FALSE) && (b == B_TRUE) &&
41532e10def1SPeter Tribble (globalZoneOnly == B_FALSE)) {
41545c51f124SMoriah Waterland
41555c51f124SMoriah Waterland echoDebug(DBG_IN_GZ_WITH_LZ);
41565c51f124SMoriah Waterland
41575c51f124SMoriah Waterland /* error if -V specified - what to use in non-global zone? */
41585c51f124SMoriah Waterland
41595c51f124SMoriah Waterland if (vfstab_file) {
41605c51f124SMoriah Waterland progerr(ERR_V_USED_WITH_GZS);
41615c51f124SMoriah Waterland quit(1);
41625c51f124SMoriah Waterland }
41635c51f124SMoriah Waterland
41645c51f124SMoriah Waterland /* get a list of all non-global zones */
41655c51f124SMoriah Waterland zlst = z_get_nonglobal_zone_list();
41665c51f124SMoriah Waterland if (zlst == (zoneList_t)NULL) {
41675c51f124SMoriah Waterland progerr(ERR_CANNOT_GET_ZONE_LIST);
41685c51f124SMoriah Waterland quit(1);
41695c51f124SMoriah Waterland }
41705c51f124SMoriah Waterland
41715c51f124SMoriah Waterland /* need to lock all of the zones */
41725c51f124SMoriah Waterland
41735c51f124SMoriah Waterland quitSetZonelist(zlst);
41745c51f124SMoriah Waterland b = z_lock_zones(zlst, ZLOCKS_PKG_ADMIN);
41755c51f124SMoriah Waterland if (b == B_FALSE) {
41765c51f124SMoriah Waterland z_free_zone_list(zlst);
41775c51f124SMoriah Waterland progerr(ERR_CANNOT_LOCK_ZONES);
41785c51f124SMoriah Waterland /* set fatal error return condition */
41795c51f124SMoriah Waterland ckreturn(1);
41805c51f124SMoriah Waterland return (B_FALSE);
41815c51f124SMoriah Waterland }
41825c51f124SMoriah Waterland
41835c51f124SMoriah Waterland /* add packages to all zones */
41845c51f124SMoriah Waterland
418532991bedSPeter Tribble b = add_packages_in_global_with_zones(a_pkgList,
41862e10def1SPeter Tribble a_idsName, a_repeat, a_altBinDir, a_device, zlst);
41875c51f124SMoriah Waterland
41885c51f124SMoriah Waterland /* unlock all zones */
41895c51f124SMoriah Waterland
41905c51f124SMoriah Waterland (void) z_unlock_zones(zlst, ZLOCKS_ALL);
41915c51f124SMoriah Waterland quitSetZonelist((zoneList_t)NULL);
41925c51f124SMoriah Waterland
41935c51f124SMoriah Waterland /* free list of all non-global zones */
41945c51f124SMoriah Waterland
41955c51f124SMoriah Waterland z_free_zone_list(zlst);
41965c51f124SMoriah Waterland
41975c51f124SMoriah Waterland return (B_FALSE);
41985c51f124SMoriah Waterland }
41995c51f124SMoriah Waterland
42005c51f124SMoriah Waterland /* in global zone no non-global zones */
42015c51f124SMoriah Waterland
42025c51f124SMoriah Waterland echoDebug(DBG_IN_GZ_NO_LZ);
42035c51f124SMoriah Waterland
42045c51f124SMoriah Waterland b = z_lock_this_zone(ZLOCKS_PKG_ADMIN);
42055c51f124SMoriah Waterland if (b != B_TRUE) {
42065c51f124SMoriah Waterland progerr(ERR_CANNOT_LOCK_THIS_ZONE);
42075c51f124SMoriah Waterland /* set fatal error return condition */
42085c51f124SMoriah Waterland ckreturn(1);
42095c51f124SMoriah Waterland return (B_FALSE);
42105c51f124SMoriah Waterland }
42115c51f124SMoriah Waterland
421232991bedSPeter Tribble b = add_packages_in_global_no_zones(a_pkgList, a_idsName,
42132e10def1SPeter Tribble a_repeat, a_altBinDir, a_device);
42145c51f124SMoriah Waterland
42155c51f124SMoriah Waterland (void) z_unlock_this_zone(ZLOCKS_ALL);
42165c51f124SMoriah Waterland
42175c51f124SMoriah Waterland return (B_FALSE);
42185c51f124SMoriah Waterland }
4219