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 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
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgstrct.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglibmsgs.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglocale.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CANT_READ_LCLPATH "unable to read local pathname"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_BAD_VOLUME_NUMBER "bad volume number"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CANNOT_READ_PATHNAME_FIELD "unable to read pathname field"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CANNOT_READ_CONTENT_INFO "unable to read content info"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_EXTRA_TOKENS_PRESENT "extra tokens on input line"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CANNOT_READ_CLASS_TOKEN "unable to read class token"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_BAD_LINK_SPEC "missing or invalid link specification"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_UNKNOWN_FTYPE "unknown ftype"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NO_LINKSOURCE "no link source specified"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_CANNOT_READ_MM_DEVNUMS "unable to read major/minor "\
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "device numbers"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int eatwhite(FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getend(FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getstr(FILE *fp, char *sep, int n, char *str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getnum(FILE *fp, int base, long *d, long bad);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getlnum(FILE *fp, int base, fsblkcnt_t *d, long bad);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getvalmode(FILE *fp, mode_t *d, long bad, int map);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getendvfp(char **cp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void findendvfp(char **cp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getstrvfp(char **cp, char *sep, int n, char *str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int getvalmodevfp(char **cp, mode_t *d, long bad, int map);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint getnumvfp(char **cp, int base, long *d, long bad);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint getlnumvfp(char **cp, int base, fsblkcnt_t *d, long bad);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char mypath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char mylocal[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int mapmode = MAPNONE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *maptype = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic mode_t d_mode = BADMODE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *d_owner = BADOWNER;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *d_group = BADGROUP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * These determine how gpkgmap() deals with mode, owner and group defaults.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * It is assumed that the owner and group arguments represent static fields
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * which will persist until attrdefault() is called.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandattrpreset(int mode, char *owner, char *group)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_mode = mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_owner = owner;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_group = group;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandattrdefault()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_mode = NOMODE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_owner = NOOWNER;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland d_group = NOGROUP;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This determines how gpkgmap() deals with environment variables in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mode, owner and group. Path is evaluated at a higher level based upon
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * other circumstances.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsetmapmode(int mode)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mode >= 0 || mode <= 3) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mapmode = mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mode == MAPBUILD)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype = " build";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (mode == MAPINSTALL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype = " install";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype = "";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* This is the external query interface for mapmode. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetmapmode(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (mapmode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Unpack the pkgmap or the contents file or whatever file is in that format.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Based upon mapmode, environment parameters will be resolved for mode,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * owner and group.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgpkgmap(struct cfent *ept, FILE *fp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t first_char = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ftype = BADFTYPE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(ept->pkg_class, BADCLASS);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->pkg_class_idx = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.local = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* default attributes were supplied, so don't reset */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.mode = d_mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(ept->ainfo.owner, d_owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(ept->ainfo.group, d_group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.major = BADMAJOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.minor = BADMINOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->cinfo.cksum = ept->cinfo.modtime = ept->cinfo.size = (-1L);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->npkgs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!fp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandreadline:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = eatwhite(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the first character is not a digit, we assume that the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * volume number is 1.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (first_char && !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland first_char = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case EOF:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '1':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '2':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '3':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '4':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '5':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '6':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '7':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '8':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '9':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->volno) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_BAD_VOLUME_NUMBER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = (ept->volno*10)+c-'0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (isdigit(c));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->volno == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto readline;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ':':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '#':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) getend(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '\n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since we are going to scan the next line,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we need to reset volume number and first_char.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland first_char = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto readline;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'i':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ftype = (char)c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = eatwhite(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '.':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '/':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstr(fp, "=", PATH_MAX, mypath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path = mypath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstr(fp, NULL, PATH_MAX, mylocal)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANT_READ_LCLPATH));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.local = mylocal;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* content info might exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!getlnum(fp, 10, (fsblkcnt_t *)&ept->cinfo.size,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland BADCONT) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (getnum(fp, 10, (long *)&ept->cinfo.cksum,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland BADCONT) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getnum(fp, 10, (long *)&ept->cinfo.modtime,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland BADCONT))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getend(fp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '?':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'l':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 's':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'x':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ftype = (char)c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstr(fp, NULL, CLSSIZ, ept->pkg_class)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CLASS_TOKEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstr(fp, "=", PATH_MAX, mypath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path = mypath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* local path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstr(fp, NULL, PATH_MAX, mylocal)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 's' || ept->ftype == 'l') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_READLINK));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_CANT_READ_LCLPATH));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.local = mylocal;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strchr("sl", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c != EOF) && (c != '\n'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) getend(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_BAD_LINK_SPEC));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_UNKNOWN_FTYPE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanderror:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) getend(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("sl", ept->ftype) && (ept->ainfo.local == NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_NO_LINKSOURCE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("cb", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.major = BADMAJOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.minor = BADMINOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getnum(fp, 10, (long *)&ept->ainfo.major, BADMAJOR) ||
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore getnum(fp, 10, (long *)&ept->ainfo.minor, BADMINOR)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_MM_DEVNUMS));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Links and information files don't have attributes associated with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * them. The following either resolves potential variables or passes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * them through. Mode is tested for validity to some degree. BAD???
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is returned to indicate that no meaningful mode was provided. A
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * higher authority will decide if that's OK or not. CUR??? means that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the prototype file specifically requires a wildcard ('?') for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that entry. We issue an error if attributes were entered wrong.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We just return BAD??? if there was no entry at all.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("cbdxpfve", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retval;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getvalmode(fp, &(ept->ainfo.mode), CURMODE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (mapmode != MAPNONE))) == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* nothing else on the line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (retval == 2)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error; /* mode is too no good */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* owner & group should be here */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstr(fp, NULL, ATRSIZ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.owner)) == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* no owner or group - warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retval == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_OWNTOOLONG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstr(fp, NULL, ATRSIZ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.group)) == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* no group - warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retval == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_GRPTOOLONG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Resolve the parameters if required. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapmode != MAPNONE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapvar(mapmode, ept->ainfo.owner)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getErrbufSize(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_NOVAR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype, ept->ainfo.owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapvar(mapmode, ept->ainfo.group)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getErrbufSize(), pkg_gt(ERR_NOVAR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype, ept->ainfo.group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("ifve", ept->ftype)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look for content description */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!getlnum(fp, 10, (fsblkcnt_t *)&ept->cinfo.size, BADCONT) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (getnum(fp, 10, (long *)&ept->cinfo.cksum, BADCONT) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getnum(fp, 10, (long *)&ept->cinfo.modtime, BADCONT))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandend:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getend(fp) && ept->pinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddone:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get and validate the mode attribute. This returns an error if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1. the mode string is too long
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2. the mode string includes alpha characters
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3. the mode string is not octal
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4. mode string is an install parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5. mode is an unresolved build parameter and MAPBUILD is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in effect.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the mode is a build parameter, it is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1. returned as is if MAPNONE is in effect
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2. evaluated if MAPBUILD is in effect
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE : We use "mapmode!=MAPBUILD" to gather that it is install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * time. At install time we just fix a mode with bad bits set by
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * setting it to CURMODE. This should be an error in a few releases
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (2.8 maybe) but faulty modes are so common in existing packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that this is a reasonable exception. -- JST 1994-11-9
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RETURNS
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 if mode is being returned as a valid value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 if no attributes are present on the line
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 if there was a fundamental error
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetvalmode(FILE *fp, mode_t *d, long bad, int map)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char tempmode[20];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mode_t tempmode_t;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retval;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstr(fp, NULL, ATRSIZ, tempmode)) == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (retval == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_MODELONG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it isn't a '?' (meaning go with whatever mode is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * there), validate the mode and convert it to a mode_t. The
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "bad" variable here is a misnomer. It doesn't necessarily
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mean bad.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode[0] == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = WILDCARD;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Mode may not be an install parameter or a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-build parameter.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode[0] == '$' &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (isupper(tempmode[1]) || !islower(tempmode[1]))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_IMODE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((map) && (mapvar(mapmode, tempmode))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getErrbufSize(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_NOVAR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype, tempmode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode[0] == '$') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = BADMODE; /* may be a problem */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * At this point it's supposed to be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * something we can convert to a number.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We reject it if it contains nonnumbers or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * it's not octal.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (tempmode[n] && !isspace(tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isdigit(tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_MODEALPHA));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("89abcdefABCDEF",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_BASEINVAL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tempmode_t = strtol(tempmode, NULL, 8);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We reject it if it contains inappropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bits.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode_t & ~(S_IAMB |
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland S_ISUID | S_ISGID | S_ISVTX)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapmode != MAPBUILD) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tempmode_t = bad;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_MODEBITS));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = tempmode_t;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetnum(FILE *fp, int base, long *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c, b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = eatwhite(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = bad;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == EOF) || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = (c & 017);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b >= base)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = (*d * base) + b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetlnum(FILE *fp, int base, fsblkcnt_t *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c, b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = eatwhite(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = bad;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == EOF) || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = (c & 017);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (b >= base)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = (*d * base) + b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get a string from the file. Returns
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 if all OK
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 if nothing there
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -1 if string is too long
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetstr(FILE *fp, char *sep, int n, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = eatwhite(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == EOF) || (c == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1); /* nothing there */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* fill up string until space, tab, or separator */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (!strchr(" \t", c) && (!sep || !strchr(sep, c))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n-- < 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *str = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1); /* too long */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *str++ = (char)c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == EOF) || (c == '\n'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break; /* no more on this line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *str = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ungetc(c, fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetend(FILE *fp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c = getc(fp)) == EOF)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isspace(c))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (c != '\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandeatwhite(FILE *fp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* this test works around a side effect of getc() */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (feof(fp))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (EOF);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = getc(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((c == ' ') || (c == '\t'));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (c);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgpkgmapvfp(struct cfent *ept, VFP_T *vfp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t first_char = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(ept->pkg_class, BADCLASS, sizeof (ept->pkg_class));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(ept->ainfo.owner, d_owner, sizeof (ept->ainfo.owner));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(ept->ainfo.group, d_group, sizeof (ept->ainfo.group));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ftype = BADFTYPE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->pkg_class_idx = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.local = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.mode = d_mode;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.major = BADMAJOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.minor = BADMINOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->cinfo.cksum = (-1L);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->cinfo.modtime = (-1L);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->cinfo.size = (-1L);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->npkgs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if no vfp specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vfp == (VFP_T *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandreadline:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = vfpGetcNoInc(vfp)) != '\0') && (isspace(vfpGetc(vfp))))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the first character is not a digit, we assume that the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * volume number is 1.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (first_char && !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland first_char = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * In case of hsfs the zero-padding of partial pages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returned by mmap is not done properly. A separate bug has been filed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * on this.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (vfp->_vfpCurr && (vfp->_vfpCurr > vfp->_vfpEnd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (c) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '\0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '0':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '1':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '2':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '3':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '4':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '5':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '6':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '7':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '8':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '9':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->volno) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_BAD_VOLUME_NUMBER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = (ept->volno*10)+c-'0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = vfpGetc(vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (isdigit(c));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->volno == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto readline;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case ':':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '#':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) findendvfp(&vfpGetCurrCharPtr(vfp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '\n':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since we are going to scan the next line,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we need to reset volume number and first_char.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->volno = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland first_char = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto readline;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'i':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ftype = (char)c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = vfpGetcNoInc(vfp)) != '\0') &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (isspace(vfpGetc(vfp))))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*FALLTHRU*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '.':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '/':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpDecCurrPtr(vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), "=", PATH_MAX, mypath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path = mypath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = vfpGetc(vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), NULL, PATH_MAX,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mylocal)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANT_READ_LCLPATH));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.local = mylocal;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpDecCurrPtr(vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* content info might exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!getlnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (fsblkcnt_t *)&ept->cinfo.size, BADCONT) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (getnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (long *)&ept->cinfo.cksum, BADCONT) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (long *)&ept->cinfo.modtime, BADCONT))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getendvfp(&vfpGetCurrCharPtr(vfp))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case '?':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'f':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'v':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'e':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'l':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 's':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'p':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'c':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'b':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'd':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case 'x':
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ftype = (char)c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CLSSIZ, ept->pkg_class)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CLASS_TOKEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), "=", PATH_MAX, mypath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->path = mypath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = vfpGetc(vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* local path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PATH_MAX, mylocal)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 's' || ept->ftype == 'l') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_READLINK));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_CANT_READ_LCLPATH));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.local = mylocal;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((ept->ftype == 's') || (ept->ftype == 'l')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c != '\0') && (c != '\n'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) findendvfp(&vfpGetCurrCharPtr(vfp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_BAD_LINK_SPEC));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpDecCurrPtr(vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland default:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_UNKNOWN_FTYPE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanderror:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) findendvfp(&vfpGetCurrCharPtr(vfp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((ept->ftype == 's') || (ept->ftype == 'l')) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ept->ainfo.local == NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_NO_LINKSOURCE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((ept->ftype == 'c') || (ept->ftype == 'b'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.major = BADMAJOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.minor = BADMINOR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (long *)&ept->ainfo.major, BADMAJOR) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (long *)&ept->ainfo.minor, BADMINOR)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_MM_DEVNUMS));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Links and information files don't have attributes associated with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * them. The following either resolves potential variables or passes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * them through. Mode is tested for validity to some degree. BAD???
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is returned to indicate that no meaningful mode was provided. A
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * higher authority will decide if that's OK or not. CUR??? means that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the prototype file specifically requires a wildcard ('?') for
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that entry. We issue an error if attributes were entered wrong.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We just return BAD??? if there was no entry at all.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ept->ftype == 'd') || (ept->ftype == 'x') || (ept->ftype == 'c') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ept->ftype == 'b') || (ept->ftype == 'p') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ept->ftype == 'f') || (ept->ftype == 'v') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ept->ftype == 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retval;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland retval = getvalmodevfp(&vfpGetCurrCharPtr(vfp),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &(ept->ainfo.mode),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CURMODE, (mapmode != MAPNONE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retval == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* nothing else on the line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (retval == 2) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error; /* mode is too no good */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* owner & group should be here */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstrvfp(&vfpGetCurrCharPtr(vfp), NULL, ATRSIZ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.owner)) == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* no owner or group - warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retval == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_OWNTOOLONG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstrvfp(&vfpGetCurrCharPtr(vfp), NULL, ATRSIZ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->ainfo.group)) == 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* no group - warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (retval == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_GRPTOOLONG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Resolve the parameters if required. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapmode != MAPNONE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapvar(mapmode, ept->ainfo.owner)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getErrbufSize(), pkg_gt(ERR_NOVAR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype, ept->ainfo.owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapvar(mapmode, ept->ainfo.group)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getErrbufSize(), pkg_gt(ERR_NOVAR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maptype, ept->ainfo.group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ept->ftype == 'i') || (ept->ftype == 'f') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ept->ftype == 'v') || (ept->ftype == 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* look for content description */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!getlnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (fsblkcnt_t *)&ept->cinfo.size, BADCONT) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (getnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (long *)&ept->cinfo.cksum, BADCONT) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (long *)&ept->cinfo.modtime, BADCONT))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto error;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandend:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getendvfp(&vfpGetCurrCharPtr(vfp)) && ept->pinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddone:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Get and validate the mode attribute. This returns an error if
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1. the mode string is too long
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2. the mode string includes alpha characters
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3. the mode string is not octal
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 4. mode string is an install parameter
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 5. mode is an unresolved build parameter and MAPBUILD is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in effect.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the mode is a build parameter, it is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1. returned as is if MAPNONE is in effect
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2. evaluated if MAPBUILD is in effect
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE : We use "mapmode!=MAPBUILD" to gather that it is install
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * time. At install time we just fix a mode with bad bits set by
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * setting it to CURMODE. This should be an error in a few releases
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * (2.8 maybe) but faulty modes are so common in existing packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that this is a reasonable exception. -- JST 1994-11-9
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * RETURNS
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 if mode is being returned as a valid value
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 if no attributes are present on the line
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 if there was a fundamental error
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetvalmodevfp(char **cp, mode_t *d, long bad, int map)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char tempmode[ATRSIZ+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mode_t tempmode_t;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int retval;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstrvfp(cp, NULL, sizeof (tempmode), tempmode)) == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (retval == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_MODELONG));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it isn't a '?' (meaning go with whatever mode is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * there), validate the mode and convert it to a mode_t. The
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * "bad" variable here is a misnomer. It doesn't necessarily
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * mean bad.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode[0] == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = WILDCARD;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Mode may not be an install parameter or a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-build parameter.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode[0] == '$' &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (isupper(tempmode[1]) || !islower(tempmode[1]))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_IMODE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((map) && (mapvar(mapmode, tempmode))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(), getErrbufSize(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_NOVAR), maptype, tempmode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(getErrbufAddr());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode[0] == '$') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = BADMODE; /* may be a problem */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* it's supposed to be something we can convert to a number */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reject it if it contains nonnumbers or it's not octal */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (tempmode[n] && !isspace(tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isdigit(tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_MODEALPHA));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("89abcdefABCDEF", tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_BASEINVAL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tempmode_t = strtol(tempmode, NULL, 8);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We reject it if it contains inappropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bits.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode_t & (~(S_IAMB | S_ISUID | S_ISGID | S_ISVTX))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mapmode == MAPBUILD) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_MODEBITS));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tempmode_t = bad;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = tempmode_t;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetnumvfp(char **cp, int base, long *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = *cp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = *p) != '\0') && (isspace(*p++)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = bad;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == '\0') || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = (*d * base) + (c & 017);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetlnumvfp(char **cp, int base, fsblkcnt_t *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = *cp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = *p) != '\0') && (isspace(*p++)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = bad;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == '\0') || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = (*d * base) + (c & 017);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland c = *p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetstrvfp(char **cp, char *sep, int n, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char delims[256];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = *cp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = *p) != '\0') && (isspace(*p++)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == '\0') || (c == '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1); /* nothing there */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate complete list of delimiters to scan for */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcpy(delims, " \t\n", sizeof (delims));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((sep != (char *)NULL) && (*sep != '\0')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(delims, sep, sizeof (delims));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* compute length based on delimiter found or not */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p1 = strpbrk(p, delims);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p1 == (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = strlen(p);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len = (ptrdiff_t)p1 - (ptrdiff_t)p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if string will fit in result buffer copy string and return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (len < n) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(str, p, len);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland str[len] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p += len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* result buffer too small; copy partial string, return error */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memcpy(str, p, n-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland str[n-1] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p += n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: getendvfp
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate the end of the current line given a pointer into a buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * containing characters that is null terminated.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: char **cp - pointer to pointer to null-terminated string buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int == 0 -- no non-space characters preceeded the newline
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * != 0 -- one or more non-space characters preceeded newline
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Effects: cp is updated to point to the first character PAST the first new
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * line character found. If no newline character is found, cp is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * updated to point to the '\0' at the end of the buffer.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetendvfp(char **cp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = *cp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if at end of buffer return no more characters left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the first null or end of line character */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((*p != '\0') && (*p != '\n')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!isspace(*p)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if at newline, increment pointer to first character past newline */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\n') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set return pointer to null or first character past newline */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = p;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return space/nospace indicator */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: findendvfp
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Locate the end of the current line given a pointer into a buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * containing characters that is null terminated.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: char **cp - pointer to pointer to null-terminated string buffer
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Effects: cp is updated to point to the first character PAST the first new
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * line character found. If no newline character is found, cp is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * updated to point to the '\0' at the end of the buffer.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandfindendvfp(char **cp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *p = *cp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if at end of buffer return no more characters left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the end of the line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p1 = strchr(p, '\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (p1 != (char *)NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = ++p1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no newline found - point to null terminator */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *cp = strchr(p, '\0');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}