5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <time.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <wait.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ulimit.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/statvfs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgdev.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pwd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <instzones_api.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgweb.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <install.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libadm.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dryrun.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <messages.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkginstall.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* imported globals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char **environ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgabrv;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgarch;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgvers;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char pkgwild[];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* libadm(3LIB) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *get_install_root(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* quit.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern sighdlrFunc_t *quitGetTrapHandler(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetDstreamTmpdir(char *a_dstreamTempDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetInstallStarted(boolean_t a_installStarted);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetPkgask(boolean_t a_pkgaskFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetSilentExit(boolean_t a_silentExit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetUpdatingExisting(boolean_t a_updatingExisting);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void quitSetZoneName(char *a_zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* static globals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int ck_instbase(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int cp_pkgdirs(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int merg_pkginfos(struct cl_attr **pclass,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cl_attr ***mpclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int merg_respfile(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int mv_pkgdirs(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int rdonly(char *p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void ck_w_dryrun(int (*func)(), int type);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void copyright(void), usage(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void do_pkgask(boolean_t a_run_request_as_root);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void rm_icas(char *casdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void set_dryrun_dir_loc(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void unpack(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid ckreturn(int retcode, char *msg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *ro_params[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "PATH", "NAME", "PKG", "PKGINST",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "VERSION", "ARCH",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "INSTDATE", "CATEGORY",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The following variable is the name of the device to which stdin
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is connected during execution of a procedure script. PROC_STDIN is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * correct for all ABI compliant packages. For non-ABI-compliant
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * packages, the '-o' command line switch changes this to PROC_XSTDIN
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to allow user interaction during these scripts. -- JST
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *script_in = PROC_STDIN; /* assume ABI compliance */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *pkgdrtarg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *pkgcontsrc = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int non_abi_scripts = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *respfile = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *srcinst = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int suppressCopyright = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int nointeract = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* exported globals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *msgtext;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkginst = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *rw_block_size = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar ilockfile[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar instdir[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar saveSpoolInstallDir[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar pkgbin[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar pkgloc[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar pkgloc_sav[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar pkgsav[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar rlockfile[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar savlog[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar tmpdir[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint dbchg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint dparts = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint dreboot = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint failflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int askflag = 0; /* non-zero if invoked as "pkgask" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint ireboot = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint maxinst = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint nocnflct;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint nosetuid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint pkgverbose = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint rprcflag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint warnflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct admin adm;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct cfextra **extlist; /* pkgmap structure and other path info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct pkgdev pkgdev;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfsblkcnt_t pkgmap_blks = 0LL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this global is referenced by:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * getinst - [RW] - incremented if:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - installing same instance again
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - overwriting an existing instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - not installing a new instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * quit - [RO] - if non-zero and started non-zero:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - the new <PKGINST>/install directory and rename <PKGINST>/install.save
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - back to <PKGINST>/install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * main.c - [RO] - if non-zero:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - alter manner in which parameters are setup for scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - set UPDATE=yes in environment
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int update = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O debug: debug output is enabled? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t debugFlag = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by the -G option: install packages in global zone only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t globalZoneOnly = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O preinstallcheck */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t preinstallCheck = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O parent-zone-name= */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *parentZoneName = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set by -O parent-zone-type= */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *parentZoneType = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define DEFPATH "/sbin:/usr/sbin:/usr/bin"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MALSIZ 4 /* best guess at likely maximum value of MAXINST */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LSIZE 256 /* maximum line size supported in copyright file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TEXT_DOMAIN "SYS_TEST"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* This is the text for the "-O parent-zone-name=" option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PARENTZONENAME "parent-zone-name="
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PARENTZONENAME_LEN ((sizeof (PARENTZONENAME))-1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* This is the text for the "-O parent-zone-type=" option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PARENTZONETYPE "parent-zone-type="
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PARENTZONETYPE_LEN ((sizeof (PARENTZONETYPE))-1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *cpio_names[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root.cpio",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc.cpio",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root.cpio.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc.cpio.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmain(int argc, char *argv[])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik VFP_T *cfTmpVfp = NULL; /* temporary */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland VFP_T *pkgmapVfp; /* "../pkgmap" file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t run_request_as_root = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **np;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *abi_comp_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *abi_nm_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *abi_sym_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *admnfile = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prog_full_name = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *updated = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *vfstab_file = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *zoneName = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char cbuf[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char cmdbin[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char p_pkginfo[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char p_pkgmap[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char param[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char script[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char altscript[PATH_MAX];
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" char *temp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int disableAttributes = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int init_install = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int is_comp_arch;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int live_continue = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int map_client = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nparts;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int npkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int part;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int saveSpoolInstall = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t cont_file_read;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cl_attr **pclass = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cl_attr **mergd_pclass = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo *prvinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction nact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction oact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct statvfs64 svfsb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t clock;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik PKGserver pkgserver = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset contents of all default paths */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(path, '\0', sizeof (path));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(cmdbin, '\0', sizeof (cmdbin));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(script, '\0', sizeof (script));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(cbuf, '\0', sizeof (cbuf));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(param, '\0', sizeof (param));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize locale environment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) setlocale(LC_ALL, "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) textdomain(TEXT_DOMAIN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize program name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prog_full_name = argv[0];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_prog_name(argv[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* tell spmi zones interface how to access package output functions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_set_output_functions(echo, echoDebug, progerr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* exit if not root */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getuid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NOT_ROOT, get_prog_name());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * determine how pkgmap() deals with environment variables:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - MAPALL - resolve all variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - MAPBUILD - map only build variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - MAPINSTALL - map only install variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - MAPNONE - map no variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setmapmode(MAPINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set sane umask */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) umask(0022);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initially no source "device" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset npkgs (used as pkg remaining count in quit.c) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read PKG_INSTALL_ROOT from the environment, if it's there. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ROOT_SET);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgserversetmode(DEFAULTMODE);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* parse command line options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "?Aa:B:b:Cc:D:d:eFf:GhIiMm:N:noO:p:R:r:StV:vyz")) != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: This disables attribute checking.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It speeds up installation a little bit.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'A':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland disableAttributes++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Define an installation administration
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file, admin, to be used in place of the default
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file. The token none overrides the use
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of any admin file, and thus forces interaction with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * user. Unless a full path name is given, pkgadd first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * looks in the current working directory for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file. If the specified administration
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file is not in the current working directory, pkgadd
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * looks in the /var/sadm/install/admin directory for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * administration file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland admnfile = flex_device(optarg, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: control block size given to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginstall - block size used in read()/write() loop;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * default is st_blksize from stat() of source file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'B':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rw_block_size = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: location where executables needed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by procedure scripts can be found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * default is /usr/sadm/install/bin.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!path_valid(optarg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PATH, optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(optarg) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = strerror(errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_USE_DIR, optarg, p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(cmdbin, optarg, sizeof (cmdbin));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: This disables checksum tests on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the source files. It speeds up installation a little bit.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'C':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) checksum_off();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: This allows designation of a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * continuation file. It is the same format as a dryrun file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * but it is used to take up where the dryrun left off.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgcontsrc = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_continue_mode();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dr_info(DR_TYPE, INSTALL_TYPE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland init_contfile(pkgcontsrc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: This allows designation of a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * dryrun file. This pkgadd will create dryrun files
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in the directory provided.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'D':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdrtarg = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dryrun_mode();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dr_info(DR_TYPE, INSTALL_TYPE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Install or copy a package from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * device. device can be a full path name to a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or the identifiers for tape, floppy disk, or removable
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * disk - for example, /var/tmp or /floppy/floppy_name.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It can also be a device alias - for example,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /floppy/floppy0, or a datastream created by pkgtrans.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device = flex_device(optarg, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: disable the 32 char name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * limit extension
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_ABI_namelngth();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: specify file system type for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package device. Must be used with -m.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.fstyp = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: install package in global zone only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'G':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland globalZoneOnly = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Enable hollow package support. When
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specified, for any package that has SUNW_PKG_HOLLOW=true:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not calculate and verify package size against target.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not run any package procedure or class action scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not create any target directories.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not perform any script locking.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not install any components of any package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not output any status or database update messages.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'h':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_depend_pkginfo_DB(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Informs scripts that this is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * an initial install by setting the environment parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * PKG_INIT_INSTALL=TRUE for all scripts. They may use it as
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * they see fit, safe in the knowledge that the target
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * filesystem is tabula rasa.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'I':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland init_install++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: use by pkgask.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'i':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland askflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetPkgask(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Instruct pkgadd not to use the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * $root_path/etc/vfstab file for determining the client's
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mount points. This option assumes the mount points are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * correct on the server and it behaves consistently with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Solaris 2.5 and earlier releases.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'M':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland map_client = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: specify device to use for package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * source.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'm':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.mount = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.rdonly++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.mntflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: specify program name to use
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for messages.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'N':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_prog_name(optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: installation occurs in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-interactive mode. Suppress output of the list of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed files. The default mode is interactive.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nointeract++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoSetFlag(B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Almost same as pkgadd: the -O option allows the behavior
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the package tools to be modified. Recognized options:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> debug
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> enable debugging output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> preinstallcheck
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> perform a "pre installation" check of the specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> package - suppress all regular output and cause a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> series of one or more "name=value" pair format lines
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> to be output that describes the "installability" of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ---> the specified package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -> enable-hollow-package-support
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Enable hollow package support. When specified, for any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> package that has SUNW_PKG_HOLLOW=true:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not calculate and verify package size against target
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not run any package procedure or class action scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not create or remove any target directories
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not perform any script locking
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not install or uninstall any components of any package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> Do not output any status or database update messages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'O':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (p = strtok(optarg, ","); p != (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = strtok(NULL, ",")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process debug option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p, "debug") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set debug flag/enable debug output */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (debugFlag == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland smlSetVerbose(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland debugFlag = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoDebugSetFlag(debugFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info on arguments to pkgadd */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < argc && argv[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ARG, n, argv[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process enable-hollow-package-support opt */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "enable-hollow-package-support") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_depend_pkginfo_DB(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process preinstallcheck option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p, "preinstallcheck") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland preinstallCheck = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nointeract++; /* -n */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland suppressCopyright++; /* -S */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetSilentExit(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process addzonename option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p, "addzonename") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * set zone name to add to messages;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * first look in the current environment
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and use the default package zone name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if it is set; otherwise, use the name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the current zone
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getenv(PKG_ZONENAME_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((zoneName == (char *)NULL) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*zoneName == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName = z_get_zonename();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneName != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*zoneName != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetZoneName(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process parent-zone-name option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strncmp(p, PARENTZONENAME,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PARENTZONENAME_LEN) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parentZoneName = p+PARENTZONENAME_LEN;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* process parent-zone-type option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strncmp(p, PARENTZONETYPE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PARENTZONETYPE_LEN) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland parentZoneType = p+PARENTZONETYPE_LEN;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (strncmp(p, PKGSERV_MODE,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik PKGSERV_MODE_LEN) == 0) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgserversetmode(pkgparsemode(p +
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik PKGSERV_MODE_LEN));
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik continue;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* option not recognized - issue warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_INVALID_O_OPTION, p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: This is an old non-ABI package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'o':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland non_abi_scripts++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: specify number of parts to package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dparts = ds_getinfo(optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Define the full path name of a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory to use as the root_path. All files,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * including package system information files, are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * relocated to a directory tree starting in the specified
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * root_path. The root_path may be specified when
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installing to a client from a server (for example,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /export/root/client1).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(optarg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ROOT_CMD);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Identify a file or directory which
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contains output from a previous pkgask(1M)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * session. This file supplies the interaction responses
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that would be requested by the package in interactive
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mode. response must be a full pathname.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'r':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland respfile = flex_device(optarg, 2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: suppress copyright notice being
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output during installation.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'S':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland suppressCopyright++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: disable save spool area creation;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * do not spool any partial package contents, that is,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * suppress the creation and population of the package save
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * spool area (var/sadm/pkg/PKG/save/pspool/PKG).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 't':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland disable_spool_create();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Specify an alternative fs_file to map
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the client's file systems. For example, used in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * situations where the $root_path/etc/vfstab file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-existent or unreliable. Informs the pkginstall
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * portion to mount up a client filesystem based upon the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * supplied vfstab-like file of stable format.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'V':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfstab_file = flex_device(optarg, 2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland map_client = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: Trace all of the scripts that get
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * executed by pkgadd, located in the pkginst/install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory. This option is used for debugging the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * procedural and non-procedural scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgverbose++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Different from pkgadd: process this package using
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * old non-ABI symlinks
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'y':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_nonABI_symlinks();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Same as pkgadd: perform fresh install from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package save spool area. When set, the package contents
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are installed from the package spool save area instead
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of from the package root area, so that the original
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * source packages are not required to install the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package. If the -h option is also specified and the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package is hollow, then this option is ignored. When -z
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is specified:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Editable files are installed from the package instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * save area.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Volatile files are installed from the package instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * save area.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Executable and data files are installed from the final
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed location as specified in the pkgmap file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - Installation scripts are run from the package spool
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * save area.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'z':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstall++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unrecognized option
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Although usage() calls a noreturn function,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * needed to add return (1); so that main() would
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pass compilation checks. The statement below
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * should never be executed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * validate command line options
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ********************************************************************
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set "debug echo" flag according to setting of "-O debug" option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoDebugSetFlag(debugFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) log_set_verbose(debugFlag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output entry debugging information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (z_running_in_global_zone()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ENTRY_IN_GZ, prog_full_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_ENTRY_IN_LZ, prog_full_name, getzoneid(),
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik z_get_zonename());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_continue_mode() && !in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_LIVE_CONTINUE_NOT_SUPPORTED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgask requires a response file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (askflag && (respfile == NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if device specified, set appropriate device in pkgdev */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (device) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.bdevice = device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.cdevice = device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if file system type specified, must have a device to mount */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.fstyp && !pkgdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_F_REQUIRES_M);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* BEGIN DATA GATHERING PHASE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get the mount table info and store internally.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cont_file_read = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_continue_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cont_file_read = read_continuation(&error);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (error == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland live_continue = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read the mount table if not done in continuation mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!cont_file_read) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (get_mntinfo(map_client, vfstab_file)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function defines the standard /var/... directories used later
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to construct the paths to the various databases.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGpaths(get_inst_root());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is being installed on a client whose /var filesystem is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mounted in some odd way, remap the administrative paths to the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * real filesystem. This could be avoided by simply mounting up the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * client now; but we aren't yet to the point in the process where
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * modification of the filesystem is permitted.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_an_inst_root()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fsys_value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsys_value = fsys(get_PKGLOC());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (use_srvr_map_n(fsys_value))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGLOC(server_map(get_PKGLOC(), fsys_value));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsys_value = fsys(get_PKGADM());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (use_srvr_map_n(fsys_value))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGADM(server_map(get_PKGADM(), fsys_value));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Initialize pkginfo PKGSAV entry, just in case we dryrun to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * somewhere else.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_infoloc(get_PKGLOC());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pull off directory and package name from end of command line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (argc-optind) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 0: /* missing directory and package instance */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MISSING_DIR_AND_PKG);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 1: /* missing package instance */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MISSING_PKG_INSTANCE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 2: /* just right! */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname = argv[optind++];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcinst = argv[optind++];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default: /* too many args! */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_TOO_MANY_CMD_ARGS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkgparam(NULL, NULL); /* close up prior pkg file if needed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Initialize installation admin parameters by reading
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the adminfile.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!askflag && !live_continue) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_ADMINFILE, admnfile ? admnfile : "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminFile(admnfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * about to perform first operation that could be modified by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * preinstall check option - if preinstall check is selected (that is,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * only gathering dependencies), then output a debug message to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * indicate that the check is beginning. Also turn echo() output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * off and set various other flags.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (preinstallCheck == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) echoSetFlag(B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_PREINSCHK,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst ? pkginst : (srcinst ? srcinst : ""),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cksetPreinstallCheck(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cksetZoneName(zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* inform quit that the install has started */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetInstallStarted(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * validate the "rscriptalt" admin file setting
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The rscriptalt admin file parameter may be set to either
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RSCRIPTALT_ROOT or RSCRIPTALT_NOACCESS:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> If rscriptalt is not set, or is set to RSCRIPTALT_NOACCESS,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> or is set to any value OTHER than RSCRIPTALT_ROOT, then
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> assume that the parameter is set to RSCRIPTALT_NOACCESS
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If rscriptalt is set to RSCRIPTALT_ROOT, then run request scripts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as the "root" user if user "install" is not defined.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Otherwise, assume rscriptalt is set to RSCRIPTALT_NOACCESS, and run
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * request scripts as the "alternative" user if user "install" is not
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * defined, as appropriate for the current setting of the NONABI_SCRIPTS
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * environment variable.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ADMSET(RSCRIPTALT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p = adm.RSCRIPTALT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_RSCRIPT_SET_TO, RSCRIPTALT_KEYWORD, p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcasecmp(p, RSCRIPTALT_ROOT) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rscriptalt=root */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland run_request_as_root = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcasecmp(p, RSCRIPTALT_NOACCESS) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rscriptalt=noaccess */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland run_request_as_root = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rscriptalt=??? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(WRN_RSCRIPTALT_BAD, RSCRIPTALT_KEYWORD, p,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RSCRIPTALT_ROOT, RSCRIPTALT_NOACCESS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(WRN_RSCRIPTALT_USING, RSCRIPTALT_KEYWORD,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland RSCRIPTALT_NOACCESS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland run_request_as_root = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* rscriptalt not set - assume rscriptalt=noaccess */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_RSCRIPT_NOT_SET, RSCRIPTALT_KEYWORD);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland run_request_as_root = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_RSCRIPT_IS_ROOT, run_request_as_root);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * hook SIGINT and SIGHUP interrupts into quit.c's trap handler
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hold SIGINT/SIGHUP interrupts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* connect quit.c:trap() to SIGINT */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = quitGetTrapHandler();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGINT, &nact, &oact);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* connect quit.c:trap() to SIGHUP */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = quitGetTrapHandler();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGHUP, &nact, &oact);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * create required /var... directories if they do not exist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this function will call quit(99) if any required path cannot
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * be created.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckdirs();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tzset();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * create path to temporary directory "installXXXXXX" - if TMPDIR
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * environment variable is set, create the directory in $TMPDIR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * otherwise, create the directory in P_tmpdir.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = getenv("TMPDIR");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(tmpdir, sizeof (tmpdir), "%s/installXXXXXX",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((pt != (char *)NULL) && (*pt != '\0')) ? pt : P_tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_TMPDIR, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((mktemp(tmpdir) == NULL) || mkdir(tmpdir, 0771)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MKDIR, tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if the package device is a file containing a package stream,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unpack the stream into a temporary directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((isdir(pkgdev.dirname) != 0) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pkgdev.cdevice == (char *)NULL) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pkgdev.bdevice == (char *)NULL) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (isfile((char *)NULL, pkgdev.dirname) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *idsName = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgnames[2];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *device = pkgdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_DS_ISFILE, pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * validate the package source device - return pkgdev info that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * describes the package source device.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (devtype(device, &pkgdev)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_BAD_DEVICE, device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* NOTREACHED */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the list of packages to verify */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgnames[0] = srcinst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgnames[1] = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = open_package_datastream(1, pkgnames, (char *)NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname, (int *)NULL, &idsName, tmpdir, &pkgdev,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_OPEN_PKG_STREAM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname ? pkgdev.dirname : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure temporary directory is removed on exit */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetDstreamTmpdir(pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unpack the package instance from the data stream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = unpack_package_from_stream(idsName, srcinst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_UNPACK_PKGSTRM,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcinst ? srcinst : "?",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland idsName ? idsName : "?",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname ? pkgdev.dirname : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close the datastream - no longer needed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_CLOSING_STREAM, idsName, pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (snprintf(instdir, PATH_MAX, "%s/%s", pkgdev.dirname, srcinst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland >= PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SNPRINTF, instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName = getenv(PKG_ZONENAME_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the environment has a CLIENT_BASEDIR, that takes precedence
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * over anything we will construct. We need to save it here because
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in three lines, the current environment goes away.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_env_cbdir(); /* copy over environ */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getuserlocale();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * current environment has been read; clear environment out
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * so putparam() can be used to populate the new environment
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be passed to any executables/scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland environ = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write parent condition information to environment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putConditionInfo(parentZoneName, parentZoneType);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putuserlocale();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (init_install) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_INIT_INSTALL", "TRUE");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_an_inst_root()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland export_client_env(get_inst_root());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneName != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(PKG_ZONENAME_VARIABLE, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("INST_DATADIR", pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (non_abi_scripts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("NONABI_SCRIPTS", "TRUE");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nonABI_symlinks()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_NONABI_SYMLINKS", "TRUE");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (get_ABI_namelngth()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_ABI_NAMELENGTH", "TRUE");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* establish path and oambase */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cmdbin[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(cmdbin, PKGBIN, sizeof (cmdbin));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s:%s", DEFPATH, cmdbin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PATH", path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("OAMBASE", OAMBASE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(p_pkginfo, sizeof (p_pkginfo),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", instdir, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(p_pkgmap, sizeof (p_pkgmap),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", instdir, PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read the environment (from pkginfo or '-e') ... */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland abi_nm_ptr = getenv("PKG_ABI_NAMELENGTH");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Disable the 32 char name limit extension */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (abi_nm_ptr && strncasecmp(abi_nm_ptr, "TRUE", 4) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_ABI_namelngth();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This tests the pkginfo and pkgmap files for validity and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * puts all delivered pkginfo variables (except for PATH) into
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * our environment. This is where a delivered pkginfo BASEDIR
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * would come from. See set_basedirs() below.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgenv(srcinst, p_pkginfo, p_pkgmap)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo("\n%s(%s) %s", pkgname, pkgarch, pkgvers);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this script was invoked by 'pkgask', just
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * execute request script and quit (do_pkgask()).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (askflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do_pkgask(run_request_as_root);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* validate package contents file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vcfile() == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if not in dryrun mode aquire packaging lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* acquire the package lock - at install initialization */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!lockinst(get_prog_name(), srcinst, "install-initial")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now do all the various setups based on ABI compliance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read the environment (from pkginfo or '-o') ... */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland abi_comp_ptr = getenv("NONABI_SCRIPTS");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read the environment (from pkginfo or '-y') ... */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland abi_sym_ptr = getenv("PKG_NONABI_SYMLINKS");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bug id 4244631, not ABI compliant */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (abi_comp_ptr && strncasecmp(abi_comp_ptr, "TRUE", 4) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland script_in = PROC_XSTDIN;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland non_abi_scripts = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Set symlinks to be processed the old way */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (abi_sym_ptr && strncasecmp(abi_sym_ptr, "TRUE", 4) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_nonABI_symlinks();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * At this point, script_in, non_abi_scripts & the environment are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all set correctly for the ABI status of the package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = getenv("MAXINST")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maxinst = atol(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See if were are installing a package that only wants to update
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the database or only install files associated with CAS's. We
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * only check the PKG_HOLLOW_VARIABLE variable if told to do so by
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the caller.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = getenv(PKG_HOLLOW_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pt != NULL) && (strncasecmp(pt, "true", 4) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMOVE_HOLLOW_ENABLED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (disableAttributes) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland disable_attribute_check();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this is a hollow package and hollow package support
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is enabled -- override admin settings to suppress
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * checks that do not make sense since no scripts will
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * be executed and no files will be installed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminSetting("conflict", "nocheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminSetting("setuid", "nocheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminSetting("action", "nocheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminSetting("partial", "nocheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminSetting("space", "nocheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setadminSetting("authentication", "nocheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGREMOVE_HOLLOW_DISABLED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_depend_pkginfo_DB(B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if performing a fresh install to a non-global zone, and doing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * more than just updating the package database (that is, the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package to install is NOT "hollow"), then set the global flag
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that directs installation is from partially spooled packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (that is, packages installed in the global zone).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (saveSpoolInstall && (!is_depend_pkginfo_DB())) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_partial_inst();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstall = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * verify that we are not trying to install an
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * INTONLY package with no interaction
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = getenv("INTONLY")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (askflag || nointeract) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_INTONLY, pkgabrv ? pkgabrv : "?");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!suppressCopyright && !pkgdev.cdevice) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland copyright();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * inspect the system to determine if any instances of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package being installed already exist on the system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prvinfo = (struct pkginfo *)calloc(MALSIZ, sizeof (struct pkginfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (prvinfo == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MEMORY, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfo(&prvinfo[npkgs], pkgwild, NULL, NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((errno == ESRCH) || (errno == ENOENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SYSINFO, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((++npkgs % MALSIZ) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prvinfo = (struct pkginfo *)realloc(prvinfo,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (npkgs+MALSIZ) * sizeof (struct pkginfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (prvinfo == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MEMORY, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine the correct package instance based on how many packages are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * already installed. If there are none (npkgs == 0), getinst() just
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns the package abbreviation. Otherwise, getinst() interacts with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the user (or reads the admin file) to determine if an instance which
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is already installed should be overwritten, or possibly install a new
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * instance of this package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst = getinst(&update, prvinfo, npkgs, preinstallCheck);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set "update flag" if updating an existing instance of this package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (update) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setUpdate();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * Some pkgs (SUNWcsr) already spooled to the zone, check the
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * value of UPDATE in their postinstall script. After a pkg
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * has been patched UPDATE exists statically in the pkginfo
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * file and this value must be reset when installing a zone.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (saveSpoolInstall != 0 && !isUpdate()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("UPDATE", "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* inform quit() if updating existing or installing new instance */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetUpdatingExisting(update ? B_TRUE : B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (respfile) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_respfile(respfile, pkginst, RESP_RO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgloc, sizeof (pkgloc),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", get_PKGLOC(), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgbin, sizeof (pkgbin),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/install", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgsav, sizeof (pkgsav),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/save", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (snprintf(saveSpoolInstallDir, PATH_MAX, "%s/pspool/%s", pkgsav,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SNPRINTF, saveSpoolInstallDir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(ilockfile, sizeof (ilockfile),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/!I-Lock!", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(rlockfile, sizeof (rlockfile),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/!R-Lock!", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(savlog, sizeof (savlog),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/logs/%s", get_PKGADM(), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKGINST", pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKGSAV", pkgsav);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Be sure request script has access to PKG_INSTALL_ROOT if there is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * one
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland put_path_params();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!map_client) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_NO_UNIFIED", "TRUE");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This maps the client filesystems into the server's space.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (map_client && !mount_client()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(MSG_MANMOUNT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is an UPDATE then either this is exactly the same version
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and architecture of an installed package or a different package is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * intended to entirely replace an installed package of the same name
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with a different VERSION or ARCH string.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't merge any databases if only gathering dependencies.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((preinstallCheck == B_FALSE) && (update)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this version and architecture is already installed,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * merge the installed and installing parameters and inform
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all procedure scripts by defining UPDATE in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * environment.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_samepkg()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it's the same ARCH and VERSION, then a merge
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and copy operation is necessary.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = merg_pkginfos(pclass, &mergd_pclass)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = cp_pkgdirs()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it's a different ARCH and/or VERSION then this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is an "instance=overwrite" situation. The
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed base needs to be confirmed and the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package directories renamed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = ck_instbase()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = mv_pkgdirs()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("UPDATE", "yes");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dryrun_dir_loc();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (preinstallCheck == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if the package has been partially installed on or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * removed from this system.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckpartial, PARTIAL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * make sure current runlevel is appropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckrunlevel, RUNLEVEL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Just gathering dependencies - determine if the package has
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * been partially installed on or removed from this system and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output information to stdout
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = ckpartial();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckpartialinstall=%d\n", r == 8 ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckpartialremove=%d\n", r == 9 ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * make sure current runlevel is appropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = ckrunlevel();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckrunlevel=%d\n", r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.cdevice) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get first volume which contains info files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unpack();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!suppressCopyright) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland copyright();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock - at the request script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("request");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If no response file has been provided, initialize response file by
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * executing any request script provided by this package. Initialize
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the response file if not gathering dependencies only.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((!rdonly_respfile()) && (preinstallCheck == B_FALSE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", instdir, REQUEST_FILE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = reqexec(update, path, non_abi_scripts,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland run_request_as_root);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dr_info(REQUESTEXITCODE, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n, ERR_REQUEST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Look for all parameters in response file which begin with a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * capital letter, and place them in the environment.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((is_a_respfile()) && (preinstallCheck == B_FALSE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = merg_respfile()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Run a checkinstall script if one is provided by the package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't execute checkinstall script if we are only updating the DB.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't execute checkinstall script if only gathering dependencies.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock - at the checkinstall script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("checkinstall");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Execute checkinstall script if one is provided. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(script, sizeof (script), "%s/install/checkinstall",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(script, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no script present */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_COC_NONE, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* updating db only: skip checkinstall script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_COC_DBUPD, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (preinstallCheck == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* only gathering dependencies: skip checkinstall script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_COC_NODEL, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* script present and ok to run: run the script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_EXECOC_GZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_EXECOC_GZ, pkginst, script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_EXECOC_LZ, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_EXECOC_LZ, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = chkexec(update, script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dr_info(CHECKEXITCODE, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 3) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(WRN_CHKINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(4, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (n == 7) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* access returned error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CHKINSTALL_NOSCRIPT, script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(4, ERR_CHKINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(n, ERR_CHKINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now that the internal data structures are initialized, we can
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * initialize the dryrun files (which may be the same files).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdrtarg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland init_dryrunfile(pkgdrtarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Look for all parameters in response file which begin with a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * capital letter, and place them in the environment.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_a_respfile()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = merg_respfile()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock - doing analysis */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("analysis");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine package base directory and client base directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if appropriate. Then encapsulate them for future retrieval.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((err = set_basedirs(isreloc(instdir), adm.basedir, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nointeract)) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Create the base directory if specified.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't create if we are only updating the DB.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't create if only gathering dependencies.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!is_depend_pkginfo_DB() &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland !preinstallCheck && is_a_basedir()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mkbasedir(!nointeract, get_basedir());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_BASE_USED, get_basedir());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Store PKG_INSTALL_ROOT, BASEDIR & CLIENT_BASEDIR in our
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * environment for later use by procedure scripts.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland put_path_params();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the following two checks are done in the corresponding
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ck() routine, but are repeated here to avoid re-processing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the database if we are administered to not include these
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * processes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ADM(setuid, "nochange")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nosetuid++; /* Clear setuid/gid bits. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ADM(conflict, "nochange")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nocnflct++; /* Don't install conflicting files. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get the filesystem space information for the filesystem on which
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the "contents" file resides.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svfsb.f_bsize = 8192;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svfsb.f_frsize = 1024;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (statvfs64(get_PKGADM(), &svfsb) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int lerrno = errno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!access(get_PKGADM(), F_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINSTALL_STATVFS, get_PKGADM(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr("(errno %d)", lerrno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get the number of blocks used by the pkgmap, ocfile()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * needs this to properly determine its space requirements.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(p_pkgmap, &statb) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINSTALL_STATOF, p_pkgmap, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgmap_blks = nblk(statb.st_size, svfsb.f_bsize, svfsb.f_frsize);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Merge information in memory with the "contents" file; this creates
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a temporary version of the "contents" file. Note that in dryrun
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mode, we still need to record the contents file data somewhere,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * but we do it in the dryrun directory.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = set_cfdir(pkgdrtarg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = set_cfdir(NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (!ocfile(&pkgserver, &cfTmpVfp, pkgmap_blks)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if cpio is being used, tell pkgdbmerg since attributes will
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * have to be check and repaired on all file and directories
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (np = cpio_names; *np != NULL; np++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", instdir, *np);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(path, &is_comp_arch)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland is_WOS_arch();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Establish the class list and the class attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_sets(getenv("CLASSES"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland find_CAS(I_ONLY, pkgbin, instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vfpOpen(&pkgmapVfp, p_pkgmap, "r", VFP_NEEDNOW) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGMAP, p_pkgmap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This modifies the path list entries in memory to reflect
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * how they should look after the merg is complete
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik nparts = sortmap(&extlist, pkgmapVfp, pkgserver, cfTmpVfp, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((n = files_installed()) > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n > 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_INST_MANY, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_INST_ONE, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check ulimit requirement (provided in pkginfo). The purpose of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this limit is to terminate pathological file growth resulting from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file edits in scripts. It does not apply to files in the pkgmap
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and it does not apply to any database files manipulated by the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installation service.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = getenv("ULIMIT")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (assign_ulimit(pt) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_BADULIMIT, pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_ULIMIT", "TRUE");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If only gathering dependencies, check and output status of all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remaining dependencies and exit.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (preinstallCheck == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock file - final checking */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("preinstallcheck");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* verify package information files are not corrupt */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckpkgfiles=%d\n", ckpkgfiles());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* verify package dependencies */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckdepend=%d\n", ckdepend());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Check space requirements */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckspace=%d\n", ckspace());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if any objects provided by this package conflict
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with the files of previously installed packages.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckconflict=%d\n", ckconflct());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if any objects provided by this package will be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed with setuid or setgid enabled.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "cksetuid=%d\n", cksetuid());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if any packaging scripts provided with this package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * will execute as a priviledged user.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckpriv=%d\n", ckpriv());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Verify neccessary package installation directories exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "ckpkgdirs=%d\n", ckpkgdirs());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ****** preinstall check done - exit ******
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_PREINSCHK_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Not gathering dependencies only, proceed to check dependencies
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and continue with the package installation operation.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * verify package information files are not corrupt
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckpkgfiles, PKGFILES);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * verify package dependencies
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckdepend, DEPEND);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check space requirements.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckspace, SPACE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if any objects provided by this package conflict with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the files of previously installed packages.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckconflct, CONFLICT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if any objects provided by this package will be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed with setuid or setgid enabled.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(cksetuid, SETUID);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Determine if any packaging scripts provided with this package will
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * execute as a priviledged user.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckpriv, PRIV);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Verify neccessary package installation directories exist.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ck_w_dryrun(ckpkgdirs, PKGDIRS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we have assumed that we were installing setuid or conflicting
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files, and the user chose to do otherwise, we need to read in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package map again and re-merg with the "contents" file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rprcflag) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik nparts = sortmap(&extlist, pkgmapVfp, pkgserver,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cfTmpVfp, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vfpClose(&pkgmapVfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* BEGIN INSTALLATION PHASE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_DRYRUN, pkgname, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (zoneName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_INSIN_GZ, pkgname, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_INSIN_LZ, pkgname, pkginst, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* inform quit that the install has started */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quitSetInstallStarted(B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This replaces the contents file with recently created temp version
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * which contains information about the objects being installed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Under old lock protocol it closes both files and releases the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * locks. Beginning in Solaris 2.7, this lock method should be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * reviewed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik n = swapcfile(pkgserver, &cfTmpVfp, pkginst, dbchg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == RESULT_WRN) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland warnflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (n == RESULT_ERR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Create install-specific lockfile to indicate start of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installation. This is really just an information file. If the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * process dies, the initial lockfile (from lockinst(), is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * relinquished by the kernel, but this one remains in support of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * post-mortem.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(ilockfile, F_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(ilockfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (open(ilockfile, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_LOCKFILE, ilockfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) time(&clock);
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India"
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" /*
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * We do not want the time in locale in the pkginfo.
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * save the LC_TIME and set it to C. Reset it with saved one
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * after cftime().
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" */
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" temp = setlocale(LC_TIME, NULL);
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" (void) setlocale(LC_TIME, "C");
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED warning: do not use cftime(); ... */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) cftime(cbuf, "%b %d \045Y \045H:\045M", &clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("INSTDATE", qstrdup(cbuf));
a1aee5ee83c7eccdd49b3ec08834f511c11408c3"Nagaraj Yedathore - Sun Microsystems - Bangalore India" (void) setlocale(LC_TIME, temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Store information about package being installed;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * modify installation parameters as neccessary and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * copy contents of 'install' directory into $pkgloc
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland merginfo(mergd_pclass, saveSpoolInstall);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* If this was just a dryrun, then quit() will write out that file. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Execute preinstall script, if one was provided with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package. We check the package to avoid running an old
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * preinstall script if one was provided with a prior instance.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't execute preinstall script if we are only updating the DB.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock - at the preinstall altscript */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("preinstall");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* preinstall script in the media (package source) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(altscript, sizeof (altscript), "%s/install/preinstall",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* preinstall script in the pkgbin instead of media */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(script, sizeof (script), "%s/preinstall", pkgbin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(altscript, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no script present */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_POCALT_NONE, pkginst, altscript,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (access(script, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no script present */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_POC_NONE, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* updating db only: skip preinstall script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_POC_DBUPD, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* script present and ok to run: run the script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland assert(preinstallCheck == B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_ulimit("preinstall", ERR_PREINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_EXEPOC_GZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_EXEPOC_GZ, pkginst, script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_EXEPOC_LZ, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_EXEPOC_LZ, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_PROC_script", "preinstall");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgverbose) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(pkgexecl(script_in, PROC_STDOUT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PROC_USER, PROC_GRP, SHELL, "-x",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland script, NULL), ERR_PREINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(pkgexecl(script_in, PROC_STDOUT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PROC_USER, PROC_GRP, SHELL, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL), ERR_PREINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland clr_ulimit();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(script); /* no longer needed. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check delivered package for a postinstall script while
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we're still on volume 1.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(script, sizeof (script),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/install/postinstall", instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(script, F_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(script, sizeof (script),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/postinstall", pkgbin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland script[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock - at the install phase */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("install");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * install package one part (volume) at a time
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland part = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (part <= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((part > 1) && pkgdev.cdevice) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unpack();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland instvol(extlist, srcinst, part, nparts,
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington pkgserver, &cfTmpVfp, &updated, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (part++ >= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland z_destroyMountTable();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now that all install class action scripts have been used, we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * delete them from the package directory.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rm_icas(pkgbin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (globalZoneOnly) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = pkgAddPackageToGzonlyList(pkginst, get_inst_root());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b == B_FALSE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINSTALL_GZONLY_ADD, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(1, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Execute postinstall script, if any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't execute postinstall script if we are only updating the DB.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_INSDONE, is_depend_pkginfo_DB(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland is_depend_pkginfo_DB(), saveSpoolInstall,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland updated ? updated : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland script ? script : "",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland script ? access(script, F_OK) : -1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* update the lock - at the postinstall script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lockupd("postinstall");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((script == (char *)NULL) || (*script == '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_POIS_NOPATH, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (access(script, F_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_POIS_NONE, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_depend_pkginfo_DB()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_POIS_DBUPD, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global");
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington } else if ((saveSpoolInstall != 0) && (updated == (char *)NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fresh installing into non-global zone, no object was
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * updated (installed/verified in area), so do not run
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * the postinstall script.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington echoDebug(DBG_PKGINSTALL_POIS_NOUPDATING,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName ? zoneName : "global", pkginst, script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* script present and ok to run: run the script */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_ulimit("postinstall", ERR_POSTINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (zoneName == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_EXEPIC_GZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_EXEPIC_GZ, pkginst, script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(MSG_PKGINSTALL_EXEPIC_LZ, zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_PKGINSTALL_EXEPIC_LZ, pkginst, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland zoneName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PKG_PROC_SCRIPT", "postinstall");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("TMPDIR", tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgverbose) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(pkgexecl(script_in, PROC_STDOUT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PROC_USER, PROC_GRP, SHELL, "-x",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland script, NULL), ERR_POSTINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(pkgexecl(script_in, PROC_STDOUT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PROC_USER, PROC_GRP, SHELL, script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL), ERR_POSTINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland clr_ulimit();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(script); /* no longer needed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!warnflag && !failflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(rlockfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(ilockfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(savlog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release the generic package lock */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) unlockinst();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgcloseserver(pkgserver);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED: no return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function merges the environment data in the response file with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * current environment.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmerg_respfile()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retcode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *resppath = get_respfile();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *locbasedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char param[MAX_PKG_PARAM_LENGTH], *value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(resppath, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RESPONSE, resppath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (value = fpkgparam(fp, param)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isupper(param[0])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rdonly(param)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RDONLY, param);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is an update, and the response file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specifies the BASEDIR, make sure it matches the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * existing installation base. If it doesn't, we have
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to quit.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (update && strcmp("BASEDIR", param) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland locbasedir = getenv("BASEDIR");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (locbasedir && strcmp(value, locbasedir) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *dotptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Get srcinst down to a name. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dotptr = strchr(srcinst, '.'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *dotptr = '\000';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NEWBD, srcinst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland locbasedir, value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = 99;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(param, value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This scans the installed pkginfo file for the current BASEDIR. If this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * BASEDIR is different from the current BASEDIR, there will definitely be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * problems.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandck_instbase(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retcode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char param[MAX_PKG_PARAM_LENGTH], *value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginfo_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Open the old pkginfo file. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkginfo_path, sizeof (pkginfo_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", pkgloc, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(pkginfo_path, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINFO, pkginfo_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\000';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (value = fpkgparam(fp, param)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp("BASEDIR", param) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (adm.basedir && *(adm.basedir) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strchr("/$", *(adm.basedir))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *dotptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get srcinst down to a name.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dotptr = strchr(srcinst, '.'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *dotptr = '\000';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(value,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland adm.basedir) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ADMBD, srcinst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland value, adm.basedir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = 4;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (ADM(basedir, "ask"))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it's going to ask later, let it know
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that it *must* agree with the BASEDIR we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * just picked up.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland adm.basedir = "update";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(param, value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since this is an overwrite of a different version of the package, none of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the old files should remain, so we rename them.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmv_pkgdirs(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we're not in dryrun mode and we can find an old set of package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files over which the new ones will be written, do the rename.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!in_dryrun_mode() && pkgloc[0] && !access(pkgloc, F_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgloc_sav, sizeof (pkgloc_sav),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/.save.%s", get_PKGLOC(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgloc_sav[0] && !access(pkgloc_sav, F_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) rrmdir(pkgloc_sav);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rename(pkgloc, pkgloc_sav) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGBINREN, pkgloc, pkgloc_sav);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: merg_pkginfos
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: This function scans the installed pkginfo and merges that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * environment with the installing environment according to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the following rules:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1. CLASSES is a union of the installed and installing CLASSES
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lists.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2. The installed BASEDIR takes precedence. If it doesn't agree
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with an administratively imposed BASEDIR, an ERROR is issued.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3. All other installing parameters are preserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4. All installed parameters are added if they do not overwrite
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * an existing installing parameter.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The current environment contains the pkginfo settings for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * new package to be installed or to be updated.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: pclass - returned list of current classes involved in install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mpclass - pointer to returned list of current install classes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == 0 - all OK
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 - an error code if a fatal error occurred
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmerg_pkginfos(struct cl_attr **pclass, struct cl_attr ***mpclass)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char SUNW_PKG_ALLZONES[MAX_PKG_PARAM_LENGTH] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char SUNW_PKG_HOLLOW[MAX_PKG_PARAM_LENGTH] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char SUNW_PKG_THISZONE[MAX_PKG_PARAM_LENGTH] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *newValue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *oldValue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgName;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgVersion;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char param[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginfo_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retcode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* obtain the name of the package (for error messages) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgName = getenv("PKG");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgName == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgName = "*current*"; /* default name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* obtain the version of the package (for error messages) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgVersion = getenv("VERSION");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgVersion == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgVersion = "*current*"; /* default version */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open installed package pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkginfo_path, sizeof (pkginfo_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", pkgloc, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(pkginfo_path, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINFO, pkginfo_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_ENTRY, pkginfo_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * cycle through the currently installed package's pkginfo parameters
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and let the currently installed package's settings survive if the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * update to the package does not provide an overriding value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (param[0] = '\0'; (oldValue = fpkgparam(fp, param)) != NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t setZoneAttribute = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* debug info - attribute currently set to value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_SET_TO, param, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if zone package attribute is present in the currently
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed package, then remember the value for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specific zone package attribute, and set the flag that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * indicates a zone package attribute is being processed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(param, PKG_THISZONE_VARIABLE) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* SUNW_PKG_THISZONE currently set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setZoneAttribute = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(SUNW_PKG_THISZONE, oldValue,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SUNW_PKG_THISZONE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcmp(param, PKG_ALLZONES_VARIABLE) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* SUNW_PKG_ALLZONES currently set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setZoneAttribute = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(SUNW_PKG_ALLZONES, oldValue,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SUNW_PKG_ALLZONES));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcmp(param, PKG_HOLLOW_VARIABLE) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* SUNW_PKG_THISZONE currently set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setZoneAttribute = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(SUNW_PKG_HOLLOW, oldValue,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (SUNW_PKG_HOLLOW));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle CLASSES currently being set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(param, "CLASSES") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_SET_CLASSES, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create a list of the current classes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) setlist(&pclass, qstrdup(oldValue));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set pointer to list of current classes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *mpclass = pclass;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle BASEDIR currently being set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp("BASEDIR", param) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (adm.basedir && *(adm.basedir) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strchr("/$", *(adm.basedir))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *dotptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Get srcinst down to a* name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dotptr = strchr(srcinst, '.')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *dotptr = '\000';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(oldValue, adm.basedir) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ADMBD, srcinst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland oldValue, adm.basedir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* administration */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = 4;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (ADM(basedir, "ask")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it's going to ask
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * later, let it know that it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *must* agree with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * BASEDIR we just picked up.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland adm.basedir = "update";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_ASK_BASEDIR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_SET_BASEDIR, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(param, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * determine if there is a new value for this attribute.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland newValue = getenv(param);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * If there is no new value, and a zone attribute
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is being changed, it is the same as setting the zone package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * attribute to 'false' - make sure current setting is 'false'.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((newValue == NULL) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (setZoneAttribute == B_TRUE) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcasecmp(oldValue, "false") != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unset existing non-"false" zone pkg attr */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MERGINFOS_UNSET_ZONEATTR,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgName, pkgVersion, param, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* retain old value if no new value specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (newValue == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no new value - retain the old value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_RETAIN_OLD, param, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(param, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* note if the old and new values are the same */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(newValue, oldValue) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set existing package parameter to same value */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_SET_DUPLICATE, param, oldValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * Check if old and new values differ.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Error if zone parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (setZoneAttribute == B_TRUE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* illegal change to zone attribute */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MERGINFOS_CHANGE_ZONEATTR, pkgName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgVersion, param, oldValue, newValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set return code to "fatal error" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* note valid change to existing package parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_SET_CHANGE, param,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland oldValue, newValue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close handle on currently installed package's pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if not successful up to this point */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retcode != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_EXIT, pkginfo_path, retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * verify that no zone attribute has been
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * set to an invalid value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* SUNW_PKG_ALLZONES */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore newValue = getenv(PKG_ALLZONES_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /*
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * complain if setting SUNW_PKG_ALLZONES to other than "false"
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((newValue != NULL) && (*SUNW_PKG_ALLZONES == '\0') &&
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (strcasecmp(newValue, "false") != 0)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* change ALLZONES from "true" to "false" (unset) */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore progerr(ERR_MERGINFOS_SET_ZONEATTR, pkgName,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore pkgVersion, PKG_ALLZONES_VARIABLE, newValue);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore return (1);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* SUNW_PKG_THISZONE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore newValue = getenv(PKG_THISZONE_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /*
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore * complain if setting SUNW_PKG_THISZONE to other than "false"
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((newValue != NULL) && (*SUNW_PKG_THISZONE == '\0') &&
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (strcasecmp(newValue, "false") != 0)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* change THISZONE from "true" to "false" (unset) */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore progerr(ERR_MERGINFOS_SET_ZONEATTR, pkgName,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore pkgVersion, PKG_THISZONE_VARIABLE, newValue);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore return (1);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* SUNW_PKG_HOLLOW */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore newValue = getenv(PKG_HOLLOW_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* complain if setting SUNW_PKG_HOLLOW to other than "false" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((newValue != NULL) && (*SUNW_PKG_HOLLOW == '\0') &&
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (strcasecmp(newValue, "false") != 0)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* change HOLLOW from "true" to 'false" (unset) */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore progerr(ERR_MERGINFOS_SET_ZONEATTR, pkgName,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore pkgVersion, PKG_HOLLOW_VARIABLE, newValue);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFOS_EXIT, pkginfo_path, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_dryrun_dir_loc(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Set pkg location to the dryrun directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGLOC(pkgdrtarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgloc, sizeof (pkgloc),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", get_PKGLOC(), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgbin, sizeof (pkgbin),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/install", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgsav, sizeof (pkgsav),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/save", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(ilockfile, sizeof (ilockfile),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/!I-Lock!", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(rlockfile, sizeof (rlockfile),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/!R-Lock!", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(savlog, sizeof (savlog),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/logs/%s", get_PKGADM(), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we are updating a pkg, then we need to copy the "old" pkgloc so that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * any scripts that got removed in the new version aren't left around. So we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * copy it here to .save.pkgloc, then in quit() we can restore our state, or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * remove it.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcp_pkgdirs(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dryrun_dir_loc();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we're not in dryrun mode and we can find an old set of package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files over which the new ones will be written, do the copy.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!in_dryrun_mode() && pkgloc[0] && !access(pkgloc, F_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgloc_sav, sizeof (pkgloc_sav), "%s/.save.%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_PKGLOC(), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Even though it takes a while, we use a recursive copy here
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * because if the current pkgadd fails for any reason, we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * don't want to lose this data.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = e_ExecCmdList(&status, (char **)NULL, (char *)NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/usr/bin/cp", "cp", "-r", pkgloc, pkgloc_sav,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((r != 0) || (status == -1) || (WEXITSTATUS(status) != 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGBINCP, pkgloc, pkgloc_sav);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This implements the pkgask function. It just executes the request script
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and stores the results in a response file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddo_pkgask(boolean_t a_run_request_as_root)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.cdevice) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unpack();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!suppressCopyright) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland copyright();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/%s", instdir, REQUEST_FILE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, F_OK)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NOREQUEST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) set_respfile(respfile, srcinst, RESP_WR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_a_respfile()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckreturn(reqexec(update, path, non_abi_scripts,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_run_request_as_root), ERR_REQUEST);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland failflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (warnflag || failflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(respfile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo("\nResponse file <%s> was not created.",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_respfile());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo("\nResponse file <%s> was created.",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_respfile());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function runs a check utility and acts appropriately based upon the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * return code. It deals appropriately with the dryrun file if it is present.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandck_w_dryrun(int (*func)(), int type)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = func();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (in_dryrun_mode())
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_dr_info(type, !n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function deletes all install class action scripts from the package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * directory on the root filesystem.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandrm_icas(char *cas_dir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DIR *pdirfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dirent *dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pdirfp = opendir(cas_dir)) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((dp = readdir(pdirfp)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dp->d_name[0] == '.')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dp->d_name[0] == 'i' && dp->d_name[1] == '.') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", cas_dir, dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) remove(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(pdirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandckreturn(int retcode, char *msg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (retcode) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 2:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 12:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 22:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland warnflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (msg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr("%s", msg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 10:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 20:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retcode >= 10 && retcode < 20) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dreboot++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retcode >= 20) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ireboot++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 0:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break; /* okay */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case -1:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = 99;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 99:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 1:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 11:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 21:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 4:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 14:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 24:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 5:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 15:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 25:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (msg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr("%s", msg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 3:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 13:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 23:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (msg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr("%s", msg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcopyright(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line[LSIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Compose full path for copyright file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/%s", instdir, COPYRIGHT_FILE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(path, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getenv("VENDOR") != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echo(getenv("VENDOR"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line, LSIZE, fp))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stdout, "%s", line); /* bug #1083713 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandrdonly(char *p)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; ro_params[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(p, ro_params[i]) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandunpack(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * read in next part from stream, even if we decide
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * later that we don't need it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dparts < 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_DSTREAMCNT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((access(instdir, F_OK) == 0) && rrmdir(instdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_RMDIR, instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(instdir, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_MKDIR, instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(instdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CHDIR, instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!ds_fd_open()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dparts = ds_findpkg(pkgdev.cdevice, srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dparts < 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_DSARCH, srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dparts--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_next(pkgdev.cdevice, instdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_DSTREAM);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(get_PKGADM())) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CHDIR, get_PKGADM());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_close(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandusage(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, ERR_USAGE_PKGINSTALL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}