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#ifndef _PKGLIB_H
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define _PKGLIB_H
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#ifdef __cplusplus
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern "C" {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgdev.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/bio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/x509.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <netdb.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <boot_http.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgerr.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "keystore.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "cfext.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik/*
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik * The contents database file interface.
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Diktypedef struct pkg_server *PKGserver;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik/* Some commands modify the internal database: add them here */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_WRITE_COMMAND(cmd) ((cmd) == PKG_ADDLINES)
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_EXIT 0x0
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_FINDFILE 0x1
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_DUMP 0x2
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_PKGSYNC 0x3
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_FILTER 0x4
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_ADDLINES 0x5
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKG_NOP 0x6
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define SUNW_PKG_SERVERMODE "SUNW_PKG_SERVERMODE"
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKGSERV_MODE "pkg-server-mode="
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKGSERV_MODE_LEN (sizeof (PKGSERV_MODE) - 1)
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define MODE_PERMANENT "permanent"
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define MODE_RUN_ONCE "run_once"
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define MODE_TIMEOUT "timeout"
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define MAXLOGFILESIZE (20 * 1024 * 1024)
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKGLOG "pkglog"
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik#define PKGDOOR ".door"
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Diktypedef enum {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik INVALID, /* Not initialized */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik NEVER, /* Don't start, does check if it is running. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik FLUSH_LOG, /* Run it once to incorporate the log. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik RUN_ONCE, /* Run until the current client stops. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik TIMEOUT, /* Run until a timeout occurs. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik PERMANENT, /* Run until it is externally terminated. */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik DEFAULTMODE = TIMEOUT /* The default mode, must come last */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik} start_mode_t;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Diktypedef struct pkgcmd {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int cmd;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik char buf[1];
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik} pkgcmd_t;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Diktypedef struct pkgfilter {
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int cmd;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int len;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik char buf[1];
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik} pkgfilter_t;
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Virtual File Protocol definitions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * flags associated with virtual file protocol operations; note that these flags
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * may only occupy the low order 16 bits of the 32-bit unsigned flag.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef unsigned long VFPFLAGS_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define VFP_NONE 0x00000000 /* no special flags */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define VFP_NEEDNOW 0x00000001 /* need memory now */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define VFP_SEQUENTIAL 0x00000002 /* sequential access */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define VFP_RANDOM 0x00000004 /* random access */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define VFP_NOMMAP 0x00000008 /* do not use mmap to access file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define VFP_NOMALLOC 0x00000010 /* do not use malloc to buffer file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* virtual file protocol object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandtypedef struct _vfp VFP_T;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* structure behind the virtual file protocol object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct _vfp {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *_vfpFile; /* -> opened FILE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *_vfpCurr; /* -> current byte to read/write */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *_vfpHighWater; /* -> last byte modified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *_vfpEnd; /* -> last data byte */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *_vfpPath; /* -> path associated with FILE */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *_vfpStart; /* -> first data byte */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland void *_vfpExtra; /* undefined */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t _vfpSize; /* size of mapped/allocated area */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t _vfpMapSize; /* # mapped bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland VFPFLAGS_T _vfpFlags; /* flags associated with vfp/data */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int _vfpOverflow; /* non-zero if buffer write overflow */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland blkcnt_t _vfpCkStBlocks; /* checkpoint # blocks */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dev_t _vfpCkDev; /* checkpoint device i.d. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ino_t _vfpCkIno; /* checkpoint inode # */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland off_t _vfpCkSize; /* checkpoint size */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland time_t _vfpCkMtime; /* checkpoint modification time */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * get highest modified byte (length) contained in vfp
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * determine number of bytes to write - it will be the highest of:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- the current pointer into the file - this is updated whenever
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the location of the file is changed by a single byte
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -- the last "high water mark" - the last known location that
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * was written to the file - updated only when the location
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the file is directly changed - e.g. vfpSetCurrCharPtr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * vfpTruncate, vfpRewind.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this reduces the "bookkeeping" that needs to be done to know
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * how many bytes to write out to the file - typically a file is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * written sequentially so the current file pointer is sufficient
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to determine how many bytes to write out.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetModifiedLen(VFP) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (size_t)(((VFP)->_vfpHighWater > (VFP)->_vfpCurr) ? \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (((ptrdiff_t)(VFP)->_vfpHighWater - \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ptrdiff_t)(VFP)->_vfpStart)) : \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (((ptrdiff_t)(VFP)->_vfpCurr - \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ptrdiff_t)(VFP)->_vfpStart)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * increment current pointer by specified delta
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if the delta exceeds the buffer size, set pointer to buffer end
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpIncCurrPtrBy(VFP, INC) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((VFP)->_vfpCurr) += (INC); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((VFP)->_vfpCurr) > ((VFP)->_vfpEnd)) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpCurr = (VFP)->_vfpEnd; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpOverflow = 1; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((VFP)->_vfpHighWater < (VFP)->_vfpCurr) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpHighWater = (VFP)->_vfpCurr; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get the path associated with the vfp */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetPath(VFP) ((VFP)->_vfpPath)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get a string from the vfp into a fixed size buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGets(VFP, PTR, LEN) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *XXpXX = (PTR); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t XXlXX = (LEN); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((*(VFP)->_vfpCurr != '\0') && \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*(VFP)->_vfpCurr != '\n')) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (XXlXX > 1) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *XXpXX++ = *(VFP)->_vfpCurr; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland XXlXX--; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpCurr++; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *XXpXX++ = '\0'; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (*(VFP)->_vfpCurr != '\0') { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpCurr++; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get number of bytes remaining to read */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetBytesRemaining(VFP) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (((((VFP)->_vfpHighWater) <= ((VFP)->_vfpCurr))) ? 0 : \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((((ptrdiff_t)(VFP)->_vfpHighWater)-((ptrdiff_t)(VFP)->_vfpCurr))))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get number of bytes remaining to write */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetBytesAvailable(VFP) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (((((VFP)->_vfpEnd) <= ((VFP)->_vfpCurr))) ? 0 : \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((((ptrdiff_t)(VFP)->_vfpEnd)-((ptrdiff_t)(VFP)->_vfpCurr))))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* put current character and increment to next */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpPutc(VFP, C) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (*(VFP)->_vfpCurr) = ((char)(C)); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpIncCurrPtrBy((VFP), 1); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* put integer to current character and increment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpPutInteger(VFP, NUMBER) vfpPutFormat((VFP), "%d", (NUMBER))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* put long to current character and increment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpPutLong(VFP, NUMBER) vfpPutFormat((VFP), "%ld", (NUMBER))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get current character and increment to next */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetc(VFP) (*(VFP)->_vfpCurr++)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get current character - do not increment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetcNoInc(VFP) (*(VFP)->_vfpCurr)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get pointer to current character */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetCurrCharPtr(VFP) ((VFP)->_vfpCurr)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* increment current character pointer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpIncCurrPtr(VFP) vfpIncCurrPtrBy((VFP), 1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* decrement current character pointer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpDecCurrPtr(VFP) ((VFP)->_vfpCurr--)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get pointer to first data byte in buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetFirstCharPtr(VFP) ((VFP)->_vfpStart)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get pointer to last data byte in buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetLastCharPtr(VFP) ((VFP)->_vfpHighWater)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* set pointer to current character */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpSetCurrCharPtr(VFP, PTR) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((VFP)->_vfpCurr > (VFP)->_vfpHighWater) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpHighWater = (VFP)->_vfpCurr; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((VFP)->_vfpCurr = (PTR))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* set pointer to last data byte in buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpSetLastCharPtr(VFP, PTR) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((PTR) >= (VFP)->_vfpStart) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpHighWater = (PTR); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((VFP)->_vfpCurr > (VFP)->_vfpHighWater) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpCurr = (VFP)->_vfpHighWater; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* seek to end of file - one past last data byte in file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpSeekToEnd(VFP) ((VFP)->_vfpCurr = ((VFP)->_vfpHighWater)+1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* get number of bytes between current char and specified char */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpGetCurrPtrDelta(VFP, P) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (((ptrdiff_t)(P))-((ptrdiff_t)(VFP)->_vfpCurr))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* put string to current character and increment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpPuts(VFP, S) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t xxLen; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t xxResult; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xxLen = vfpGetBytesAvailable((VFP)); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xxResult = strlcpy(((VFP)->_vfpCurr), (S), xxLen); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpIncCurrPtrBy((VFP), xxResult); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* put fixed number of bytes to current character and increment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpPutBytes(VFP, PTR, LEN) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t xxLen; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xxLen = vfpGetBytesAvailable((VFP)); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (xxLen > (LEN)) { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xxLen = (LEN); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (VFP)->_vfpOverflow = 1; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland memcpy((VFP)->_vfpCurr, (PTR), (xxLen)); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpIncCurrPtrBy((VFP), (xxLen)); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* put format one arg to current character and increment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define vfpPutFormat(VFP, FORMAT, ARG) \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland { \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char xxTeMpXX[256]; \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(xxTeMpXX, sizeof (xxTeMpXX), (FORMAT), (ARG)); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland vfpPuts((VFP), xxTeMpXX); \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct dm_buf {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *text_buffer; /* start of allocated buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int offset; /* number of bytes into the text_buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int allocation; /* size of buffer in bytes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* This structure is used to hold a dynamically growing string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct dstr {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int max;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* setmapmode() defines */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAPALL 0 /* resolve all variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAPBUILD 1 /* map only build variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAPINSTALL 2 /* map only install variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAPNONE 3 /* map no variables */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NON_ABI_NAMELNGTH 33 /* 32 chars for name + 1 for NULL */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BLK_SIZE 512 /* size of logical block */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* max length for printed attributes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ATTR_MAX 80
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * These three defines indicate that the prototype file contains a '?'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * meaning do not specify this data in the pkgmap entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CURMODE BADMODE /* current mode has been specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CUROWNER BADOWNER /* ... same for owner ... */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CURGROUP BADGROUP /* ... and group. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define WILDCARD BADMODE >> 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define DB_UNDEFINED_ENTRY "?"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define DEFAULT_MODE 0755
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define DEFAULT_MODE_FILE 0644
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define DEFAULT_OWNER "root"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define DEFAULT_GROUP "other"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define INST_RELEASE "var/sadm/system/admin/INST_RELEASE"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define RANDOM "/dev/urandom"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BLOCK 256
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define TERM_WIDTH 60
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define SMALL_DIVISOR 4
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MED_DIVISOR 5
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LARGE_DIVISOR 10
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MED_DWNLD (10 * 1024 * 1024) /* 10 MB */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define LARGE_DWNLD (5 * MED_DWNLD) /* 50 MB */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define HTTP "http://"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define HTTPS "https://"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGADD "pkgadd"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Settings for network admin defaults */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NET_TIMEOUT_DEFAULT 60
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NET_RETRIES_DEFAULT 3
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NET_TIMEOUT_MIN 1 /* 1 second */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NET_TIMEOUT_MAX (5 * 60) /* 5 minutes */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NET_RETRIES_MIN 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NET_RETRIES_MAX 10
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define AUTH_NOCHECK 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define AUTH_QUIT 1
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* package header magic tokens */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define HDR_PREFIX "# PaCkAgE DaTaStReAm"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define HDR_SUFFIX "# end of header"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* name of security files */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGSEC "/var/sadm/security"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define SIGNATURE_FILENAME "signature"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define GROUP "/etc/group"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PASSWD "/etc/passwd"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The next three mean that no mode, owner or group was specified or that the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * one specified is invalid for some reason. Sometimes this is an error in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * which case it is generally converted to CUR* with a warning. Other times
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * it means "look it up" by stating the existing file system object pointred
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to in the prototype file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NOMODE (BADMODE-1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NOOWNER "@"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define NOGROUP "@"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* string comparitor abbreviators */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ci_streq(a, b) (strcasecmp((a), (b)) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ci_strneq(a, b, c) (strncasecmp((a), (b), (c)) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define streq(a, b) (strcmp((a), (b)) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define strneq(a, b, c) (strncmp((a), (b), (c)) == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern FILE *epopen(char *cmd, char *mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char **gpkglist(char *dir, char **pkg, char **catg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int is_not_valid_length(char **category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int is_not_valid_category(char **category, char *progname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int is_same_CATEGORY(char **category, char *installed_category);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char **get_categories(char *catg_arg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void pkglist_cont(char *keyword);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char **pkgalias(char *pkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *get_prog_name(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *set_prog_name(char *name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int averify(int fix, char *ftype, char *path, struct ainfo *ainfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ckparam(char *param, char *value);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ckvolseq(char *dir, int part, int nparts);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int cverify(int fix, char *ftype, char *path, struct cinfo *cinfo,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int allow_checksum);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern unsigned long compute_checksum(int *r_cksumerr, char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int fverify(int fix, char *ftype, char *path, struct ainfo *ainfo,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cinfo *cinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *getErrbufAddr(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int getErrbufSize(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *getErrstr(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void setErrstr(char *errstr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int devtype(char *alias, struct pkgdev *devp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_totread; /* total number of parts read */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_close(int pkgendflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_findpkg(char *device, char *pkg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_getinfo(char *string);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_getpkg(char *device, int n, char *dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_ginit(char *device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern boolean_t ds_fd_open(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_init(char *device, char **pkg, char *norewind);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int BIO_ds_dump_header(PKG_ERR *, BIO *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int BIO_ds_dump(PKG_ERR *, char *, BIO *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int BIO_dump_cmd(char *cmd, BIO *bio);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_next(char *, char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_readbuf(char *device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int epclose(FILE *pp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int esystem(char *cmd, int ifd, int ofd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int e_ExecCmdArray(int *r_status, char **r_results,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_inputFile, char *a_cmd, char **a_args);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int e_ExecCmdList(int *r_status, char **r_results,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_inputFile, char *a_cmd, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int gpkgmap(struct cfent *ept, FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int gpkgmapvfp(struct cfent *ept, VFP_T *fpv);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void setmapmode(int mode_no);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int isFdRemote(int a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int isFstypeRemote(char *a_fstype);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int isPathRemote(char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int iscpio(char *path, int *iscomp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int isdir(char *path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int isfile(char *dir, char *file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int fmkdir(char *a_path, int a_mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkgexecl(char *filein, char *fileout, char *uname, char *gname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkgexecv(char *filein, char *fileout, char *uname, char *gname,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *arg[]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkghead(char *device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkgmount(struct pkgdev *devp, char *pkg, int part, int nparts,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int getvolflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkgtrans(char *device1, char *device2, char **pkg,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int options, keystore_handle_t, char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkgumount(struct pkgdev *devp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ppkgmap(struct cfent *ept, FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int putcfile(struct cfent *ept, FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int putcvfpfile(struct cfent *ept, VFP_T *vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int rrmdir(char *path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void set_memalloc_failure_func(void (*)(int));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void *xmalloc(size_t size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void *xrealloc(void *ptr, size_t size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *xstrdup(char *str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void set_passphrase_prompt(char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void set_passphrase_passarg(char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int pkg_passphrase_cb(char *, int, int, void *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern int srchcfile(struct cfent *ept, char *path, PKGserver server);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct group *cgrgid(gid_t gid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct group *cgrnam(char *nam);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct passwd *cpwnam(char *nam);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct passwd *cpwuid(uid_t uid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct group *clgrgid(gid_t gid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct group *clgrnam(char *nam);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct passwd *clpwnam(char *nam);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct passwd *clpwuid(uid_t uid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void basepath(char *path, char *basedir, char *ir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void canonize(char *file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void canonize_slashes(char *file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void checksum_off(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void checksum_on(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void cvtpath(char *path, char *copy);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void ds_order(char *list[]);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amoreextern void ds_putinfo(char *buf, size_t);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void ds_skiptoend(char *device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void ecleanup(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void logerr(char *fmt, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int mappath(int flag, char *path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int mapvar(int flag, char *varname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*PRINTFLIKE1*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void progerr(char *fmt, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void pkgerr(PKG_ERR *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void rpterr(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void tputcfent(struct cfent *ept, FILE *fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void set_nonABI_symlinks(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int nonABI_symlinks(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void disable_attribute_check(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int get_disable_attribute_check(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* security.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void sec_init(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *get_subject_display_name(X509 *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *get_issuer_display_name(X509 *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *get_serial_num(X509 *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *get_fingerprint(X509 *, const EVP_MD *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int get_cert_chain(PKG_ERR *, X509 *, STACK_OF(X509) *,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland STACK_OF(X509) *, STACK_OF(X509) **);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* pkgstr.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrConvertUllToTimeString_r(unsigned long long a_time,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_buf, int a_bufLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkgstrConvertPathToBasename(char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkgstrConvertPathToDirname(char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkgstrDup(char *a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkgstrLocatePathBasename(char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrScaleNumericString(char *a_buf, unsigned long long scale);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrAddToken(char **a_old, char *a_new, char a_separator);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t pkgstrContainsToken(char *a_string, char *a_token,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrExpandTokens(char **a_old, char *a_string,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char a_separator, char *a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkgstrGetToken(char *r_sep, char *a_string, int a_index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrGetToken_r(char *r_sep, char *a_string, int a_index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_separators, char *a_buf, int a_bufLen);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandunsigned long pkgstrNumTokens(char *a_string, char *a_separators);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar *pkgstrPrintf(char *a_format, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrPrintf_r(char *a_buf, int a_bufLen, char *a_format, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrRemoveToken(char **r_string, char *a_token,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_separators, int a_index);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid pkgstrRemoveLeadingWhitespace(char **a_str);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* vfpops.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpCheckpointFile(VFP_T **r_destVfp, VFP_T **a_vfp,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpCheckpointOpen(VFP_T **a_cvfp, VFP_T **r_vfp, char *a_path,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *a_mode, VFPFLAGS_T a_flags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpClearModified(VFP_T *a_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpClose(VFP_T **r_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpGetModified(VFP_T *a_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpOpen(VFP_T **r_vfp, char *a_path, char *a_mode,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland VFPFLAGS_T a_flags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void vfpRewind(VFP_T *a_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern ssize_t vfpSafePwrite(int a_fildes, void *a_buf,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t a_nbyte, off_t a_offset);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern ssize_t vfpSafeWrite(int a_fildes, void *a_buf, size_t a_nbyte);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpSetFlags(VFP_T *a_vfp, VFPFLAGS_T a_flags);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpSetModified(VFP_T *a_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpSetSize(VFP_T *a_vfp, size_t a_size);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern void vfpTruncate(VFP_T *a_vfp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int vfpWriteToFile(VFP_T *a_vfp, char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* handlelocalfs.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t enable_local_fs(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t restore_local_fs(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik/* pkgserv.c */
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern PKGserver pkgopenserver(const char *, const char *, boolean_t);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern void pkgcloseserver(PKGserver);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern int pkgcmd(PKGserver, void *, size_t, char **, size_t *,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int *);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern boolean_t pkgsync_needed(const char *, const char *, boolean_t);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern int pkgsync(const char *, const char *, boolean_t);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern int pkgservercommitfile(VFP_T *, PKGserver);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern int pkgopenfilter(PKGserver server, const char *pkginst);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern void pkgclosefilter(PKGserver);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern char *pkggetentry(PKGserver, int *, int *);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern char *pkggetentry_named(PKGserver, const char *, int *,
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik int *);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern void pkgserversetmode(start_mode_t);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern start_mode_t pkgservergetmode(void);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern start_mode_t pkgparsemode(const char *);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dikextern char *pkgmodeargument(start_mode_t);
62224350e5355e6834f7deb9d8a7d062a50cb7c2Casper H.S. Dik
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#ifdef __cplusplus
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#endif /* _PKGLIB_H */