5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkginfo.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 char *basedir, *root, *rootlist[], **environ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * IMPORTANT NOTE: PLEASE SEE THE DEFINITION OF temp[] BELOW BEFORE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CHANGING THE DEFINITION OF PATH_LGTH!!!!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PATH_LGTH 4096
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAXPARAMS 256
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NRECURS 20
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_BPARAMC "parametric class specification for <%s> not allowed"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_SRCHLOC "no object for <%s> found in local path"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_SRCHSRCH "no object for <%s> found in search path"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_SRCHROOT "no object for <%s> found in root directory"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_CONTENTS "unable to process contents of object <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_WRITE "write of entry failed, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_GARBDEFLT "garbled default settings: %s"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_BANG "unknown directive: %s"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_CHDIR "unable to change directory to <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_INCOMPLETE "processing of <%s> may be incomplete"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_NRECURS "too many levels of include (limit is %d)"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_RDINCLUDE "unable to process include file <%s>, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_IGNINCLUDE "ignoring include file <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MSG_NODEVICE "device numbers cannot be determined for <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_BADATTR "WARNING: attributes set to %04o %s %s for <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_BADATTRM "WARNING: attributes set to %s %s %s for <%s>"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WRN_FAKEBD "WARNING: parametric paths may ignore BASEDIR"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_TEMP "unable to obtain temporary file resources, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_ENVBUILD "unable to build parameter environment, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_MAXPARAMS "too many parameter definitions (limit is %d)"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_GETCWD "unable to get current directory, errno=%d"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_PATHVAR "cannot resolve all build parameters associated with " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "path <%s>."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfent entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FILE *fp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *sfp[20];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *dname[NRECURS],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *params[256],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *proto[NRECURS],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *rootp[NRECURS][16],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *srchp[NRECURS][16],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d_own[NRECURS],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d_grp[NRECURS],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *rdonly[256];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic mode_t d_mod[NRECURS];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int nfp = (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int nrdonly = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *separ = " \t\n, ";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* libpkg/gpkgmap.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void attrpreset(int mode, char *owner, char *group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void attrdefault();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *findfile(char *path, char *local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *srchroot(char *path, char *copy);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int popenv(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int doattrib(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void doinclude(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void dorsearch(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void dosearch(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void error(int flag);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void lputenv(char *s);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void pushenv(char *file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void translate(register char *pt, register char *copy);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmkpkgmap(char *outfile, char *protofile, char **envparam)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *tmpfp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt, *path, mybuff[PATH_LGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **envsave;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c, fakebasedir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: THE SIZE OF temp IS HARD CODED INTO CALLS TO fscanf.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * YOU *MUST* MAKE SURE TO CHANGE THOSE CALLS IF THE SIZE OF temp
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * IS EVER CHANGED!!!!!!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[PATH_LGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((tmpfp = fopen(outfile, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_TEMP), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland envsave = environ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland environ = params; /* use only local environ */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrdefault(); /* assume no default attributes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Environment parameters are optional, so variable
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (envparam[i]) could be NULL.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; (envparam[i] != NULL) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pt = strchr(envparam[i], '=')); i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rdonly[nrdonly++] = qstrdup(envparam[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '=';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putenv(qstrdup(envparam[i]))) { /* bugid 1090920 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_ENVBUILD), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nrdonly >= MAXPARAMS) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_MAXPARAMS), MAXPARAMS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pushenv(protofile);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandagain:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fakebasedir = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (!feof(fp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isspace(c))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '#') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do c = getc(fp); while ((c != EOF) && (c != '\n'));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == EOF)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '!') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * IMPORTANT NOTE: THE SIZE OF temp IS HARD CODED INTO
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the FOLLOWING CALL TO fscanf -- YOU MUST CHANGE THIS
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * LINE IF THE SIZE OF fscanf IS EVER CHANGED!!!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fscanf(fp, "%4096s", temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(temp, "include") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland doinclude();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (strcmp(temp, "rsearch") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dorsearch();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (strcmp(temp, "search") == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dosearch();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (strcmp(temp, "default") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (doattrib())
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strchr(temp, '=')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland translate(temp, mybuff);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* put this into the local environment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lputenv(mybuff);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fscanf(fp, "%*[^\n]"); /* rest of line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fscanf(fp, "\n"); /* rest of line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_BANG), temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fscanf(fp, "%*[^\n]"); /* read of line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fscanf(fp, "\n"); /* read of line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((n = gpkgmap(&entry, fp)) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *errstr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errstr = getErrstr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("garbled entry"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("- pathname: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (entry.path && *entry.path) ? entry.path :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "Unknown");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext("- problem: %s"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (errstr && *errstr) ? errstr : "Unknown");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break; /* done with file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* don't allow classname to be parametric */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.ftype != 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.pkg_class[0] == '$') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_BPARAMC), entry.path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("dxlscbp", entry.ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We don't need to search for things without any
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contents in them.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("cb", entry.ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.ainfo.major == BADMAJOR ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.minor == BADMINOR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_NODEVICE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path = findfile(entry.path, entry.ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.local = path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("fevin?", entry.ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cverify(0, &entry.ftype, path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &entry.cinfo, 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_CONTENTS), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Warn if attributes are not set correctly. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!strchr("isl", entry.ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int dowarning = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int hasbadmode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.ainfo.mode == NOMODE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.mode = CURMODE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dowarning = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hasbadmode = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(entry.ainfo.owner, NOOWNER) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(entry.ainfo.owner, CUROWNER,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (entry.ainfo.owner));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dowarning = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(entry.ainfo.group, NOGROUP) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(entry.ainfo.group, CURGROUP,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (entry.ainfo.group));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dowarning = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dowarning) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (hasbadmode)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_BADATTRM),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "?",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.owner,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.group,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_BADATTR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (int)entry.ainfo.mode,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.owner,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.group,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Resolve build parameters (initial lower case) in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the link and target paths.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("ls", entry.ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!RELATIVE(entry.ainfo.local) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PARAMETRIC(entry.ainfo.local)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mappath(1, entry.ainfo.local)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(ERR_PATHVAR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry.ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(entry.ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Warn if top level file or directory is an install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.ftype != 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.path[0] == '$' && isupper(entry.path[1]))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fakebasedir = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mappath(1, entry.path)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(ERR_PATHVAR), entry.path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(entry.path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ppkgmap(&entry, tmpfp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_WRITE), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fakebasedir) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(WRN_FAKEBD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fakebasedir = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (popenv())
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto again;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(tmpfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland environ = envsave; /* restore environment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (errflg ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfindfile(char *path, char *local)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char host[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[PATH_MAX], *basename;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * map any parameters specified in path to their corresponding values
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and make sure the path is in its canonical form; any parmeters for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * which a value is not defined will be left unexpanded. Since this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is an actual search for a real file (which will not end up in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package) - we map ALL variables (both build and Install).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(temp, (local && local[0] ? local : path), sizeof (temp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mappath(0, temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *host = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rootlist[0] || (basedir && (*temp != '/'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * search for path in the pseudo-root/basedir directory; note
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that package information files should NOT be included in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this list
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (entry.ftype != 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (srchroot(temp, host));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* looking for local object file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (local && *local) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland basepath(temp, dname[nfp], NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it equals "/dev/null", that just means it's an empty
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file. Otherwise, we'll really be writing stuff, so we need
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to verify the source.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(temp, "/dev/null") != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(temp, &statbuf) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland !(statbuf.st_mode & S_IFREG)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_SRCHLOC), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(host, temp, sizeof (host));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (host);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; rootp[nfp][i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(host, sizeof (host), "%s/%s", rootp[nfp][i],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland temp + (*temp == '/' ? 1 : 0));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((stat(host, &statbuf) == 0) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (statbuf.st_mode & S_IFREG)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (host);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = strrchr(temp, '/');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pt++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = temp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland basename = pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; srchp[nfp][i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(host, sizeof (host), "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srchp[nfp][i], basename);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((stat(host, &statbuf) == 0) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (statbuf.st_mode & S_IFREG)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (host);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check current directory as a last resort */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(host, sizeof (host), "%s/%s", dname[nfp], basename);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((stat(host, &statbuf) == 0) && (statbuf.st_mode & S_IFREG))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (host);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_SRCHSRCH), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddosearch(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[PATH_MAX], lookpath[PATH_MAX], *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fgets(temp, PATH_MAX, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland translate(temp, lookpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; srchp[nfp][n]; n++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(srchp[nfp][n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = strtok(lookpath, separ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt && *pt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt != '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make relative path an absolute directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", dname[nfp], pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = temp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srchp[nfp][n++] = qstrdup(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pt = strtok(NULL, separ));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srchp[nfp][n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddorsearch(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[PATH_MAX], lookpath[PATH_MAX], *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fgets(temp, PATH_MAX, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland translate(temp, lookpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; rootp[nfp][n]; n++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rootp[nfp][n]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = strtok(lookpath, separ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt != '/') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make relative path an absolute directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, sizeof (temp),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", dname[nfp], pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = temp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootp[nfp][n++] = qstrdup(pt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pt = strtok(NULL, separ));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootp[nfp][n] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function reads the default mode, owner and group from the prototype
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and makes that available.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddoattrib(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt, attrib[PATH_MAX], *mode_ptr, *owner_ptr, *group_ptr, *eol;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char owner[ATRSIZ+1], group[ATRSIZ+1], attrib_save[(4*ATRSIZ)];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fgets(attrib, PATH_MAX, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(attrib_save, attrib, sizeof (attrib_save));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now resolve any variables that may be present. Start on group and
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * move backward since that keeps the resolved string from
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * overwriting any of the other entries. This is required since
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mapvar() writes the resolved string over the string provided.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mode_ptr = strtok(attrib, " \t");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland owner_ptr = strtok(NULL, " \t");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland group_ptr = strtok(NULL, " \t\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland eol = strtok(NULL, " \t\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strtok(NULL, " \t\n")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* extra tokens on the line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_GARBDEFLT), (eol) ? eol :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("unreadable at end of line"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (group_ptr && mapvar(1, group_ptr) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(group, group_ptr, ATRSIZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_GARBDEFLT), (attrib_save) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((attrib_save[0]) ? attrib_save : gettext("none")) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("unreadable at group"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (owner_ptr && mapvar(1, owner_ptr) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(owner, owner_ptr, ATRSIZ);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_GARBDEFLT), (attrib_save) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((attrib_save[0]) ? attrib_save : gettext("none")) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("unreadable at owner"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * For mode, don't use scanf, since we want to force an octal
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * interpretation and need to limit the length of the owner and group
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * specifications.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mode_ptr && mapvar(1, mode_ptr) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mode = strtol(mode_ptr, &pt, 8);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_GARBDEFLT), (attrib_save) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((attrib_save[0]) ? attrib_save : gettext("none")) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland gettext("unreadable at mode"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* free any previous memory from qstrdup */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (d_own[nfp])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(d_own[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (d_grp[nfp])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(d_grp[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_mod[nfp] = mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_own[nfp] = qstrdup(owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_grp[nfp] = qstrdup(group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland attrpreset(d_mod[nfp], d_own[nfp], d_grp[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddoinclude(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char file[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fgets(temp, PATH_MAX, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * IMPORTANT NOTE: THE SIZE OF temp IS HARD CODED INTO THE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FOLLOWING CALL TO fscanf -- YOU MUST CHANGE THIS LINE IF
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * THE SIZE OF fscanf IS EVER CHANGED!!!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sscanf(temp, "%1024s", file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland translate(file, temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*temp == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (*temp != '/')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(file, sizeof (file), "%s/%s", dname[nfp], temp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(file, temp, sizeof (file));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pushenv(file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This does what mappath() does except that it does it for ALL variables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * using whitespace as a token separator. This is used to resolve search
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * paths and assignment statements. It doesn't effect the build versus
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * install decision made for pkgmap variables.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtranslate(register char *pt, register char *copy)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt2, varname[MAX_PKG_PARAM_LENGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtoken:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* eat white space */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isspace(*pt))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (*pt && !isspace(*pt)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt == '$') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt2 = varname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (*++pt && !strchr("/= \t\n\r", *pt))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt2++ = *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt2 = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt2 = getenv(varname)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (*pt2)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *copy++ = *pt2++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *copy++ = *pt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*pt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *copy++ = ' ';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto token;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *copy = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanderror(int flag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char *lasterr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (lasterr != proto[nfp]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lasterr = proto[nfp];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, gettext("ERROR in %s:\n"), lasterr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (flag)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Set up defaults and change to the build directory. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpushenv(char *file)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char topdir[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((nfp+1) >= NRECURS) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_NRECURS), NRECURS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_IGNINCLUDE), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(file, "-") == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fp = stdin;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((fp = fopen(file, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_RDINCLUDE), file, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nfp >= 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_IGNINCLUDE), file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fp = sfp[nfp];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sfp[++nfp] = fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srchp[nfp][0] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rootp[nfp][0] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_mod[nfp] = (mode_t)(-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_own[nfp] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_grp[nfp] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!nfp) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* upper level proto file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland proto[nfp] = file;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (file[0] == '/')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = strcpy(topdir, file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* path is relative to the prototype file specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = getcwd(NULL, PATH_MAX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_GETCWD), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(topdir, sizeof (topdir),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/%s", pt, file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = strrchr(topdir, '/'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0'; /* should always happen */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (topdir[0] == '\0')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(topdir, "/", sizeof (topdir));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dname[nfp] = topdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland proto[nfp] = qstrdup(file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dname[nfp] = qstrdup(file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = strrchr(dname[nfp], '/'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* same directory as the last prototype */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(dname[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dname[nfp] = qstrdup(dname[nfp-1]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return; /* no need to canonize() or chdir() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(dname[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(dname[nfp])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_CHDIR), dname[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!nfp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(1); /* must be able to cd to upper level */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_IGNINCLUDE), proto[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) popenv();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Restore defaults and return to the prior directory. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpopenv(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nfp) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (proto[nfp])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(proto[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dname[nfp])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(dname[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; srchp[nfp][i]; i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(srchp[nfp][i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; rootp[nfp][i]; i++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(rootp[nfp][i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (d_own[nfp])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(d_own[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (d_grp[nfp])
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(d_grp[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fp = sfp[--nfp];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(dname[nfp])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_CHDIR), dname[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_INCOMPLETE), proto[nfp]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (popenv());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If this parameter isn't already in place, put it into the local
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * environment. This means that command line directives override prototype
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file directives.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandlputenv(char *s)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pt = strchr(s, '=');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pt)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < nrdonly; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(rdonly[i], s) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '=';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '=';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putenv(qstrdup(s))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_ENVBUILD), errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland quit(99);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsrchroot(char *path, char *copy)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland i = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland root = rootlist[i++];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* convert with root & basedir info */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cvtpath(path, copy);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make it pretty again */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland canonize(copy);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(copy, &statbuf) || !(statbuf.st_mode & S_IFREG)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland root = rootlist[i++];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue; /* host source must be a regular file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (copy);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (root != NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland error(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(gettext(MSG_SRCHROOT), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}