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/*
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
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 <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <assert.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <instzones_api.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libinst.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <messages.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* merg() return codes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MRG_SAME 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MRG_DIFFERENT 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MRG_REPLACE 2
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* typechg() return codes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TYPE_OK 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TYPE_WARNING 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TYPE_IGNORED 2
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TYPE_REPLACE 3
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TYPE_FATAL 4
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* message pool */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_OUTPUT "unable to update package database"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PINFO "missing pinfo structure for <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define INFO_PROCESS " %2ld%% of information processed; continuing ..."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTFILE "WARNING: %s <no longer a regular file>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTSYMLN "WARNING: %s <no longer a symbolic link>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTLINK "WARNING: %s <no longer a linked file>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTDIR "WARNING: %s <no longer a directory>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTCHAR "WARNING: %s <no longer a character special device>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTBLOCK "WARNING: %s <no longer a block special device>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_NOTPIPE "WARNING: %s <no longer a named pipe>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_TOEXCL "WARNING: cannot convert %s to an exclusive directory."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_ODDVERIFY "WARNING: quick verify disabled for class %s."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_TYPIGN "Object type change ignored."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_TYPE_ERR "Package attempts fatal object type change."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkginst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int nosetuid, nocnflct, otherstoo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* pkgobjmap.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int cp_cfent(struct cfent *cf_ent, struct cfextra *el_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* setlist.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void cl_def_dverify(int idx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar dbst = '\0'; /* usually set by installf() or removef() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint files_installed(void); /* return number of files installed. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int eptnum;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int installed; /* # of files, already properly installed. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pinfo *pkgpinfo = (struct pinfo *)0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int is_setuid(struct cfent *ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int is_setgid(struct cfent *ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int merg(struct cfextra *el_ent, struct cfent *cf_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int do_like_ent(VFP_T *vfpo, struct cfextra *el_ent,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfent *cf_ent, int ctrl);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int do_new_ent(VFP_T *vfpo, struct cfextra *el_ent, int ctrl);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9okstatic int typechg(struct cfent *el_ent, struct cfent *cf_ent,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct mergstat *mstat);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void set_change(struct cfextra *el_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void chgclass(struct cfent *cf_ent, struct pinfo *pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void output(VFP_T *vfpo, struct cfent *ent, struct pinfo *pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * This scans the extlist (pkgmap) and matches them to the database, copying
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * out the modified contents to the file at tmpfp. It updates the mergstat
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * structures and deals with administrative defaults regarding setuid and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * conflict.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikpkgdbmerg(PKGserver server, VFP_T *tmpvfp, struct cfextra **extlist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static struct cfent cf_ent; /* scratch area */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfextra *el_ent; /* extlist entry under review */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int changed;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int assume_ok = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent.pinfo = (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland installed = changed = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpRewind(tmpvfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik for (eptnum = 0; (el_ent = extlist[eptnum]) != NULL; eptnum++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If there's an entry in the extlist at this position,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * process that entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* Metafiles don't get merged. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if ((el_ent->cf_ent.ftype == 'i') ||
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (el_ent->cf_ent.ftype == 'n')) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik continue;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * Copy cfextra structure for duplicated paths.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * This is not just an optimization, it is
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * necessary for correct operation of algorithm.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if ((eptnum > 0) && (strncmp(el_ent->cf_ent.path,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik extlist[eptnum-1]->cf_ent.path, PATH_MAX) == 0)) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik memcpy(extlist[eptnum], extlist[eptnum-1],
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik sizeof (struct cfextra));
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik continue;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * Normally dbst comes to us from installf() or
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * removef() in order to specify their special
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * database status codes. They cannot implement a
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * quick verify (it just doesn't make sense). For
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * that reason, we can test to see if we already have
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * a special database status. If we don't (it's from
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * pkgadd) then we can test to see if this is calling
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * for a quick verify wherein we assume the install
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * will work and fix it if it doesn't. In that case
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * we set our own dbst to be ENTRY_OK.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (dbst == '\0') {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (cl_dvfy(el_ent->cf_ent.pkg_class_idx) ==
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik QKVERIFY) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik assume_ok = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * If we DO end up with an installf/quick
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * verify combination, we fix that by simply
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * denying the quick verify for this class.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * This forces everything to come out alright
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * by forcing the standard assumptions as
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * regards package database for the rest of
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * the load.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (cl_dvfy(el_ent->cf_ent.pkg_class_idx) ==
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik QKVERIFY) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext(WRN_ODDVERIFY),
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik cl_nam(el_ent->cf_ent.pkg_class_idx));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * Set destination verification to
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * default.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik cl_def_dverify(el_ent->cf_ent.pkg_class_idx);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * Comply with administrative requirements regarding
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * setuid/setgid processes.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (is_setuid(&(el_ent->cf_ent))) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik el_ent->mstat.setuid = 1;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (is_setgid(&(el_ent->cf_ent))) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik el_ent->mstat.setgid = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * If setuid/setgid processes are not allowed, reset
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * those bits.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (nosetuid && (el_ent->mstat.setgid ||
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik el_ent->mstat.setuid)) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik el_ent->cf_ent.ainfo.mode &= ~(S_ISUID | S_ISGID);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /* Search package database for this entry. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik n = srchcfile(&cf_ent, el_ent->cf_ent.path, server);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * If there was an error, note it and return an error
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * flag.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (n < 0) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik char *errstr = getErrstr();
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik progerr(ERR_CFBAD);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("pathname: %s"),
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (cf_ent.path && *cf_ent.path) ?
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik cf_ent.path : "Unknown");
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("problem: %s"),
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (errstr && *errstr) ? errstr : "Unknown");
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik return (-1);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * If there was a match, then merge them into a
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * single entry.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik } else if (n == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * If this package is overwriting a setuid or
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * setgid process, set the status bits so we
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * can inform the administrator.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (is_setuid(&cf_ent)) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik el_ent->mstat.osetuid = 1;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (is_setgid(&cf_ent)) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik el_ent->mstat.osetgid = 1;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * Detect if a symlink has changed to directory
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * If so mark all the files/dir supposed to be
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * iniside this dir, so that they are not miss
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * understood by do_new_ent later as already
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * installed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if ((cf_ent.ftype == 's') &&
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (el_ent->cf_ent.ftype == 'd')) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int i;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int plen = strlen(el_ent->cf_ent.path);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik for (i = eptnum + 1; extlist[i]; i++) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (strncmp(el_ent->cf_ent.path,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik extlist[i]->cf_ent.path,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik plen) != 0)
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik break;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik extlist[i]->mstat.parentsyml2dir
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (do_like_ent(tmpvfp, el_ent, &cf_ent, assume_ok)) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik changed++;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * The file doesn't exist in the database.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (do_new_ent(tmpvfp, el_ent, assume_ok)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errflg ? -1 : changed);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Merge a new entry with an installed package object of the same name and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * insert that object into the package database. Obey administrative defaults
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as regards conflicting files.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddo_like_ent(VFP_T *vfpo, struct cfextra *el_ent, struct cfent *cf_ent, int ctrl)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int stflag, ignore, changed, mrg_result;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ignore = changed = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Construct the record defining the current package. If there are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * other packages involved, this will be appended to the existing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * list. If this is an update of the same package, it will get merged
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with the existing record. If this is a preloaded record (like from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a dryrun file), it will keep it's current pinfo pointer and will
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pass it on to the record from the contents file - because on the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * final continuation, the contents file will be wrong.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->mstat.preloaded) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pkginfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Contents file is not to be trusted for this list. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfo = cf_ent->pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Free the potentially bogus list. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pkginfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland next = pkginfo->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(pkginfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfo = next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->pinfo = el_ent->cf_ent.pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo = eptstat(cf_ent, pkginst, DUP_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stflag = pkgpinfo->status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (otherstoo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.shared = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* If it's marked for erasure, make it official */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ftype == RM_RDY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!errflg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo = eptstat(cf_ent, pkginst, RM_RDY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get copy of status character in case the object is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "shared" by a server, in which case we need to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * maintain the shared status after the entry is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * written to the package database with RM_RDY
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * status. This is needed to support the `removef'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * command.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland stflag = pkgpinfo->status;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo->status = RM_RDY;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putcvfpfile(cf_ent, vfpo)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_OUTPUT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If object is provided by a server, allocate an
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * info block and set the status to indicate this.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This is needed to support the `removef' command.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stflag == SERVED_FILE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (struct pinfo *)calloc(1,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (struct pinfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo->next = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo->status = SERVED_FILE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If there is no package associated with it, there's something
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * very wrong.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkgpinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_PINFO), cf_ent->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not allow installation if nocnflct is set and other packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * reference this pathname. The cp_cfent() function below writes the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information from the installed file over the new entry, so the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package database will be unchanged.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * By the way, ftype "e" is often shared and that's OK, so ftype
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "e" doesn't count here.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((nocnflct && el_ent->mstat.shared && el_ent->cf_ent.ftype != 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * First set the attrchg and contchg entries for proper
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * messaging in the install phase.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_change(el_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now overwrite the new entry with the entry for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * currently installed object.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cp_cfent(cf_ent, el_ent) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ignore++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mrg_result = merg(el_ent, cf_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (mrg_result) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case MRG_SAME:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case MRG_DIFFERENT:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case MRG_REPLACE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We'll pick one or the other later. For now, cf_ent
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * will have the fault value and el_ent will retain
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the other value. This is the only state that allows
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the database and the pkgmap to differ.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1; /* subject to change */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ignore++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* el_ent structure now contains updated entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!el_ent->mstat.contchg && !ignore) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We know the DB entry matches the pkgmap, so now we need to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * see if the actual object matches the pkgmap.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_change(el_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!errflg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ctrl == 1) { /* quick verify assumes OK */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The pkgpinfo entry is already correctly
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * constructed. Look into dropping this soon.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo = eptstat(&(el_ent->cf_ent), pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ENTRY_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stflag != DUP_ENTRY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We could trust the prior pkginfo entry, but things
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * could have changed and we need to update the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fs_tab[] anyway. We check for a server object
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * here.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_served(el_ent->server_path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(el_ent->fsys_value)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo->status = SERVED_FILE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!ignore && el_ent->mstat.contchg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptstat(&(el_ent->cf_ent), pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (dbst ? dbst : CONFIRM_CONT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!ignore && el_ent->mstat.attrchg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptstat(&(el_ent->cf_ent), pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (dbst ? dbst : CONFIRM_ATTR));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!ignore && el_ent->mstat.shared) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eptstat(&(el_ent->cf_ent), pkginst,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dbst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (stflag != DUP_ENTRY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgpinfo = eptstat(&(el_ent->cf_ent),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst, '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stflag != ENTRY_OK) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mrg_result == MRG_REPLACE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Put the original package database entry back into
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package database for now.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland output(vfpo, cf_ent, pkgpinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Put the merged entry into the package database. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland output(vfpo, &(el_ent->cf_ent), pkgpinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgpinfo->aclass[0] != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(el_ent->cf_ent.pkg_class, pkgpinfo->aclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If a sym link entry exists in the contents file and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and the destination of the link does not exist on the the system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * then the contents file needs to be updated appropriately so a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * subsequent invocation of "installf -f" will create the destination.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->mstat.contchg && pkgpinfo->status == INST_RDY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(el_ent->mstat.preloaded))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If no change during the merg and we don't have a case where types
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * were different in odd ways, count this as installed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!el_ent->mstat.attrchg && !el_ent->mstat.contchg &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland !el_ent->mstat.replace)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland installed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (changed);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Insert an entirely new entry into the package database. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddo_new_ent(VFP_T *vfpo, struct cfextra *el_ent, int ctrl)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int changed = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ftype == RM_RDY) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tp = el_ent->server_path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Check the file/dir existence only if any of the parent directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the file/dir has not changed from symbolic link to directory.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * At this time we are only doing a dry run, the symlink is not yet
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * replaced, so if this is done directly then access will result in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * incorrect information in case a file with the same attr and cont
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * exists in the link target.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((!el_ent->mstat.parentsyml2dir) && (access(tp, F_OK) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Path exists, and although its not referenced by any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package we make it look like it is so it appears as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * conflicting file in case the user doesn't want it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * installed. We set the rogue flag to distinguish this from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package object conflicts if the administrator is queried
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * about this later. Note that noconflict means NO conflict
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * at the file level. Even rogue files count.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.shared = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.rogue = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland set_change(el_ent);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* since path doesn't exist, we're changing everything */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.rogue = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ainfo.mode == WILDCARD) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ftype == 'd') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.mode = DEFAULT_MODE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.mode = DEFAULT_MODE_FILE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(WRN_SET_DEF_MODE, el_ent->cf_ent.path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (int)el_ent->cf_ent.ainfo.mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(el_ent->cf_ent.ainfo.owner, DB_UNDEFINED_ENTRY) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(el_ent->cf_ent.ainfo.owner,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DEFAULT_OWNER);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(el_ent->cf_ent.ainfo.group, DB_UNDEFINED_ENTRY) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(el_ent->cf_ent.ainfo.group,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DEFAULT_GROUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Do not allow installation if nocnflct is set and this pathname is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * already in place. Since this entry is new (not associated with a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package), we don't issue anything to the database we're building.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nocnflct && el_ent->mstat.shared) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!errflg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->mstat.preloaded) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Add this package to the already established list. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = eptstat(&(el_ent->cf_ent), pkginst, DUP_ENTRY);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.npkgs = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = (struct pinfo *)calloc(1,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (struct pinfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MEMORY), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo = pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(pinfo->pkg, pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ctrl == 1) { /* quick verify assumes OK */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo->status = dbst ? dbst : ENTRY_OK;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The entry won't be verified, but the entry in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * database isn't necessarily ENTRY_OK. If this is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * coming from a server, we need to note that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * instead.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (is_served(el_ent->server_path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(el_ent->fsys_value)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo->status = SERVED_FILE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo->status = dbst ? dbst : CONFIRM_CONT;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland output(vfpo, &(el_ent->cf_ent), pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!el_ent->mstat.attrchg && !el_ent->mstat.contchg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland installed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (changed);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfiles_installed(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (installed);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function determines if there is a difference between the file on
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the disk and the file to be laid down. It set's mstat flags attrchg
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and contchg accordingly.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_change(struct cfextra *el_ent)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *tp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tp = el_ent->server_path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((el_ent->cf_ent.ftype == 'f') || (el_ent->cf_ent.ftype == 'e') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'v')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cverify(0, &(el_ent->cf_ent.ftype), tp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(el_ent->cf_ent.cinfo), 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!el_ent->mstat.contchg && !el_ent->mstat.attrchg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (averify(0, &(el_ent->cf_ent.ftype), tp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(el_ent->cf_ent.ainfo)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!el_ent->mstat.attrchg &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((el_ent->cf_ent.ftype == 'd') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'x') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'c') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'b') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'p'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = averify(0, &(el_ent->cf_ent.ftype), tp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(el_ent->cf_ent.ainfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == VE_ATTR)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (n && (n != VE_EXIST)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (!el_ent->mstat.attrchg &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((el_ent->cf_ent.ftype == 's') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'l'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = averify(0, &(el_ent->cf_ent.ftype), tp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(el_ent->cf_ent.ainfo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == VE_ATTR)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (n && (n == VE_EXIST)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandis_setuid(struct cfent *ent)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (((ent->ftype == 'f') || (ent->ftype == 'v') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ftype == 'e')) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ainfo.mode != BADMODE) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ainfo.mode != WILDCARD) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ainfo.mode & S_ISUID));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandis_setgid(struct cfent *ent)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (((ent->ftype == 'f') || (ent->ftype == 'v') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ftype == 'e')) && (ent->ainfo.mode != BADMODE) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ainfo.mode != WILDCARD) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ainfo.mode & S_ISGID) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ent->ainfo.mode & (S_IEXEC|S_IXUSR|S_IXOTH)));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *types[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "fev", /* type 1, regular files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "s", /* type 2, symbolic links */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "l", /* type 3, linked files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "dx", /* type 4, directories */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "c", /* type 5, character special devices */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "b", /* type 6, block special devices */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "p", /* type 7, named pipes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This determines if the ftype of the file on the disk and the file to be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * laid down are close enough. If they aren't, this either returns an error
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or displays a warning. This returns :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * TYPE_OK they're identical or close enough
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * TYPE_WARNING they're pretty close (probably no problem)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * TYPE_IGNORED the type change was not allowed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * TYPE_REPLACE to be reviewed later - in endofclass() maybe
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * TYPE_FATAL something awful happened
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9oktypechg(struct cfent *el_ent, struct cfent *cf_ent, struct mergstat *mstat)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, etype, itype, retcode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* If they are identical, return OK */
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok if (cf_ent->ftype == el_ent->ftype)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (TYPE_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If package database entry is ambiguous, set it to the new entity's
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ftype
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok if (cf_ent->ftype == BADFTYPE) {
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok cf_ent->ftype = el_ent->ftype;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (TYPE_OK); /* do nothing; not really different */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* If the new entity is ambiguous, wait for the verify */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->ftype == BADFTYPE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (TYPE_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If we're trying to convert an existing regular directory to an
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * exclusive directory, this is very dangerous. We will continue, but
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we will deny the conversion.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok if (el_ent->ftype == 'x' && cf_ent->ftype == 'd') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_TOEXCL), el_ent->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (TYPE_IGNORED);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland etype = itype = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Set etype to that of the new entity */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; types[i]; ++i) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr(types[i], el_ent->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland etype = i+1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Set itype to that in the package database. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; types[i]; ++i) {
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok if (strchr(types[i], cf_ent->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland itype = i+1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (itype == etype) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* same basic object type */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (TYPE_OK);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = TYPE_WARNING;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If a simple object (like a file) is overwriting a directory, mark
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * it for full inspection during installation.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (etype != 4 && itype == 4) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mstat->dir2nondir = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retcode = TYPE_REPLACE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* allow change, but warn user of possible problems */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (itype) {
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 1:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTFILE), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 2:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTSYMLN), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 3:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTLINK), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 4:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTDIR), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 5:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTCHAR), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 6:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTBLOCK), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok case 7:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok logerr(gettext(WRN_NOTPIPE), el_ent->path);
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok default:
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (retcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function takes el_ent (the entry from the pkgmap) and cf_ent (the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * entry from the package database) and merge them into el_ent. The rules
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are still being figured out, but the comments should make the approach
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pretty clear.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RETURN CODES:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * MRG_DIFFERENT The two entries are different and el_ent now contains
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the intended new entry to be installed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * MRG_SAME The two entries were identical and the old database
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * entry will be replaced unchanged.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * MRG_REPLACE One or the other entry will be used but the decision
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * has to be made at install time.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmerg(struct cfextra *el_ent, struct cfent *cf_ent)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n, changed = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We need to change the original entry to make it look like the new
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * entry (the eptstat() routine has already added appropriate package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information, but not about 'aclass' which may represent a change
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in class from the previous installation.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: elent->cf_ent.pinfo (the list of associated packages) is NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * upon entry to this function.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pinfo = cf_ent->pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dbst == INST_RDY && el_ent->cf_ent.ftype == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ftype = cf_ent->ftype;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Evaluate the ftype change. Usually the ftype won't change. If it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * does it may be easy (s -> f), not allowed (d -> x), so complex we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * can't figure it 'til later (d -> s) or fatal (a hook for later).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cf_ent->ftype != el_ent->cf_ent.ftype) {
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok n = typechg(&(el_ent->cf_ent), cf_ent, &(el_ent->mstat));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (n) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case TYPE_OK:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* This is an allowable change. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case TYPE_WARNING:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Not allowed, but leaving it as is is OK. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case TYPE_IGNORED:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_TYPIGN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cp_cfent(cf_ent, el_ent) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (MRG_SAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Future analysis will reveal if this is OK. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case TYPE_REPLACE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.replace = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (MRG_REPLACE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Kill it before it does any damage. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case TYPE_FATAL:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_TYPE_ERR));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Evaluate and merge the class. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cf_ent->pkg_class, el_ent->cf_ent.pkg_class)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we always allow a class change as long as we have
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * consistent ftypes, which at this point we must
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cf_ent->pkg_class, "?")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(pkgpinfo->aclass,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.pkg_class);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(el_ent->cf_ent.pkg_class,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->pkg_class);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland chgclass(&(el_ent->cf_ent), pkgpinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Evaluate and merge based upon the ftype of the intended package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * database entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((el_ent->cf_ent.ftype == 's') || (el_ent->cf_ent.ftype == 'l'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* If both have link sources, then they need to be merged. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cf_ent->ainfo.local && el_ent->cf_ent.ainfo.local) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If both sources are identical, the merge is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * already done.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cf_ent->ainfo.local,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.local) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Otherwise, if the pkgmap entry is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ambiguous, it will inherit the database
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(el_ent->cf_ent.ainfo.local,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "?") == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.local,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->ainfo.local,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PATH_MAX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (changed ? MRG_DIFFERENT : MRG_SAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (el_ent->cf_ent.ftype == 'e') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of edittable files are assumed to be changing
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * since some class action script will be doing the work and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we have no way of evaluating what it will actually do.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (((el_ent->cf_ent.ftype == 'f') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'v'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * For regular files, Look at content information; a BADCONT
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in any el_ent field indicates the contents are unknown --
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * since cf_ent is guaranteed to have a valid entry here (bad
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * assumption?) this function will recognize this as a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * change. The ambiguous el_ent values will be evaluated and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * set later.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
6e1ae2a33c618c4c2b14aec7d2f21743ddea5837Gary Pennington if (cf_ent->cinfo.size != el_ent->cf_ent.cinfo.size) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (cf_ent->cinfo.modtime !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.cinfo.modtime) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (cf_ent->cinfo.cksum != el_ent->cf_ent.cinfo.cksum) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (((el_ent->cf_ent.ftype == 'c') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (el_ent->cf_ent.ftype == 'b'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * For devices, if major or minor numbers are identical the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * merge is trivial. If the el_ent value is ambiguous (BAD),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the cf_ent value is inherited. Otherwise, the el_ent value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is preserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cf_ent->ainfo.major != el_ent->cf_ent.ainfo.major) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ainfo.major == BADMAJOR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.major =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->ainfo.major;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cf_ent->ainfo.minor != el_ent->cf_ent.ainfo.minor) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ainfo.minor == BADMINOR)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.minor =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->ainfo.minor;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.contchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * For mode, owner and group follow the same rules as above - if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * ambiguous, inherit, otherwise keep the new one.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cf_ent->ainfo.mode != el_ent->cf_ent.ainfo.mode) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++; /* attribute info is changing */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (el_ent->cf_ent.ainfo.mode == BADMODE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.mode = cf_ent->ainfo.mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (el_ent->cf_ent.ainfo.mode == WILDCARD) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If pkgmap has a '?' set for mode, use the mode from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the pkg DB (contents file).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->cf_ent.ainfo.mode = cf_ent->ainfo.mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cf_ent->ainfo.owner, el_ent->cf_ent.ainfo.owner) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++; /* attribute info is changing */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(el_ent->cf_ent.ainfo.owner, BADOWNER) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(el_ent->cf_ent.ainfo.owner,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->ainfo.owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cf_ent->ainfo.group, el_ent->cf_ent.ainfo.group) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland changed++; /* attribute info is changing */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(el_ent->cf_ent.ainfo.group, BADGROUP) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(el_ent->cf_ent.ainfo.group,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cf_ent->ainfo.group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland el_ent->mstat.attrchg = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (changed ? MRG_DIFFERENT : MRG_SAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This puts the current entry into the package database in the appropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * intermediate format for this stage of the installation. This also assures
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the correct format for the various package object ftypes, stripping the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * link name before storing a regular file and stuff like that.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandoutput(VFP_T *vfpo, struct cfent *ent, struct pinfo *pinfo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short svvolno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *svpt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output without volume information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svvolno = ent->volno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ent->volno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo->editflag = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((ent->ftype == 's') || (ent->ftype == 'l'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putcvfpfile(ent, vfpo)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_OUTPUT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* output without local pathname */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland svpt = ent->ainfo.local;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ent->ainfo.local = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putcvfpfile(ent, vfpo)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_OUTPUT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ent->ainfo.local = svpt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this entry represents a file which is being edited, we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * need to store in memory the fact that it is an edittable
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file so that when we audit it after installation we do not
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * worry about its contents; we do this by resetting the ftype
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to 'e' in the memory array which is later used to control
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the audit
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->editflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ent->ftype = 'e';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* restore volume information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ent->volno = svvolno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchgclass(struct cfent *cf_ent, struct pinfo *pinfo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *oldclass, newclass[CLSSIZ+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int newcnt, oldcnt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we use this routine to minimize the use of the aclass element by
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * optimizing the use of the cf_ent->pkg_class element
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(newclass, pinfo->aclass, sizeof (newclass));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland newcnt = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland oldclass = cf_ent->pkg_class;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland oldcnt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * count the number of times the newclass will be used and see if it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * exceeds the number of times the oldclass is referenced
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pp = cf_ent->pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pp) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pp->aclass[0] != '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(pp->aclass, newclass) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland newcnt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (strcmp(pp->aclass, oldclass) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland oldcnt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pp = pp->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (newcnt > oldcnt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pp = cf_ent->pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pp) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pp->aclass[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(pp->aclass, oldclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcmp(pp->aclass, newclass) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pp->aclass[0] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pp = pp->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(cf_ent->pkg_class, newclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}