5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
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 WRN_F_SPOOL "WARNING: %s is spooled. Ignoring \"f\" argument"
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 "\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 Waterlandchar *pathlist[MAXPATHS], *ppathlist[MAXPATHS], pkgspool[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void setpathlist(char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void usage(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int checkmap(int, int, char *, char *, char *, char *, int);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int checkscripts(char *inst_dir, int silent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pkgfmt = 0; /* Makes more sense as a pointer, but */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* 18N is compromised. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize locale mechanism */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* determine program name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* establish installation root directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!set_inst_root(getenv("PKG_INSTALL_ROOT"))) {
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 /* bugId 4012147 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((uniTmp = getenv("PKG_NO_UNIFIED")) != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c = getopt(argc, argv, "Y:R:e:p:d:nLli:vaV:Mm:cqxfQP:?"))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pathlist[npaths] = strtok(NULL, " , ")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Allow admin to establish the client filesystem using a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * vfstab-like file of stable format.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((category = get_categories(catg_arg)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (is_not_valid_length(category)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (ppathlist[npaths] = strtok(NULL, " , ")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
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 /* Check for incompatible options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Check for root dir and device dir if set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* we're only supposed to list information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(pkgdir, all_pkgs, category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (pkgcnt = 0; pkg[pkgcnt] != NULL; pkgcnt++);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (catg_arg != NULL && optind < argc) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* read the environment for the pkgserver */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland environ = NULL; /* Sever the parent environment. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check for incompatible options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland put_path_params(); /* Restore what's needed. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* send pathtype if partial path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(0, (device != NULL), mapfile, envfile, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check for incompatible options */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((spooldir = devattr(device, "pathname")) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgtrans(device, spooldir, pkg, PT_SILENT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg = gpkglist(spooldir, all_pkgs, category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * At this point pkg[] is the list of packages to check. They
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are in directory format in spooldir.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; pkg[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(pkgspool, sizeof (pkgspool),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Here we check the install scripts. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("## Checking control scripts.\n"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Verify consistency with the pkgmap. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("## Checking package objects.\n"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE : checkmap() frees the environ data and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pointer when it's through with them.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(0, (device != NULL), file, envfile,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland put_path_params(); /* Restore what's needed. */
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 for (n = 0; ppathlist[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(1, (device != NULL), file, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(1, (device != NULL), file, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (checkmap(1, (device != NULL), file, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED: no return */
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#error "PATH_MAX changed, so we have a bug to fix"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (S_ISDIR(st.st_mode) || S_ISBLK(st.st_mode)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fscanf(fplist, "%1024s", pathname) == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* cleanup any temporary directories */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext(ERR_USAGE), prog, prog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*NOTREACHED*/