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 <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgstrct.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: putcfile
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Write contents file entry to specified FILE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: struct cfent a_ept - data for contents file entry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * FILE *a_fp - FP of file to write contents file entry to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Notes: This is identical to putcvfpfile() but this function takes a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * stdio FILE* file to write to instead of a VFP_T file. It is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * MUCH slower than putcvfpfile().
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandputcfile(struct cfent *a_ept, FILE *a_fp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0); /* no ifiles stored in contents DB */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->path == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1); /* no path name - no entry to write */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(a_ept->path, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ainfo.local) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc('=', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(a_ept->ainfo.local, a_fp) == EOF)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->volno) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fprintf(a_fp, " %d", a_ept->volno) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(a_ept->ftype, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(a_ept->pkg_class, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_ept->ftype == 'c') || (a_ept->ftype == 'b')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ainfo.major == BADMAJOR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc('?', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (fprintf(a_fp, " %ld", a_ept->ainfo.major) < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ainfo.minor == BADMINOR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc('?', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (fprintf(a_fp, " %ld", a_ept->ainfo.minor) < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_ept->ftype == 'd') || (a_ept->ftype == 'x') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'c') || (a_ept->ftype == 'b') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'p') || (a_ept->ftype == 'f') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'v') || (a_ept->ftype == 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fprintf(a_fp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->ainfo.mode == BADMODE) ? " ?" : " %04o"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->ainfo.mode) < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(a_ept->ainfo.owner, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(a_ept->ainfo.group, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_ept->ftype == 'f') || (a_ept->ftype == 'v') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fprintf(a_fp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->cinfo.size == BADCONT) ? " ?" : " %llu"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->cinfo.size) < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fprintf(a_fp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->cinfo.cksum == BADCONT) ? " ?" : " %ld"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->cinfo.cksum) < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fprintf(a_fp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->cinfo.modtime == BADCONT) ? " ?" : " %ld"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->cinfo.modtime) < 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = a_ept->pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(' ', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->status) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputc(pinfo->status, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(pinfo->pkg, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->editflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc('\\', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->aclass[0]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc(':', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fputs(pinfo->aclass, a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = pinfo->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (putc('\n', a_fp) == EOF) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: putcvfpfile
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Write contents file entry to specified VFP
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: struct cfent a_ept - data for contents file entry
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VFP_T *a_vfp - VFP of file to write contents file entry to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Notes: This is identical to putcfile() but this function takes a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * VFP_T file to write to instead of a stdio FILE file. It is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * MUCH faster tha putcfile().
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandputcvfpfile(struct cfent *a_ept, VFP_T *a_vfp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* contents file does not maintain any 'i' file entries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ftype == 'i') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* cannot create an entry if it has no file name */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->path == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Format of contents file line could be one of:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /file=./dir/file s class SUNWxxx
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /file=../dir/file l class SUNWxxx
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /dir d class mode owner group SUNWxxx SUNWyyy
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /devices/name c class major minor mode owner group SUNWxxx
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /file f class mode owner group size cksum modtime SUNWxxx
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /file x class mode owner group SUNWppro
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /file v class mode owner group size cksum modtime SUNWxxx
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * /file e class mode owner group size cksum modtime SUNWxxx
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The package name could be prefixed by one of the following
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * status indicators: +-*!%@#~
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Adding an entry to the specified VFP. During normal processing the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contents file is copied to a temporary contents file and entries are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * added as appropriate. When this processing is completed, a decision
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is made on whether or not to overwrite the real contents file with
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the contents of the temporary contents file. If the temporary
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contents file is just a copy of the real contents file then there is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * no need to overwrite the real contents file with the contents of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary contents file. This decision is made in part on whether
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or not any new or modified entries have been added to the temporary
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contents file. Set the "data is modified" indication associated
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * with this VFP so that the real contents file is overwritten when
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * processing is done.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) vfpSetModified(a_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write initial path [all entries] */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, a_ept->path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if link, write out '=' portion */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ainfo.local) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, '=');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, a_ept->ainfo.local);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if volume, write it out */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->volno) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutInteger(a_vfp, a_ept->volno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write out <space><entry type><space>class> */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, a_ept->ftype);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, a_ept->pkg_class);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if char/block device, write out major/minor numbers */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_ept->ftype == 'c') || (a_ept->ftype == 'b')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* major device number */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ainfo.major == BADMAJOR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, '?');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutInteger(a_vfp, a_ept->ainfo.major);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* minor device number */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (a_ept->ainfo.minor == BADMINOR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, '?');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutInteger(a_vfp, a_ept->ainfo.minor);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if dxcbpfve, write out mode, owner, group */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_ept->ftype == 'd') || (a_ept->ftype == 'x') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'c') || (a_ept->ftype == 'b') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'p') || (a_ept->ftype == 'f') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'v') || (a_ept->ftype == 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* mode */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutFormat(a_vfp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->ainfo.mode == BADMODE) ? " ?" : " %04o"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->ainfo.mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* owner */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, a_ept->ainfo.owner);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* group */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, a_ept->ainfo.group);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if f/v/e, write out size, cksum, modtime */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((a_ept->ftype == 'f') || (a_ept->ftype == 'v') ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (a_ept->ftype == 'e')) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* size */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutFormat(a_vfp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->cinfo.size == BADCONT) ? " ?" : " %llu"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->cinfo.size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* cksum */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutFormat(a_vfp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->cinfo.cksum == BADCONT) ? " ?" : " %ld"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->cinfo.cksum);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* modtime */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutFormat(a_vfp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((a_ept->cinfo.modtime == BADCONT) ? " ?" : " %ld"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland a_ept->cinfo.modtime);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write out list of all packages referencing this entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = a_ept->pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pinfo) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ' ');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->status) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, pinfo->status);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, pinfo->pkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->editflag) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, '\\');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo->aclass[0]) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, ':');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts(a_vfp, pinfo->aclass);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo = pinfo->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPutc(a_vfp, '\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}