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/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 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 <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgtrans.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libadm.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAXPATHS 1024
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_CHK_STRM "Checking uninstalled stream format package " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "<%s> from <%s>\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_CHK_DIR "Checking uninstalled directory format package " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "<%s> from <%s>\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_NOTROOT "NOTE: \"root\" permission may be required to " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "validate all objects in the client filesystem."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_CONT "Continuing."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_F_SPOOL "WARNING: %s is spooled. Ignoring \"f\" argument"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_ROOT_SET "Could not set install root from the environment."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_ROOT_CMD "Command line install root contends with environment."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_IOPEN "unable to open input file <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_IEMPTY "no pathnames in file specified by -i option"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_POPTION "no pathname included with -p option"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PARTIAL_POPTION "no pathname included with -P option"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_MAXPATHS "too many pathnames in option list (limit is %d)"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOTROOT "You must be \"root\" for \"%s -f\" to" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "execute properly."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_SEL_PKG "No packages selected for verification."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CAT_LNGTH "The category argument exceeds the SVr4 ABI\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " defined maximum supported length of 16 characters."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CAT_FND "Category argument <%s> cannot be found."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CAT_INV "Category argument <%s> is invalid."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_TOO_MANY "too many pathnames in list, limit is %d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PATHS_INVALID "Pathnames in %s are not valid."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_MKDIR "unable to make directory <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_USAGE "usage:\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t%s [-l|vqacnxf] [-R rootdir] [-p path[, ...] | " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "-P path[, ...]]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t\t[-i file] [options]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t%s -d device [-f][-l|v] [-p path[, ...] | " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "-P path[, ...]]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t\t[-V ...] [-M] [-i file] [-Y category[, ...] | " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "pkginst [...]]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\twhere options may include ONE of the " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "following:\n " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t\t-m pkgmap [-e envfile]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t\tpkginst [...]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "\t\t-Y category[, ...]\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LINK 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar **pkg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint pkgcnt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *basedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pathlist[MAXPATHS], *ppathlist[MAXPATHS], pkgspool[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandshort used[MAXPATHS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandshort npaths;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct cfent **eptlist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint aflag = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint cflag = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint vflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint nflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint lflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint Lflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint fflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint xflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint qflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint Rflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint dflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *uniTmp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *mapfile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *spooldir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *tmpdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *envfile;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int map_client = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid quit(int);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void setpathlist(char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void usage(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char **environ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* checkmap.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int checkmap(int, int, char *, char *, char *, char *, int);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* scriptvfy.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int checkscripts(char *inst_dir, int silent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmain(int argc, char *argv[])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pkgfmt = 0; /* Makes more sense as a pointer, but */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* 18N is compromised. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char file[PATH_MAX+1],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *abi_sym_ptr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *vfstab_file = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *all_pkgs[4] = {"all", NULL};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **category = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *catg_arg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prog,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *Rvalue,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *dvalue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int dbcreate = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pathtype;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize locale mechanism */
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 /* determine program name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prog = set_prog_name(argv[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* establish installation root directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_ROOT_SET));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check if not ABI compliant mode */
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 /* bugId 4012147 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((uniTmp = getenv("PKG_NO_UNIFIED")) != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland map_client = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv, "Y:R:e:p:d:nLli:vaV:Mm:cqxfQP:?"))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pathlist[npaths] = strtok(optarg, " , ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pathlist[npaths++] == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_POPTION));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pathlist[npaths] = strtok(NULL, " , ")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (npaths++ >= MAXPATHS) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MAXPATHS),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MAXPATHS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dvalue = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dflag = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'M':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland map_client = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Allow admin to establish the client filesystem using a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 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 case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getuid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOTROOT), prog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'i':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setpathlist(optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'l':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'L':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland Lflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'x':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (aflag < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cflag < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'q':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland qflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cflag < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aflag = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (aflag < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cflag = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland envfile = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'm':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mapfile = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland Rvalue = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland Rflag = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'Y':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland catg_arg = strdup(optarg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((category = get_categories(catg_arg)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_CAT_INV), catg_arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_not_valid_length(category)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_CAT_LNGTH));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'Q':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dbcreate++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'P':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ppathlist[npaths] = strtok(optarg, " , ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ppathlist[npaths] == NULL) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ppathlist[npaths][0] == '-')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PARTIAL_POPTION));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland npaths++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (ppathlist[npaths] = strtok(NULL, " , ")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (npaths++ >= MAXPATHS) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MAXPATHS),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MAXPATHS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
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 /* Check for incompatible options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dflag && Rflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Check for root dir and device dir if set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (Rflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(Rvalue)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_ROOT_CMD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device = flex_device(dvalue, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lflag || Lflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* we're only supposed to list information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((cflag >= 0) || (aflag >= 0) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland qflag || xflag || fflag || nflag || vflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGpaths(get_inst_root());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (catg_arg != NULL && device == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (argc - optind) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(pkgdir, all_pkgs, category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_CAT_FND), catg_arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (pkgcnt = 0; pkg[pkgcnt] != NULL; pkgcnt++);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (catg_arg != NULL && optind < argc) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = &argv[optind];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgcnt = (argc - optind);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* read the environment for the pkgserver */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgserversetmode(DEFAULTMODE);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland environ = NULL; /* Sever the parent environment. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vcfile() == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapfile) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check for incompatible options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (device || pkgcnt)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland put_path_params(); /* Restore what's needed. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* send pathtype if partial path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pathtype = (ppathlist[0] != NULL) ? 1 : 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(0, (device != NULL), mapfile, envfile, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL, pathtype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (device) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check for incompatible options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((cflag >= 0) || (aflag >= 0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (qflag || xflag || nflag || envfile)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((spooldir = devattr(device, "pathname")) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland spooldir = device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(spooldir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = spooldir = qstrdup(tmpnam(NULL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_F_SPOOL), *pkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(spooldir, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MKDIR), spooldir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgtrans(device, spooldir, pkg, PT_SILENT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL, NULL))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (catg_arg != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(spooldir, all_pkgs, category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(spooldir, all_pkgs, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgfmt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (catg_arg != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(spooldir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgcnt ? pkg : all_pkgs, category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(spooldir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgcnt ? pkg : all_pkgs, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgfmt = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * At this point pkg[] is the list of packages to check. They
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are in directory format in spooldir.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (catg_arg != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_CAT_FND), catg_arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_SEL_PKG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland aflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; pkg[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char locenv[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgfmt)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext(MSG_CHK_DIR), pkg[n], device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext(MSG_CHK_STRM), pkg[n], device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgspool, sizeof (pkgspool),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", spooldir, pkg[n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(file, sizeof (file),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/install", pkgspool);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Here we check the install scripts. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("## Checking control scripts.\n"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) checkscripts(file, 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Verify consistency with the pkgmap. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("## Checking package objects.\n"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(file, sizeof (file),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/pkgmap", pkgspool);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(locenv, sizeof (locenv),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/pkginfo", pkgspool);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland envfile = locenv;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE : checkmap() frees the environ data and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pointer when it's through with them.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(0, (device != NULL), file, envfile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[n], NULL, 0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("## Checking is complete.\n"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (envfile)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland put_path_params(); /* Restore what's needed. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this is a check of a client of some sort, we'll need to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mount up the client's filesystems. If the caller isn't
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * root, this may not be possible.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_an_inst_root()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getuid()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_NOTROOT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_CONT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (get_mntinfo(map_client, vfstab_file))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland map_client = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (map_client)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mount_client();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(file, sizeof (file),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/contents", get_PKGADM());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ppathlist[0] != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; ppathlist[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(1, (device != NULL), file, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL, ppathlist[n], 1))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (pkg[0] != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(1, (device != NULL), file, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[0], NULL, 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(1, (device != NULL), file, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL, NULL, 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (map_client) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unmount_client();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(errflg ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED: no return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsetpathlist(char *file)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat st;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fplist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pathname[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This trap laid to catch a mismatch between the declaration above and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the hard-coded constant in the fscanf below
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if PATH_MAX != 1024
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#error "PATH_MAX changed, so we have a bug to fix"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(file, "-") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fplist = stdin;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fd = open(file, O_RDONLY)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_IOPEN), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fstat(fd, &st) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_IOPEN), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PATHS_INVALID), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fplist = fdopen(fd, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_IOPEN), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fscanf(fplist, "%1024s", pathname) == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pathname == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PATHS_INVALID), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pathlist[npaths] = qstrdup(pathname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (npaths++ > MAXPATHS) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TOO_MANY), MAXPATHS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (npaths == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_IEMPTY));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fplist);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandquit(int n)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* cleanup any temporary directories */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) chdir("/");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmpdir != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) rrmdir(tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkghead(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandusage(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prog = get_prog_name();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(ERR_USAGE), prog, prog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}