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 2007 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "install.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libadm.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkginstall.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "messages.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char instdir[], pkgbin[], pkgloc[], savlog[], *pkginst, **environ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char saveSpoolInstallDir[];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char pkgsav[]; /* pkginstall/main.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *infoloc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * flag definitions for each entry in table
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef unsigned int TBL_FLAG_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* no flag set */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FLAG_NONE ((TBL_FLAG_T)0x0000)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* exclude this attribute if found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FLAG_EXCLUDE ((TBL_FLAG_T)0x0001)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* this attribute must not change if found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FLAG_IDENTICAL ((TBL_FLAG_T)0x0002)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * macro to generate an entry in the table:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * TBL_ENTRY("PKGINFO_ATTRIBUTE=", FLAG_XXX)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * where:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "PKGINFO_ATTRIBUTE=" is the attribute to look for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FLAG_XXX is the action to perform when the attribute is found
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TBL_ENTRY(_Y_, _F_) { (_Y_), ((sizeof ((_Y_)))-1), (_F_) }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * table containing attributes that require special handling
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct _namelist {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *_nlName; /* attribute name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int _nlLen; /* attribute length */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_FLAG_T _nlFlag; /* attribute disposition flag */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef struct _namelist NAMELIST_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * These are attributes to be acted on in some way when a pkginfo file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * merged. This table MUST be in alphabetical order because it is searched
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * using a binary search algorithm.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic NAMELIST_T attrTbl[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("BASEDIR=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("CLASSES=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("CLIENT_BASEDIR=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("INST_DATADIR=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("PKG_CAS_PASSRELATIVE=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("PKG_DST_QKVERIFY=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("PKG_INIT_INSTALL=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("PKG_INSTALL_ROOT=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("PKG_SRC_NOVERIFY=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("SUNW_PKGCOND_GLOBAL_DATA=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("SUNW_PKG_ALLZONES=", FLAG_IDENTICAL),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("SUNW_PKG_DIR=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("SUNW_PKG_HOLLOW=", FLAG_IDENTICAL),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("SUNW_PKG_INSTALL_ZONENAME=", FLAG_EXCLUDE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland TBL_ENTRY("SUNW_PKG_THISZONE=", FLAG_IDENTICAL),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ATTRTBL_SIZE (sizeof (attrTbl) / sizeof (NAMELIST_T))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * While pkgsav has to be set up with reference to the server for package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * scripts, it has to be client-relative in the pkginfo file. This function
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is used to set the client-relative value for use in the pkginfo file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_infoloc(char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (path && *path) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_an_inst_root()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Strip the server portion of the path. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland infoloc = orig_path(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland infoloc = strdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmerginfo(struct cl_attr **pclass, int install_from_pspool)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DIR *pdirfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *pkginfoFP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char cmd[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginfoPath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int nc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int out;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove savelog from previous attempts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) unlink(savlog);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * create path to appropriate pkginfo file for the package that is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * already installed - is_spool_create() will be set (!= 0) if the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -t option is presented to pkginstall - the -t option is used to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * disable save spool area creation; do not spool any partial package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contents, that is, suppress the creation and population of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package save spool area (var/sadm/pkg/PKG/save/pspool/PKG). This
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * option is set only when a non-global zone is being created.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_spool_create() == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * normal package install (not a non-global zone install);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * use the standard installed pkginfo file for this package:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> /var/sadm/pkg/PKGINST/pkginfo
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as the source pkginfo file to scan.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(pkginfoPath, sizeof (pkginfoPath),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/var/sadm/pkg/%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((get_inst_root()) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(get_inst_root(), "/") != 0)) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_inst_root() : "", pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > sizeof (pkginfoPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((get_inst_root()) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(get_inst_root(), "/") != 0)) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_inst_root() : "/",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-global zone installation - use the "saved" pspool
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginfo file in the global zone for this package:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --> /var/sadm/install/PKG/save/pspool/PKG/pkginfo
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as the source pkginfo file to scan.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(pkginfoPath, sizeof (pkginfoPath), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstallDir, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > sizeof (pkginfoPath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstallDir, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, PATH_MAX, "%s/%s", pkgloc, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, pkgloc, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry debugging info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_ENTRY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland instdir ? instdir : "??",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((get_inst_root()) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(get_inst_root(), "/") != 0)) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_inst_root() : "??",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstallDir ? saveSpoolInstallDir : "??",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgloc ? pkgloc : "??", is_spool_create(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_info_basedir() ? get_info_basedir() : "??",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoPath, path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * open the pkginfo file:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if the source pkginfo file to check is the same as the merged one
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (e.g. /var/sadm/pkg/PKGINST/pkginfo) then do not open the source
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginfo file to "verify"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(pkginfoPath, path) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFP = (FILE *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_SAME, path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_DIFFERENT, pkginfoPath, path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfoFP = fopen(pkginfoPath, "r");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkginfoFP == (FILE *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(ERR_NO_PKG_INFOFILE, pkginst, pkginfoPath,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output packaging environment to create a pkginfo file in pkgloc[]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(path, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_OPEN_FOR_WRITING, path, strerror(errno));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output CLASSES attribute
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs("CLASSES=", fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pclass) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(pclass[0]->name, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 1; pclass[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc(' ', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(pclass[i]->name, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nc = cl_getn();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < nc; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int found = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pclass) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int j;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (j = 0; pclass[j]; ++j) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cl_nam(i) != NULL &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(cl_nam(i),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pclass[j]->name) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland found++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!found) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (out > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc(' ', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(cl_nam(i), fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland out++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE : BASEDIR below is relative to the machine that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * *runs* the package. If there's an install root, this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is actually the CLIENT_BASEDIR wrt the machine
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * doing the pkgadd'ing here. -- JST
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_a_basedir()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char *txs1 = "BASEDIR=";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(txs1, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(get_info_basedir(), fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs("BASEDIR=/", fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output all other environment attributes except those which
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are relevant only to install.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; environ[i] != (char *)NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *ep = environ[i];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int attrPos = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int incr = (ATTRTBL_SIZE >> 1)+1; /* searches possible */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pos = ATTRTBL_SIZE >> 1; /* start in middle */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NAMELIST_T *pp = (NAMELIST_T *)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * find this attribute in the table - accept the attribute if it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is outside of the bounds of the table; otherwise, do a binary
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * search looking for this attribute.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strncmp(ep, attrTbl[0]._nlName, attrTbl[0]._nlLen) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry < first entry in attribute table */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_LESS_THAN, ep,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrTbl[0]._nlName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strncmp(ep, attrTbl[ATTRTBL_SIZE-1]._nlName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrTbl[ATTRTBL_SIZE-1]._nlLen) > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* entry > last entry in attribute table */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_GREATER_THAN, ep,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrTbl[ATTRTBL_SIZE-1]._nlName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* first entry < entry < last entry in table: search */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_SEARCHING, ep,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrTbl[0]._nlName,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrTbl[ATTRTBL_SIZE-1]._nlName);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (incr > 0) { /* while possible to divide */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pp = &attrTbl[pos];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* compare current attr with this table entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = strncmp(pp->_nlName, ep, pp->_nlLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* break out of loop if match */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* save location/break if match found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrPos = pos;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no match search to next/prev half */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland incr = incr >> 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pos += (r < 0) ? incr : -incr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle excluded attribute found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((attrPos >= 0) && (pp->_nlFlag == FLAG_EXCLUDE)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* attribute is excluded */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_EXCLUDING, ep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* handle fixed attribute found */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkginfoFP != (FILE *)NULL) && (attrPos >= 0) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pp->_nlFlag == FLAG_IDENTICAL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* attribute must not change */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *src = ep+pp->_nlLen;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *trg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char theAttr[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* isolate attribute name only without '=' at end */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(theAttr, pp->_nlName, pp->_nlLen-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theAttr[pp->_nlLen-1] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* lookup attribute in installed package pkginfo file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rewind(pkginfoFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland trg = fpkgparam(pkginfoFP, theAttr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_ATTRCOMP, theAttr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland trg ? trg : "");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if target not found attribute is being added */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (trg == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINFO_ATTR_ADDED, pkginst, ep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* error if two values are not the same */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(src, trg) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGINFO_ATTR_CHANGED, pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland theAttr, src, trg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* attribute not excluded/has not changed - process */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((strncmp(ep, "PKGSAV=", 7) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs("PKGSAV=", fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(infoloc, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('/', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(pkginst, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs("/save\n", fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((strncmp(ep, "UPDATE=", 7) == 0) &&
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore install_from_pspool != 0 &&
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore !isUpdate()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland echoDebug(DBG_MERGINFO_FINAL, ep);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fputs(ep, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) putc('\n', fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(pkginfoFP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * copy all packaging scripts to appropriate directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, PATH_MAX, "%s/install", instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, instdir, "/install");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pdirfp = opendir(path)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dirent *dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((dp = readdir(pdirfp)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dp->d_name[0] == '.')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, PATH_MAX, "%s/install/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland instdir, dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_3, instdir, "/install/",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(temp, PATH_MAX, "%s/%s", pkgbin,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, pkgbin, dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cppath(MODE_SRC|DIR_DISPLAY, path, temp, 0644)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_COPY, dp->d_name, pkgbin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(pdirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * copy all packaging scripts to the partial spool directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!is_spool_create()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* packages are being spooled to ../save/pspool/.. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, PATH_MAX, "%s/install", instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, instdir, "/install");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((pdirfp = opendir(path)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dirent *dp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((dp = readdir(pdirfp)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dp->d_name[0] == '.')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Don't copy i.none since if it exists it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contains Class Archive Format procedure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for installing archives. Only Directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Format packages can exist
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in a global spooled area.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(dp->d_name, "i.none") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, PATH_MAX, "%s/install/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland instdir, dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_3, instdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/install/", dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(temp, PATH_MAX, "%s/install/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstallDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > PATH_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_3,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstallDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "/install/", dp->d_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cppath(MODE_SRC, path, temp, 0644)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_COPY, path, temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(pdirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(pdirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now copy the original pkginfo and pkgmap files from the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installing package to the spooled directory.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, sizeof (path), "%s/%s", instdir, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > sizeof (path)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, instdir, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(temp, sizeof (temp), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland saveSpoolInstallDir, PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > sizeof (temp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, saveSpoolInstallDir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cppath(MODE_SRC, path, temp, 0644)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CANNOT_COPY, path, temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore i = snprintf(path, sizeof (path), "%s/pkgmap", instdir);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (i > sizeof (path)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore progerr(ERR_CREATE_PATH_2, instdir, "pkgmap");
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore quit(1);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore i = snprintf(temp, sizeof (temp), "%s/pkgmap",
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore saveSpoolInstallDir);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (i > sizeof (path)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore progerr(ERR_CREATE_PATH_2, saveSpoolInstallDir,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "pkgmap");
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore quit(1);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (cppath(MODE_SRC, path, temp, 0644)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore progerr(ERR_CANNOT_COPY, path, temp);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we are installing from a spool directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * copy the save directory from it, it may have
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * been patched. Duplicate it only if this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installation isn't an update and is not to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * an alternate root.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strstr(instdir, "pspool") != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(path, sizeof (path), "%s/save", instdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > sizeof (path)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_CREATE_PATH_2, instdir, "save");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((stat(path, &status) == 0) && (status.st_mode & S_IFDIR)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = snprintf(cmd, sizeof (cmd), "cp -pr %s/* %s",
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore path, pkgsav);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (i > sizeof (cmd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_SNPRINTF, "cp -pr %s/* %s");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (system(cmd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_PKGBINCP, path, pkgsav);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}