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 1995 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglocs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_INVALID_CAS "%d is an invalid class action script type."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NO_NONE "Cannot find the default archive install script."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NO_PATH "No paths for finding class action scripts."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* setlist.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct cl_attr **cl_Classes;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int cl_NClasses;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *cl_nam(int idx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkg_has_arch;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Return the install class action script associated with this class index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcl_iscript(int idx)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cl_Classes && idx >= 0 && idx < cl_NClasses)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (cl_Classes[idx]->inst_script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This resets an input class action script pointer and the various
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * codes that are associated with special treatment available to a class
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * action script. It returns 1 if there was a script there in the first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * place and 0 if there wasn't.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcl_deliscript(int idx)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cl_Classes && idx >= 0 && idx < cl_NClasses)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cl_Classes[idx]->inst_script) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cl_Classes[idx]->inst_script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[idx]->inst_script = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[idx]->src_verify = DEFAULT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[idx]->dst_verify = DEFAULT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[idx]->relpath_2_CAS = DEFAULT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Return the remove class action script associated with this class index */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcl_rscript(int idx)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cl_Classes && idx >= 0 && idx < cl_NClasses)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (cl_Classes[idx]->rem_script);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This scans the admin directories for the class acton scripts associated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with the classes to be installed. It will look for install or remove
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * scripts and place appropriate pointers into the cl_Classes list. There's
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * no reason why it couldn't look for both except that I haven't seen a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * need for it yet.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfind_CAS(int CAS_type, char *pkgbin, char *instdir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (instdir == NULL || pkgbin == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NO_PATH));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (CAS_type == I_ONLY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < cl_NClasses; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Locate appropriate installation class action
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * script, if any; look on media for script,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * since it might be on the system due to a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * previous installation.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/install/i.%s", instdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_nam(i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, R_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/i.%s", pkgbin,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_nam(i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->inst_script = qstrdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/i.%s", PKGSCR, cl_nam(i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, R_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->inst_script = qstrdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Provide CAS to uncompress and distribute a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * compressed cpio archive for those older packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that don't include their own. This is the first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * point at which we know, it's an old package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * without all the various pkginfo items set.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The default script is provided for all classes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in an old package which do not have their own
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * class action script. These are the criteria used
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by the script that packs the archives.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/%s", PKGSCR, DEF_NONE_SCR);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg_has_arch &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->inst_script == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->src_verify = NOVERIFY;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->dst_verify = QKVERIFY;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->relpath_2_CAS = REL_2_CAS;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, R_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->inst_script =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland qstrdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NO_NONE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (CAS_type == R_ONLY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < cl_NClasses; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/install/r.%s", instdir,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_nam(i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, R_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/r.%s", pkgbin,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_nam(i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->rem_script = qstrdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(path, "%s/r.%s", PKGSCR, cl_nam(i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, R_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cl_Classes[i]->rem_script = qstrdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_INVALID_CAS), CAS_type);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function deals with the special case of an old WOS package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with a compressed cpio'd file set but no class action script.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We find out it doesn't have a CAS later in find_CAS() and deal
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with it then. The only reason for this variable is to let
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * findscripts() know to get the default script if it can't find it in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the usual places.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandis_WOS_arch(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_has_arch++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}