5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
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_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 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 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 * 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 Waterlandattrpreset(int mode, char *owner, char *group)
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/* This is the external query interface for mapmode. */
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 /* default attributes were supplied, so don't reset */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ept->cinfo.cksum = ept->cinfo.modtime = ept->cinfo.size = (-1L);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the first character is not a digit, we assume that the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * volume number is 1.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since we are going to scan the next line,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we need to reset volume number and first_char.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* content info might exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!getlnum(fp, 10, (fsblkcnt_t *)&ept->cinfo.size,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland getnum(fp, 10, (long *)&ept->cinfo.modtime,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstr(fp, NULL, CLSSIZ, ept->pkg_class)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CLASS_TOKEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* local path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 's' || ept->ftype == 'l') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("sl", ept->ftype) && (ept->ainfo.local == NULL)) {
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 * 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 if ((retval = getvalmode(fp, &(ept->ainfo.mode), CURMODE,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* owner & group should be here */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* no owner or group - warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Resolve the parameters if required. */
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 setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
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 * 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 * 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 * 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 Waterlandgetvalmode(FILE *fp, mode_t *d, long bad, int map)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstr(fp, NULL, ATRSIZ, tempmode)) == 1)
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 * Mode may not be an install parameter or a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-build parameter.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (isupper(tempmode[1]) || !islower(tempmode[1]))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((map) && (mapvar(mapmode, tempmode))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * At this point it's supposed to be
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * something we can convert to a number.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We reject it if it contains nonnumbers or
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * it's not octal.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (tempmode[n] && !isspace(tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We reject it if it contains inappropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetnum(FILE *fp, int base, long *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == EOF) || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = (c & 017);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = (*d * base) + b;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetlnum(FILE *fp, int base, fsblkcnt_t *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == EOF) || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland b = (c & 017);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *d = (*d * base) + b;
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 Waterlandgetstr(FILE *fp, char *sep, int n, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
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++ = (char)c;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break; /* no more on this line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (c != '\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* this test works around a side effect of getc() */
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 /* return error if no vfp specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = vfpGetcNoInc(vfp)) != '\0') && (isspace(vfpGetc(vfp))))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the first character is not a digit, we assume that the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * volume number is 1.
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 if (vfp->_vfpCurr && (vfp->_vfpCurr > vfp->_vfpEnd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) findendvfp(&vfpGetCurrCharPtr(vfp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since we are going to scan the next line,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we need to reset volume number and first_char.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = vfpGetcNoInc(vfp)) != '\0') &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), "=", PATH_MAX, mypath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), NULL, PATH_MAX,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* content info might exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!getlnumvfp(&vfpGetCurrCharPtr(vfp), 10,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (fsblkcnt_t *)&ept->cinfo.size, BADCONT) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_CLASS_TOKEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), "=", PATH_MAX, mypath)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_PATHNAME_FIELD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '=') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* local path */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getstrvfp(&vfpGetCurrCharPtr(vfp), NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ept->ftype == 's' || ept->ftype == 'l') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((ept->ftype == 's') || (ept->ftype == 'l')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) findendvfp(&vfpGetCurrCharPtr(vfp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) findendvfp(&vfpGetCurrCharPtr(vfp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((ept->ftype == 's') || (ept->ftype == 'l')) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((ept->ftype == 'c') || (ept->ftype == 'b'))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_CANNOT_READ_MM_DEVNUMS));
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 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 retval = getvalmodevfp(&vfpGetCurrCharPtr(vfp),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* owner & group should be here */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstrvfp(&vfpGetCurrCharPtr(vfp), NULL, ATRSIZ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland goto end; /* no owner or group - warning */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstrvfp(&vfpGetCurrCharPtr(vfp), NULL, ATRSIZ,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Resolve the parameters if required. */
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 setErrstr(pkg_gt(ERR_CANNOT_READ_CONTENT_INFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getendvfp(&vfpGetCurrCharPtr(vfp)) && ept->pinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland setErrstr(pkg_gt(ERR_EXTRA_TOKENS_PRESENT));
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 * 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 * 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 * 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 Waterlandgetvalmodevfp(char **cp, mode_t *d, long bad, int map)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((retval = getstrvfp(cp, NULL, sizeof (tempmode), tempmode)) == 1) {
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 * Mode may not be an install parameter or a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-build parameter.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (isupper(tempmode[1]) || !islower(tempmode[1]))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((map) && (mapvar(mapmode, tempmode))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(getErrbufAddr(), getErrbufSize(),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* it's supposed to be something we can convert to a number */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reject it if it contains nonnumbers or it's not octal */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (tempmode[n] && !isspace(tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strchr("89abcdefABCDEF", tempmode[n])) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * We reject it if it contains inappropriate
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tempmode_t & (~(S_IAMB | S_ISUID | S_ISGID | S_ISVTX))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetnumvfp(char **cp, int base, long *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = *p) != '\0') && (isspace(*p++)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == '\0') || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetlnumvfp(char **cp, int base, fsblkcnt_t *d, long bad)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = *p) != '\0') && (isspace(*p++)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (c == '?') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((c == '\0') || (c == '\n') || !isdigit(c)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandgetstrvfp(char **cp, char *sep, int n, char *str)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* leading white space ignored */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (((c = *p) != '\0') && (isspace(*p++)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate complete list of delimiters to scan for */
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 /* compute length based on delimiter found or not */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if string will fit in result buffer copy string and return success */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* result buffer too small; copy partial string, return error */
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 /* if at end of buffer return no more characters left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the first null or end of line character */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if at newline, increment pointer to first character past newline */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\n') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set return pointer to null or first character past newline */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return space/nospace indicator */
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 /* if at end of buffer return no more characters left */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*p == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find the end of the line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no newline found - point to null terminator */