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/*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <memory.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <locale.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "install.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libadm.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int Lflag, lflag, aflag, cflag, fflag, qflag, nflag, xflag, vflag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *basedir, *device, pkgspool[];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define NXTENTRY(P, VFP) (gpkgmapvfp((P), (VFP)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_SPOOLED "ERROR: unable to locate spooled object <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_NET_OBJ "It is remote and may be available from the network."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_RMHIDDEN "unable to remove hidden file"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_HIDDEN "ERROR: hidden file in exclusive directory"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *findspool(struct cfent *ept);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikstatic int xdir(int maptyp, VFP_T *vfp, PKGserver server, char *dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikckentry(int envflag, int maptyp, struct cfent *ept, VFP_T *vfp,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik PKGserver server)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int a_err, c_err,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *ir = get_inst_root();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype != 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (envflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mappath(2, ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!device)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland basepath(ept->path, maptyp ? NULL : basedir, ir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("sl", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (envflag) /* -e option */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mappath(2, ept->ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!RELATIVE(ept->ainfo.local)) { /* Absolute Path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!device) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 'l') /* Hard Link */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland basepath(ept->ainfo.local, NULL, ir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!RELATIVE(ept->ainfo.local)) /* Absolute Path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(ept->ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (envflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strchr("isl", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mapvar(2, ept->ainfo.owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mapvar(2, ept->ainfo.group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tputcfent(ept, stdout);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (Lflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (putcfile(ept, stdout));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (device) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("dxslcbp", ept->ftype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((path = findspool(ept)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(ERR_SPOOLED), ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the package file attributes are to be sync'd up with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the pkgmap, we fix the attributes here.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_err = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Clear dangerous bits. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.mode = (ept->ainfo.mode & S_IAMB);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Make sure the file is readable by the world and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * writeable by root.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.mode |= 0644;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strchr("in", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Set the safe attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_err = averify(fflag, &ept->ftype,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path, &ept->ainfo)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!qflag || (a_err != VE_EXIST)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("ERROR: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_err == VE_EXIST)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Report invalid modtimes by passing cverify a -1 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c_err = cverify((!fflag ? (-1) : fflag), &ept->ftype, path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &ept->cinfo, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c_err) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("ERROR: %s"), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_err = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (aflag && !strchr("in", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* validate attributes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_err = averify(fflag, &ept->ftype, ept->path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &ept->ainfo)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!qflag || (a_err != VE_EXIST)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("ERROR: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (maptyp && ept->pinfo->status ==
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SERVED_FILE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_NET_OBJ));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_err == VE_EXIST)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cflag && strchr("fev", ept->ftype) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (!nflag || ept->ftype != 'v') && /* bug # 1082144 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (!nflag || ept->ftype != 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* validate contents */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Report invalid modtimes by passing cverify a -1 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c_err = cverify((!fflag ? (-1) : fflag),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &ept->ftype, ept->path, &ept->cinfo, 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!qflag || (c_err != VE_EXIST)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!a_err)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("ERROR: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (maptyp && ept->pinfo->status ==
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SERVED_FILE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_NET_OBJ));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c_err == VE_EXIST)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (xflag && (ept->ftype == 'x')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* must do verbose here since ept->path will change */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path = strdup(ept->path);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (xdir(maptyp, vfp, server, path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(ept->path, path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vflag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, "%s\n", ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikxdir(int maptyp, VFP_T *vfp, PKGserver server, char *dirname)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland DIR *dirfp;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik char badpath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int dirfound;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int errflg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfent mine;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dirent *drp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void *pos;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (!maptyp)
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik pos = vfpGetCurrCharPtr(vfp); /* get current position in file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((dirfp = opendir(dirname)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext("unable to open directory <%s>"), dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = strlen(dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset((char *)&mine, '\0', sizeof (struct cfent));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((drp = readdir(dirfp)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(drp->d_name, ".") == NULL ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(drp->d_name, "..") == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (void) snprintf(badpath, sizeof (badpath), "%s/%s",
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik dirname, drp->d_name);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (!maptyp) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik dirfound = 0;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik while ((n = NXTENTRY(&mine, vfp)) != 0) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (n < 0) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik char *errstr = getErrstr();
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("ERROR: garbled entry"));
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("pathname: %s"),
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (mine.path && *mine.path) ?
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik mine.path : "Unknown");
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("problem: %s"),
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (errstr && *errstr) ? errstr :
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik "Unknown");
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik exit(99);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (strncmp(mine.path, dirname, len) ||
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik (mine.path[len] != '/'))
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik break;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (strcmp(drp->d_name, &mine.path[len+1]) ==
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik 0) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik dirfound++;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik break;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik vfpGetCurrCharPtr(vfp) = pos;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (dirfound)
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik continue;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik } else {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (srchcfile(&mine, badpath, server) == 1) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik while ((pinfo = mine.pinfo) != NULL) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik mine.pinfo = pinfo->next;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik free((char *)pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (fflag) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik if (unlink(badpath)) {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik errflg++;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("ERROR: %s"), badpath);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext(ERR_RMHIDDEN));
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik }
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik } else {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik errflg++;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext("ERROR: %s"), badpath);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik logerr(gettext(ERR_HIDDEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) closedir(dirfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfindspool(struct cfent *ept)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char path[2*PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char host[PATH_MAX+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(host, pkgspool);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(ept->path, "pkginfo"))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcat(host, "/install");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (ept->path[0] == '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcat(host, "/root");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcat(host, "/reloc");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/%s", host,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path + (ept->path[0] == '/'));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, 0) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ept->ftype != 'i') && (ept->volno > 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s.%d/%s", host, ept->volno,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path + (ept->path[0] == '/'));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, 0) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}