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#define __EXTENTIONS__
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 <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/param.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.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 <sys/mman.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <instzones_api.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libadm.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkginfofind(char *path, char *pkg_dir, char *pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_USAGE "usage:\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s [-q] [-pi] [-x|l] [options] [pkg ...]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s -d device [-q] [-x|l] [options] [pkg ...]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "where\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -q #quiet mode\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -p #select partially installed packages\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -i #select completely installed packages\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -x #extracted listing\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -l #long listing\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -r #relocation base \n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "and options may include:\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -c category, [category...]\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -a architecture\n" \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -v version\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_INCOMP0 "-L and -l/-x/-r flags are incompatible"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_INCOMP1 "-l and -x/-r flags are not compatible"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_INCOMP2 "-x and -l/-r flags are not compatible"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_INCOMP3 "-r and -x/-x flags are not compatible"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOINFO "ERROR: information for \"%s\" was not found"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOPINFO "ERROR: No partial information for \"%s\" was found"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_BADINFO "pkginfo file is corrupt or missing"
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
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Format for dumping package attributes in dumpinfo() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FMT "%10s: %s\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define SFMT "%-11.11s %-*.*s %s\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CFMT "%*.*s "
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define XFMT "%-*.*s %s\n"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define nblock(size) ((size + (DEV_BSIZE - 1)) / DEV_BSIZE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAXCATG 64
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *device = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *parmlst[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "DESC", "PSTAMP", "INSTDATE", "VSTOCK", "SERIALNUM", "HOTLINE",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "EMAIL", NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int qflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int iflag = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pflag = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int lflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int Lflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int Nflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int xflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int rflag = 0; /* bug # 1081606 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfent entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char **pkg = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgcnt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *ckcatg[MAXCATG] = {NULL};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int ncatg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *ckvers = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *ckarch = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfstat {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginst[32];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short exec;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short dirs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short link;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short partial;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long spooled;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long installed;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short shared;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short setuid;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland long tblks;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfstat *next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland} *data;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkginfo info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfstat *fpkg(char *pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int iscatg(char *list);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int selectp(char *p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void usage(void), look_for_installed(void),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland report(void), rdcontents(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void pkgusage(struct cfstat *dp, struct cfent *pentry);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void getinfo(struct cfstat *dp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void dumpinfo(struct cfstat *dp, int pkgLngth);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmain(int argc, char **argv)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(NULL);
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 (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 /* 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 exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv, "LNR:xv:a:d:qrpilc:?")) != EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckvers = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'a':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckarch = optarg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* -d could specify stream or mountable device */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device = flex_device(optarg, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'q':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland qflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'i':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland iflag = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pflag > 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pflag = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iflag > 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland iflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'N':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland Nflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'L':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (xflag || lflag || rflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_INCOMP0));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland Lflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'l':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (xflag || rflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_INCOMP1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'x':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bug # 1081606 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lflag || rflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_INCOMP2));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'r':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lflag || xflag || Lflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_INCOMP0));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rflag++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ckcatg[ncatg++] = strtok(optarg, " \t\n, ");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (ckcatg[ncatg] = strtok(NULL, " \t\n, "))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ncatg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* added for newroot functions */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'R':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(optarg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_ROOT_CMD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland usage();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * implement the newroot option
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_PKGpaths(get_inst_root()); /* set up /var... directories */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Open the install DB, if one exists.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = &argv[optind];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgcnt = (argc - optind);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg[0] && strcmp(pkg[0], "all") == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgcnt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[0] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdir == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = get_PKGLOC(); /* we need this later */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert device appropriately */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkghead(device))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we are to inspect a spooled package we are only interested in
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * the pkginfo file in the spooled pkg. We have a spooled pkg if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * device is not NULL.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland look_for_installed();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (lflag && strcmp(pkgdir, get_PKGLOC()) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look at contents file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rdcontents();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we are to inspect a spooled package we are only interested in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the pkginfo file in the spooled pkg so we skip any Reg 4 DB
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * lookups and use the old algorithm. We have a spooled pkg if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * device is not NULL.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland report();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkghead(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errflg ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandreport(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfstat *dp, *choice;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pkgLgth = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int longestPkg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t output = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (;;) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice = (struct cfstat *)0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (dp = data; dp; dp = dp->next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgLgth = strlen(dp->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgLgth > longestPkg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland longestPkg = pkgLgth;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (dp = data; dp; dp = dp->next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get information about this package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dp->installed < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue; /* already used */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (Lflag && pkgcnt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice = dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!choice ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(choice->pkginst, dp->pkginst) > 0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice = dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!choice)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break; /* no more packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfo(&info, choice->pkginst, ckarch, ckvers)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice->installed = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Confirm that the pkginfo file contains the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * required information.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.name == NULL || *(info.name) == NULL ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.arch == NULL || *(info.arch) == NULL ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.version == NULL || *(info.version) == NULL ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.catg == NULL || *(info.catg) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_BADINFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* is it in an appropriate catgory? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscatg(info.catg)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice->installed = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pflag &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* don't include partially installed packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (choice->partial || (info.status == PI_PARTIAL) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (info.status == PI_UNKNOWN))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice->installed = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (!iflag && (info.status == PI_INSTALLED)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* don't include completely installed packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice->installed = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland output = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dumpinfo(choice, longestPkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland choice->installed = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgcnt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = selectp(choice->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i >= 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[i] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (qflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* If no package matched and no output produced set error flag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!output)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* verify that each package listed on command line was output */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < pkgcnt; ++i) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg[i]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!qflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pflag == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(ERR_NOPINFO), pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(ERR_NOINFO), pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkginfo(&info, NULL); /* free up all memory and open fds */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddumpinfo(struct cfstat *dp, int pkgLngth)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char category[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (qflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return; /* print nothing */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) puts((info.basedir) ? info.basedir : "none");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (Lflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) puts(info.pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (xflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(XFMT, pkgLngth, pkgLngth, info.pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.arch || info.version) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(CFMT, pkgLngth, pkgLngth, "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.arch)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf("(%s) ", info.arch);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.version)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf("%s", info.version);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf("\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!lflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.catg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sscanf(info.catg, "%[^, \t\n]", category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(category, "(unknown)");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(SFMT, category, pkgLngth, pkgLngth, info.pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.pkginst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "PKGINST", info.pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.name)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "NAME", info.name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lflag && info.catg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "CATEGORY", info.catg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lflag && info.arch)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "ARCH", info.arch);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.version)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "VERSION", info.version);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.basedir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "BASEDIR", info.basedir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (info.vendor)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) printf(FMT, "VENDOR", info.vendor);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore for (i = 0; parmlst[i]; ++i) {
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if ((pt = pkgparam(info.pkginst, parmlst[i])) != NULL && *pt)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(FMT, parmlst[i], pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (info.status == PI_SPOOLED)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(FMT, "STATUS", gettext("spooled"));
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore else if (info.status == PI_PARTIAL)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(FMT, "STATUS",
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore gettext("partially installed"));
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore else if (info.status == PI_INSTALLED)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(FMT, "STATUS",
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore gettext("completely installed"));
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore else
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(FMT, "STATUS", gettext("(unknown)"));
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) pkgparam(NULL, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!lflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putchar('\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (strcmp(pkgdir, get_PKGLOC()))
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore getinfo(dp);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->spooled)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%10s: %7ld spooled pathnames\n"),
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore "FILES", dp->spooled);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->installed)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%10s: %7ld installed pathnames\n"),
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore "FILES", dp->installed);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->partial)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d partially installed pathnames\n"),
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore dp->partial);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->shared)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d shared pathnames\n"), dp->shared);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->link)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d linked files\n"), dp->link);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->dirs)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d directories\n"), dp->dirs);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->exec)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d executables\n"), dp->exec);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->setuid)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d setuid/setgid executables\n"),
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore dp->setuid);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->info)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20d package information files\n"),
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore dp->info+1); /* pkgmap counts! */
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore if (dp->tblks)
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore (void) printf(gettext("%20ld blocks used (approx)\n"),
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore dp->tblks);
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putchar('\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfstat *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfpkg(char *pkginst)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfstat *dp, *last;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp = data;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland last = (struct cfstat *)0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (dp) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(dp->pkginst, pkginst) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (dp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland last = dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp = dp->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp = (struct cfstat *)calloc(1, sizeof (struct cfstat));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!dp) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext("no memory, malloc() failed"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!last)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland data = dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland last->next = dp; /* link list */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(dp->pkginst, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (dp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define SEPAR ','
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandiscatg(char *list)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int match;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!ckcatg[0])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0); /* no specification implies all packages */
9ab815e1e50104cb1004a5ccca7a6da582994b57Garrett D'Amore
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!list)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1); /* no category specified in pkginfo is a bug */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland match = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = strchr(list, ','))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; ckcatg[i]; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bug id 1081607 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strcasecmp(list, ckcatg[i++])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland match++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt++ = ',';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (match)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland list = pt; /* points to next one */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandlook_for_installed(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dirent *drp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DIR *dirfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((dirfp = opendir(pkgdir)) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (drp = readdir(dirfp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (drp->d_name[0] == '.')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgcnt && (selectp(drp->d_name) < 0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkginfofind(path, pkgdir, drp->d_name))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue; /* doesn't appear to be a package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkg(drp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(dirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandselectp(char *p)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < pkgcnt; ++i) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg[i] && pkgnmchk(p, pkg[i], 1) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (i);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandrdcontents(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfstat *dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik PKGserver server;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (!socfile(&server, B_TRUE) ||
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgopenfilter(server, pkgcnt == 1 ? pkg[0] : NULL) != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check the contents file to look for referenced packages */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik while ((n = srchcfile(&entry, "*", server)) > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (pinfo = entry.pinfo; pinfo; pinfo = pinfo->next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* see if entry is used by indicated packaged */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgcnt && (selectp(pinfo->pkg) < 0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp = fpkg(pinfo->pkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgusage(dp, &entry);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.npkgs > 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->shared++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Only objects specifically tagged with '!' event
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * character are considered "partial", everything
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * else is considered "installed" (even server
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * objects).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (pinfo->status) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '!' :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->partial++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->installed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *errstr = getErrstr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext("bad entry read in contents file"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("pathname: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (entry.path && *entry.path) ? entry.path : "Unknown");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("problem: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (errstr && *errstr) ? errstr : "Unknown");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pkgcloseserver(server);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetinfo(struct cfstat *dp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkgmap[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland VFP_T *vfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgmap, sizeof (pkgmap),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s/pkgmap", pkgdir, dp->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vfpOpen(&vfp, pkgmap, "r", VFP_NEEDNOW) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext("unable open \"%s\" for reading"), pkgmap);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->spooled = 1; /* pkgmap counts! */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((n = gpkgmapvfp(&entry, vfp)) > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->spooled++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgusage(dp, &entry);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *errstr = getErrstr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext("bad entry read in pkgmap file"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("pathname: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (entry.path && *entry.path) ? entry.path : "Unknown");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("problem: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (errstr && *errstr) ? errstr : "Unknown");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vfpClose(&vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpkgusage(struct cfstat *dp, struct cfent *pentry)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pentry->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->info++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (pentry->ftype == 'l') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->link++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pentry->ftype == 'd') || (pentry->ftype == 'x'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->dirs++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Only collect mode stats if they would be meaningful. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pentry->ainfo.mode != BADMODE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pentry->ainfo.mode & 06000)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->setuid++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strchr("dxcbp", pentry->ftype) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pentry->ainfo.mode & 0111))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->exec++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("ifve", pentry->ftype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->tblks += nblock(pentry->cinfo.size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandusage(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *prog = get_prog_name();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* bug # 1081606 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(ERR_USAGE), prog, prog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandquit(int retval)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exit(retval);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}