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/*
c89503b94fec417bd68636224a7ad71975b91dfb"Nagaraj Yedathore - Sun Microsystems - Bangalore India" * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
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 <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <malloc.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <time.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/param.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/mman.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/sysmacros.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgdev.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/statvfs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/utsname.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <instzones_api.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libadm.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char **environ, *pkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* mkpkgmap.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int mkpkgmap(char *outfile, char *protofile, char **cmdparam);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* splpkgmap.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int splpkgmap(struct cfent **eptlist, unsigned int eptnum,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *order[], ulong_t bsize, ulong_t frsize, fsblkcnt_t *plimit,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fsfilcnt_t *pilimit, fsblkcnt_t *pllimit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* scriptvfy.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int checkscripts(char *inst_dir, int silent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* libpkg/gpkgmap.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void setmapmode(int mode_no);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t valid_zone_attr(struct cfent **eptlist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MALSIZ 16
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NROOT 8
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define SPOOLDEV "spool"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_PROTOTYPE "## Building pkgmap from package prototype file.\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_PKGINFO "## Processing pkginfo file.\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_VOLUMIZE "## Attempting to volumize %d entries in pkgmap.\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_PACKAGE1 "## Packaging one part.\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_PACKAGEM "## Packaging %d parts.\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_VALSCRIPTS "## Validating control scripts.\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Other problems */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_MEMORY "memory allocation failure, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NROOT "too many paths listed with -r option, limit is %d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PKGINST "invalid package instance identifier <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PKGABRV "invalid package abbreviation <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_BADDEV "unknown or invalid device specified <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_TEMP "unable to obtain temporary file resources, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_DSTREAM "invalid device specified (datastream) <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_SPLIT "unable to volumize package"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_MKDIR "unable to make directory <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_SYMLINK "unable to create symbolic link for <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_OVERWRITE "must use -o option to overwrite <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_UMOUNT "unable to unmount device <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOPKGINFO "required pkginfo file is not specified in prototype " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_RDPKGINFO "unable to process pkginfo file <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PROTOTYPE "unable to locate prototype file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_STATVFS "unable to stat filesystem <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_WHATVFS "unable to determine or access output filesystem for " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "device <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_DEVICE "unable to find info for device <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_BUILD "unable to build pkgmap from prototype file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_ONEVOL "other packages found - package must fit on a single " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "volume"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOPARAM "parameter <%s> is not defined in <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PKGMTCH "PKG parameter <%s> does not match instance <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NO_PKG_INFOFILE "unable to open pkginfo file <%s>: %s"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_ALLZONES_AND_THISZONE "The package <%s> has <%s> = true " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "and <%s> = true: the package may " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "set either parameter to true, but " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "may not set both parameters to " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "true. NOTE: if the package " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "contains a request script, it is " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "treated as though it has " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "<SUNW_PKG_THISZONE> = true"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NO_ALLZONES_AND_HOLLOW "The package <%s> has <%s> = false " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "and <%s> = true: a hollow package " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "must also be set to install in all " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "zones"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PKGINFO_INVALID_OPTION_COMB "Invalid combinations of zone " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "parameters in pkginfo file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_USAGE "usage: %s [options] [VAR=value [VAR=value]] " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "[pkginst]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " where options may include:\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-o\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-a arch\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-v version\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-p pstamp\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-l limit\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-r rootpath\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-b basedir\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-d device\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t-f protofile\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_MISSINGDIR "WARNING: missing directory entry for <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_SETPARAM "WARNING: parameter <%s> set to \"%s\""
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_CLASSES "WARNING: unreferenced class <%s> in prototype file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LINK 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct pkgdev pkgdev; /* holds info about the installation device */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint started;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar pkgloc[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *basedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *root;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *rootlist[NROOT];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *t_pkgmap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *t_pkginfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfent *svept;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *protofile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic fsblkcnt_t limit = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic fsblkcnt_t llimit = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic fsfilcnt_t ilimit = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int overwrite,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nflag,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sflag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void ckmissing(char *path, char type);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void outvol(struct cfent **eptlist, unsigned int eptnum, int part,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nparts);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void trap(int n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void usage(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int slinkf(char *from, char *to);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmain(int argc, char *argv[])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct utsname utsbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct statvfs64 svfsb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfent **eptlist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland VFP_T *vfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c, n, found;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int part, nparts, npkgs, objects;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char param[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt, *value, *pkginst, *tmpdir, *abi_sym_ptr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland **cmdparam;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgvers;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgarch;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgcat;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void (*func)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t clock;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ulong_t bsize = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ulong_t frsize = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cl_attr **allclass = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cl_attr **order;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned int eptnum, i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize locale environment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) setlocale(LC_ALL, "");
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 (void) textdomain(TEXT_DOMAIN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize program name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
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 func = sigset(SIGINT, trap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (func != SIG_DFL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland func = sigset(SIGINT, func);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland func = sigset(SIGHUP, trap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setmapmode(MAPBUILD); /* variable binding */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (func != SIG_DFL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland func = sigset(SIGHUP, func);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland environ = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv, "osnp:l:r:b:d:f:a:v:?")) != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 's':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'o':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland overwrite++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PSTAMP", optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'l':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland llimit = strtoull(optarg, NULL, 10);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'r':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = strtok(optarg, " \t\n, ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootlist[n++] = flex_device(pt, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n >= NROOT) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NROOT), NROOT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pt = strtok(NULL, " \t\n, "));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootlist[n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland basedir = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland protofile = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device = flex_device(optarg, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("ARCH", optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("VERSION", optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
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 * Store command line variable assignments for later
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * incorporation into the environment.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cmdparam = &argv[optind];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Skip past equates. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (argv[optind] && strchr(argv[optind], '='))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland optind++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Confirm that the instance name is valid */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkginst = argv[optind]) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgnmchk(pkginst, "all", 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PKGINST), pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland argv[optind++] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (optind != argc)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = getenv("TMPDIR");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmpdir == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = P_tmpdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bug id 4244631, not ABI compliant */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland abi_sym_ptr = getenv("PKG_NONABI_SYMLINKS");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (abi_sym_ptr && (strncasecmp(abi_sym_ptr, "TRUE", 4) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_nonABI_symlinks();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (device == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device = devattr(SPOOLDEV, "pathname");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (device == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_DEVICE), SPOOLDEV);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (protofile == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access("prototype", 0) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland protofile = "prototype";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (access("Prototype", 0) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland protofile = "Prototype";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PROTOTYPE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (devtype(device, &pkgdev)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_BADDEV), device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.norewind) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_DSTREAM), device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&pkgdev, NULL, 0, 0, 1))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * convert prototype file to a pkgmap, while locating
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package objects in the current environment
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland t_pkgmap = tempnam(tmpdir, "tmpmap");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (t_pkgmap == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TEMP), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(MSG_PROTOTYPE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = mkpkgmap(t_pkgmap, protofile, cmdparam)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_BUILD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setmapmode(MAPNONE); /* All appropriate variables are now bound */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vfpOpen(&vfp, t_pkgmap, "r", VFP_NEEDNOW) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TEMP), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist = procmap(vfp, 0, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vfpClose(&vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Validate the zone attributes in pkginfo, before creation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!valid_zone_attr(eptlist)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINFO_INVALID_OPTION_COMB);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(MSG_PKGINFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; eptlist[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckmissing(eptlist[i]->path, eptlist[i]->ftype);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i]->ftype != 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(eptlist[i]->path, "pkginfo") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svept = eptlist[i];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (svept == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOPKGINFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptnum = i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * process all parameters from the pkginfo file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and place them in the execution environment
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(svept->ainfo.local, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_RDPKGINFO), svept->ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (value = fpkgparam(fp, param)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getenv(param) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(param, value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free((void *)value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland param[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add command line variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (*cmdparam && (value = strchr(*cmdparam, '=')) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *value = NULL; /* terminate the parameter */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland value++; /* value is now the value (not '=') */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam(*cmdparam++, value); /* store it in environ */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure parameters are valid */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) time(&clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = getenv("PKG")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgnmchk(pt, NULL, 0) || strchr(pt, '.')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PKGABRV), pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginst == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst = pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOPARAM), "PKG", svept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * verify consistency between PKG parameter and pkginst
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(param, sizeof (param), "%s.*", pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgnmchk(pkginst, param, 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PKGMTCH), pt, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgname = getenv("NAME")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOPARAM), "NAME", svept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckparam("NAME", pkgname))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgvers = getenv("VERSION")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* XXX - I18n */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED do not use cftime(); use strftime instead */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) cftime(buf, "\045m/\045d/\045Y", &clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("Dev Release %s"), buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("VERSION", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgvers = getenv("VERSION");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_SETPARAM), "VERSION", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckparam("VERSION", pkgvers))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgarch = getenv("ARCH")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) uname(&utsbuf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("ARCH", utsbuf.machine);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgarch = getenv("ARCH");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_SETPARAM), "ARCH", utsbuf.machine);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckparam("ARCH", pkgarch))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getenv("PSTAMP") == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* use octal value of '%' to fight sccs expansion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* XXX - I18n */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED do not use cftime(); use strftime instead */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) cftime(buf, "\045Y\045m\045d\045H\045M\045S", &clock);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) uname(&utsbuf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp), "%s%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland utsbuf.nodename, buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland putparam("PSTAMP", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_SETPARAM), "PSTAMP", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgcat = getenv("CATEGORY")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOPARAM), "CATEGORY", svept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckparam("CATEGORY", pkgcat))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * warn user of classes listed in package which do
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * not appear in CLASSES variable in pkginfo file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland objects = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; eptlist[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i]->ftype != 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland objects++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland addlist(&allclass, eptlist[i]->pkg_class);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pt = getenv("CLASSES")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (allclass && *allclass) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_setl(allclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_putl("CLASSES", allclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_SETPARAM), "CLASSES",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getenv("CLASSES"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_sets(qstrdup(pt));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (allclass && *allclass) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; allclass[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cl_idx(allclass[i]->name) != -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!found) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_CLASSES),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)allclass[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(MSG_VOLUMIZE), objects);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland order = (struct cl_attr **)0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = getenv("ORDER")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = qstrdup(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) setlist(&order, pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_putl("ORDER", order);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* stat the intended output filesystem to get blocking information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.dirname == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_WHATVFS), device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (statvfs64(pkgdev.dirname, &svfsb)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_STATVFS), pkgdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (bsize == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bsize = svfsb.f_bsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (frsize == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland frsize = svfsb.f_frsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (limit == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bavail is in terms of fragment size blocks - change
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to 512 byte blocks
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland limit = (fsblkcnt_t)(((fsblkcnt_t)frsize > 0) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland howmany(frsize, DEV_BSIZE) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland howmany(bsize, DEV_BSIZE)) * svfsb.f_bavail;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ilimit == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ilimit = (svfsb.f_favail > 0) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svfsb.f_favail : svfsb.f_ffree;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts = splpkgmap(eptlist, eptnum, (char **)order, bsize, frsize,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &limit, &ilimit, &llimit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts <= 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_SPLIT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; eptlist[i]; i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ppkgmap(eptlist[i], stdout);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgloc, sizeof (pkgloc), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdev.dirname, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isdir(pkgloc) && !overwrite) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_OVERWRITE), pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output all environment install parameters */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland t_pkginfo = tempnam(tmpdir, "pkginfo");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(t_pkginfo, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TEMP), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; environ[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isupper(*environ[i])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(environ[i], fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputc('\n', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland started++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) rrmdir(pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(pkgloc, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MKDIR), pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine how many packages already reside on the medium */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = pkgdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pt = fpkginst("all", NULL, NULL))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npkgs++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL); /* free resource usage */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts > 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdev.mount && npkgs) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_ONEVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * update pkgmap entry for pkginfo file, since it may
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * have changed due to command line or failure to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specify all neccessary parameters
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; eptlist[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i]->ftype != 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(eptlist[i]->path, "pkginfo") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svept = eptlist[i];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svept->ftype = '?';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svept->ainfo.local = t_pkginfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) cverify(0, &svept->ftype, t_pkginfo,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &svept->cinfo, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svept->ftype = 'i';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts > 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(MSG_PACKAGEM), nparts);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(MSG_PACKAGE1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (part = 1; part <= nparts; part++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((part > 1) && pkgdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgumount(&pkgdev)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_UMOUNT), pkgdev.mount);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&pkgdev, NULL, part, nparts, 1))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) rrmdir(pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(pkgloc, 0555)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MKDIR), pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland outvol(eptlist, eptnum, part, nparts);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Validate (as much as possible) the control scripts. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (part == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char inst_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(MSG_VALSCRIPTS));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(inst_path, sizeof (inst_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/install", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland checkscripts(inst_path, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED: no return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtrap(int n)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) signal(SIGINT, SIG_IGN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) signal(SIGHUP, SIG_IGN);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == SIGINT)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(3);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext("%s terminated (signal %d).\n"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_prog_name(), n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandoutvol(struct cfent **eptlist, unsigned int eptnum, int part, int nparts)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *svpt, *path, temp[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts > 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(" -- part %2d:\n"), part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (part == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* re-write pkgmap, but exclude local pathnames */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp), "%s/pkgmap", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(temp, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TEMP), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
c89503b94fec417bd68636224a7ad71975b91dfb"Nagaraj Yedathore - Sun Microsystems - Bangalore India" (void) fprintf(fp, ": %d %llu\n", nparts, limit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; eptlist[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svpt = eptlist[i]->ainfo.local;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strchr("sl", eptlist[i]->ftype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist[i]->ainfo.local = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ppkgmap(eptlist[i], fp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TEMP), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist[i]->ainfo.local = svpt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "%s\n", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp), "%s/pkginfo", pkgloc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (copyf(svept->ainfo.local, temp, svept->cinfo.modtime))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "%s\n", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < eptnum; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i]->volno != part)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("dxslcbp", eptlist[i]->ftype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i]->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i] == svept)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue; /* don't copy pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/install/%s", pkgloc,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist[i]->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path = temp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path = srcpath(pkgloc, eptlist[i]->path, part, nparts);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (slinkf(eptlist[i]->ainfo.local, path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (copyf(eptlist[i]->ainfo.local, path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist[i]->cinfo.modtime)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the package file attributes can be sync'd up with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the pkgmap, we fix the attributes here.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*(eptlist[i]->ainfo.owner) != '$' &&
fbde34ed705bd3e0be54fb73ceb0e689cba71312Norm Jacobs *(eptlist[i]->ainfo.group) != '$') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Clear dangerous bits. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist[i]->ainfo.mode=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (eptlist[i]->ainfo.mode & S_IAMB);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Make sure it can be read by the world and written
fbde34ed705bd3e0be54fb73ceb0e689cba71312Norm Jacobs * by the owner.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptlist[i]->ainfo.mode |= 0644;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strchr("in", eptlist[i]->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Set the safe attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland averify(1, &(eptlist[i]->ftype),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path, &(eptlist[i]->ainfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "%s\n", path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandckmissing(char *path, char type)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char **dir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static int ndir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, found;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dir == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dir = (char **)calloc(MALSIZ, sizeof (char *));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dir == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MEMORY), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("dx", type)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dir[ndir] = path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((++ndir % MALSIZ) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dir = (char **)realloc((void *)dir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ndir+MALSIZ)*sizeof (char *));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dir == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MEMORY), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dir[ndir] = (char *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt == '/')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pt = strchr(pt, '/')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < ndir; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(path, dir[i]) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!found) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_MISSINGDIR), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckmissing(qstrdup(path), 'd');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt++ = '/';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandslinkf(char *from, char *to)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = to;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pt = strchr(pt+1, '/')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(to) && mkdir(to, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MKDIR), to);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '/';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '/';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (symlink(from, to)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_SYMLINK), to);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandusage(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(ERR_USAGE), get_prog_name());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * valid_zone_attr: Validates the zone attributes specified in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginfo file for this package. The package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can not be created with certain combinations
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the attributes.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvalid_zone_attr(struct cfent **eptlist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *pkginfoFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t all_zones; /* pkg is "all zones" only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t is_hollow; /* pkg is "hollow" */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t this_zone; /* pkg is "this zone" only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginfoPath[PATH_MAX]; /* pkginfo file path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pkgInst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Path to pkginfo file within the package to be installed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland this_zone = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; eptlist[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (eptlist[i]->ftype != 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(eptlist[i]->path, "pkginfo") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(pkginfoPath, eptlist[i]->ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check to see if this package has a request script. If this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package does have a request script, then mark the package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for installation in this zone only. Any package with a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * request script cannot be installed outside of the zone the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgadd command is being run in, nor can such a package be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed as part of a new zone install. A new zone install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * must be non-interactive, which is required by all packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * integrated into the Solaris WOS.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If request file is set in prototype, then this_zone is TRUE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(eptlist[i]->path, "request") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland this_zone = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Gather information from the pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFP = fopen(pkginfoPath, "r");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfoFP == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NO_PKG_INFOFILE, pkginfoPath, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkgInst = fpkgparam(pkginfoFP, "PKG")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOPARAM), "PKG", pkginfoPath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Determine "HOLLOW" setting for this package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland is_hollow = pkginfoParamTruth(pkginfoFP, PKG_HOLLOW_VARIABLE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "true", B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Determine "ALLZONES" setting for this package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland all_zones = pkginfoParamTruth(pkginfoFP, PKG_ALLZONES_VARIABLE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "true", B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Determine "THISZONE" setting for this package, if no request file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!this_zone)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland this_zone = pkginfoParamTruth(pkginfoFP, PKG_THISZONE_VARIABLE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "true", B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Close pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(pkginfoFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Validate zone attributes based on information gathered,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and validate the three SUNW_PKG_ options:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -----------------------------|---------------|
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * <ALLZONES><HOLLOW><THISZONE> | If Allowed |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ----1------------------------|---------------|
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * F F F | OK |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * F F T | OK |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * F T * | NO |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ----2------------------------|---------------|
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * T F F | OK |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * T T F | OK |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * T * T | NO |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -----------------------------|---------------|
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkg "all zones" && "this zone" (#2) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (all_zones && this_zone) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_ALLZONES_AND_THISZONE, pkgInst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKG_ALLZONES_VARIABLE, PKG_THISZONE_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkg "!all zones" && "hollow" (#1) */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((!all_zones) && is_hollow) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_NO_ALLZONES_AND_HOLLOW, pkgInst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKG_ALLZONES_VARIABLE, PKG_HOLLOW_VARIABLE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}