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 <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdarg.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <ctype.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/param.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/statvfs.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/sysmacros.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <dirent.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <signal.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <devmgmt.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/pkcs12.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/x509.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/pkcs7.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/err.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <openssl/pem.h>
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore#include <note.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkginfo.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgstrct.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgtrans.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgdev.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglib.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglibmsgs.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "keystore.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglocale.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkgerr.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkgdir; /* pkgparam.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* libadm.a */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *devattr(char *device, char *attribute);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *fpkginst(char *pkg, ...);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int fpkginfo(struct pkginfo *info, char *pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int getvol(char *device, char *label, int options, char *prompt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int _getvol(char *device, char *label, int options, char *prompt,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *norewind);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* dstream.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_ginit(char *device);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_close(int pkgendflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CPIOPROC "/usr/bin/cpio"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define CMDSIZE 512 /* command block size */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BLK_SIZE 512 /* size of logical block */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ENTRY_MAX 256 /* max size of entry for cpio cmd or header */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGINFO "pkginfo"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGMAP "pkgmap"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAP_STAT_SIZE 60 /* 1st line of pkgmap (3 numbers & a : */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define INSTALL "install"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define RELOC "reloc"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ROOT "root"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ARCHIVE "archive"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct pkgdev srcdev, dstdev;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *tmpdir;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *tmppath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *tmpsymdir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char dstinst[NON_ABI_NAMELNGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *ids_name, *ods_name;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int ds_volcnt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int ds_volno;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int compressedsize, has_comp_size;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void (*sigintHandler)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void (*sighupHandler)();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void cleanup(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void sigtrap(int signo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int rd_map_size(FILE *fp, int *npts, int *maxpsz, int *cmpsize);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int cat_and_count(struct dm_buf *, char *);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int ckoverwrite(char *dir, char *inst, int options);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkgxfer(char *srcinst, int options);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int wdsheader(struct dm_buf *, char *src, char *device,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char **pkg, PKCS7 *);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amorestatic struct dm_buf *genheader(char *, char **);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int dump_hdr_and_pkgs(BIO *, struct dm_buf *, char **);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern int ds_fd; /* open file descriptor for data stream WHERE? */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *root_names[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root.cpio",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "root.cpio.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *reloc_names[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc.cpio",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "reloc.cpio.Z",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland 0
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int signal_received = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar **xpkg; /* array of transferred packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint nxpkg;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *allpkg[] = {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "all",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct dm_buf hdrbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *pinput, *nextpinput;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpkghead(char *device)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (device == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if ((device[0] == '/') && !isdir(device)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = device;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((pt = devattr(device, "pathname")) != NULL && !isdir(pt)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = pt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check for datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgtrans(device, (char *)0, allpkg, PT_SILENT|PT_INFO_ONLY,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland NULL, NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* pkgtrans has set pkgdir */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandmgets(char *buf, int size)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nextpinput = strchr(pinput, '\n');
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nextpinput == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *nextpinput = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((int)strlen(pinput) > size)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strncpy(buf, pinput, strlen(pinput));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland buf[strlen(pinput)] = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinput = nextpinput + 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Here we construct the package size summaries for the headers. The
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkgmap file associated with fp must be rewound to the beginning of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file. Note that we read three values from pkgmap first line in order
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to get the *actual* size if this package is compressed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This returns
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 : error
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 2 : not a compressed package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 3 : compressed package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and sets has_comp_size to indicate whether or not this is a compressed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandrd_map_size(FILE *fp, int *npts, int *maxpsz, int *cmpsize)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line_buffer[MAP_STAT_SIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* First read the null terminated first line */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fgets(line_buffer, MAP_STAT_SIZE, fp) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOSIZE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = sscanf(line_buffer, ": %d %d %d", npts, maxpsz, cmpsize);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 3) /* A valid compressed package entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland has_comp_size = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (n == 2) /* A valid standard package entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland has_comp_size = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else { /* invalid entry */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOSIZE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* will return 0, 1, 3, or 99 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_pkgtrans(char *device1, char *device2, char **pkg, int options,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_handle_t keystore, char *keystore_alias)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland BIO *p7_bio = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland EVP_PKEY *privkey = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKCS7 *sec_pkcs7 = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKCS7_SIGNER_INFO *sec_signerinfo = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKG_ERR *err;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland STACK_OF(X509) *cacerts = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland STACK_OF(X509) *clcerts = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland STACK_OF(X509) *sec_chain = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland X509 *pubcert = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t making_sig = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *src, *dst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int errflg, i, n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dm_buf *hdr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland making_sig = (keystore != NULL) ? B_TRUE : B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (making_sig) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* new error object */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = pkgerr_new();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* find matching cert and key */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (find_key_cert_pair(err, keystore,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_alias, &privkey, &pubcert) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr_free(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get CA certificates */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (find_ca_certs(err, keystore, &cacerts) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr_free(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* get CL (aka "chain") certificates */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (find_cl_certs(err, keystore, &clcerts) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr_free(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize PKCS7 object to be filled in later */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sec_pkcs7 = PKCS7_new();
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) PKCS7_set_type(sec_pkcs7, NID_pkcs7_signed);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sec_signerinfo = PKCS7_add_signature(sec_pkcs7,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pubcert, privkey, EVP_sha1());
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sec_signerinfo == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_SEC), keystore_alias);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ERR_print_errors_fp(stderr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr_free(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add signer cert into signature */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) PKCS7_add_certificate(sec_pkcs7, pubcert);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* attempt to resolve cert chain starting at the signer cert */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (get_cert_chain(err, pubcert, clcerts, cacerts,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &sec_chain) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr_free(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * add the verification chain of certs into the signature.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The first cert is the user cert, which we don't need,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * since it's baked in already, so skip it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 1; i < sk_X509_num(sec_chain); i++) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) PKCS7_add_certificate(sec_pkcs7,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sk_X509_value(sec_chain, i));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgerr_free(err);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland err = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* transfer spool to appropriate device */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (devtype(device1, &srcdev)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_BADDEV), device1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcdev.rdonly++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* check for datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ids_name = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.bdevice) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = _getvol(srcdev.bdevice, NULL, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt("Insert %v into %p."), srcdev.norewind)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 3)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (3);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_GETVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_readbuf(srcdev.cdevice))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ids_name = srcdev.cdevice;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.cdevice && !srcdev.bdevice)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ids_name = srcdev.cdevice;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (srcdev.pathname) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ids_name = srcdev.pathname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(ids_name, 0) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(ERR_TRANSFER);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_GETVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!ids_name && device2 == (char *)0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&srcdev, NULL, 1, 0, 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.mount && *srcdev.mount)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = strdup(srcdev.mount);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ids_name && device2 == (char *)0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmppath = tmpnam(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmppath = strdup(tmppath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmppath == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(tmppath, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MKDIR), tmppath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland device2 = tmppath;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (devtype(device2, &dstdev)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_BADDEV), device2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcdev.cdevice && dstdev.cdevice) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(srcdev.cdevice, dstdev.cdevice) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SAMEDEV));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ods_name = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.cdevice && !dstdev.bdevice || dstdev.pathname)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland options |= PT_ODTSTREAM;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_ODTSTREAM) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!((ods_name = dstdev.cdevice) != NULL ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (ods_name = dstdev.pathname) != NULL)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_BADDEV), device2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ids_name) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_TWODSTREAM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * output device isn't a stream. If we're making a signed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * package, then fail, since we can't make signed,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-stream pkgs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (making_sig) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(ERR_CANTSIGN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcdev.dirname && dstdev.dirname) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(srcdev.dirname, dstdev.dirname) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SAMEDEV));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcdev.pathname && dstdev.pathname) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland strcmp(srcdev.pathname, dstdev.pathname) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SAMEDEV));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ids_name) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.cdevice && !srcdev.bdevice &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (n = _getvol(srcdev.cdevice, NULL, NULL, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcdev.norewind))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 3)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (3);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_GETVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.dirname = tmpnam(NULL))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = srcdev.dirname = strdup(srcdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((srcdev.dirname == NULL) || mkdir(srcdev.dirname, 0755) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland chdir(srcdev.dirname)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOTEMP), srcdev.dirname);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_init(ids_name, pkg, srcdev.norewind)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (srcdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&srcdev, NULL, 1, 0, 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src = srcdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dst = dstdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(src)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), src);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland xpkg = pkg = gpkglist(src, pkg, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!pkg) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOPKGS), src);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (nxpkg = 0; pkg[nxpkg]; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nxpkg++; /* count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ids_name) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_order(pkg); /* order requests */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_ODTSTREAM) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!dstdev.pathname &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (n = _getvol(ods_name, NULL, DM_FORMAT, NULL,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dstdev.norewind))) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 3)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (3);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_GETVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((hdr = genheader(src, pkg)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (making_sig) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* start up signature data stream */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) PKCS7_content_new(sec_pkcs7, NID_pkcs7_data);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) PKCS7_set_detached(sec_pkcs7, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland p7_bio = PKCS7_dataInit(sec_pkcs7, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Here we generate all the data that will go into
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package, and send it through the signature
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * generator, essentially calculating the signature
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the entire package so we can place it in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * header. Otherwise we'd have to place it at the end
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of the pkg, which would break the ABI
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_SILENT)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, pkg_gt(MSG_SIGNING),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_subject_display_name(pubcert));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dump_hdr_and_pkgs(p7_bio, hdr, pkg) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOGEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_GETVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland BIO_flush(p7_bio);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * now generate PKCS7 signature
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!PKCS7_dataFinal(sec_pkcs7, p7_bio)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOGEN));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_GETVOL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) BIO_free(p7_bio);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write out header to stream, which includes signature */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (wdsheader(hdr, src, ods_name, pkg, sec_pkcs7)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sec_pkcs7 != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* nuke in-memory signature for safety */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKCS7_free(sec_pkcs7);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sec_pkcs7 = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volno = 1; /* number of volumes in datastream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinput = hdrbuf.text_buffer;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* skip past first line in header */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) mgets(line, 128);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errflg = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; pkg[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_ODTSTREAM) && dstdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&dstdev, NULL, 0, 0, 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (errflg = pkgxfer(pkg[i], options)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[i] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((options & PT_ODTSTREAM) || (errflg != 2))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcmp(dstinst, pkg[i]))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[i] = strdup(dstinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_ODTSTREAM) && dst) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = strdup(dst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * No cleanup of temporary directories created in this
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * function is done here. The calling function must do
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the cleanup.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (signal_received > 0 ? 1 : errflg);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpkgtrans(char *device1, char *device2, char **pkg, int options,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland keystore_handle_t keystore, char *keystore_alias)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction nact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct sigaction oact;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * setup signal handlers for SIGINT and SIGHUP and release hold
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hold SIGINT/SIGHUP interrupts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hook SIGINT to sigtrap */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = sigtrap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sigaction(SIGINT, &nact, &oact) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sigintHandler = SIG_DFL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sigintHandler = oact.sa_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hook SIGHUP to sigtrap */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = sigtrap;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (sigaction(SIGHUP, &nact, &oact) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sighupHandler = SIG_DFL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sighupHandler = oact.sa_handler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset signal received count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland signal_received = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * perform the package translation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = _pkgtrans(device1, device2, pkg, options, keystore, keystore_alias);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * reset signal handlers
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* hold SIGINT/SIGHUP interrupts */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sighold(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset SIGINT */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = sigintHandler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGINT, &nact, (struct sigaction *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reset SIGHUP */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_handler = sighupHandler;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nact.sa_flags = SA_RESTART;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigemptyset(&nact.sa_mask);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigaction(SIGHUP, &nact, (struct sigaction *)NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if signal received and pkgtrans returned error, call cleanup */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (signal_received > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) kill(getpid(), SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* release hold on signals */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sigrelse(SIGINT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (r);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function concatenates append to the text described in the buf_ctrl
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * structure. This code modifies data in this structure and handles all
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * allocation issues. It returns '0' if everything was successful and '1'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if not.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcat_and_count(struct dm_buf *buf_ctrl, char *append)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* keep allocating until we have enough room to hold string */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while ((buf_ctrl->offset + (int)strlen(append))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland >= buf_ctrl->allocation) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* reallocate (and maybe move) text buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((buf_ctrl->text_buffer =
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (char *)realloc(buf_ctrl->text_buffer,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland buf_ctrl->allocation + BLK_SIZE)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(buf_ctrl->text_buffer);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear the new memory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(buf_ctrl->text_buffer +
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland buf_ctrl->allocation, '\0', BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* adjust total allocation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland buf_ctrl->allocation += BLK_SIZE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* append new string to end of buffer */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (*append) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *(buf_ctrl->text_buffer + buf_ctrl->offset) = *append++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (buf_ctrl->offset)++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct dm_buf *
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amoregenheader(char *src, char **pkg)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[MAXPATHLEN], tmp_entry[ENTRY_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, n, nparts, maxpsize;
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore int partcnt;
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore long totsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((hdrbuf.text_buffer = (char *)malloc(BLK_SIZE)) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* clear the new memory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) memset(hdrbuf.text_buffer, '\0', BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* set up the buffer control structure for the header */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hdrbuf.offset = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland hdrbuf.allocation = BLK_SIZE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) cat_and_count(&hdrbuf, HDR_PREFIX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) cat_and_count(&hdrbuf, "\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts = maxpsize = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; pkg[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, MAXPATHLEN, "%s/%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src, pkg[i], PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(path, &statbuf) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_BADPKGINFO));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize += statbuf.st_size/BLK_SIZE + 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * totsize contains number of blocks used by the pkginfo files
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize += i/4 + 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.capacity && totsize > dstdev.capacity) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOSPACE), totsize, dstdev.capacity);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volcnt = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; pkg[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland partcnt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, MAXPATHLEN, "%s/%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src, pkg[i], PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(path, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOPKGMAP), pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Evaluate the first entry in pkgmap */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = rd_map_size(fp, &nparts, &maxpsize, &compressedsize);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n == 3) /* It's a compressed package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* The header needs the *real* size */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland maxpsize = compressedsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else if (n == 0) /* pkgmap is corrupt */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.capacity && maxpsize > dstdev.capacity) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore logerr(pkg_gt(MSG_NOSPACE), (long)maxpsize,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore dstdev.capacity);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add pkg name, number of parts and the max part size */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (snprintf(tmp_entry, ENTRY_MAX, "%s %d %d",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[i], nparts, maxpsize) >= ENTRY_MAX) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(ERR_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cat_and_count(&hdrbuf, tmp_entry)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize += nparts * maxpsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.capacity && dstdev.capacity < totsize) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int lastpartcnt = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (totsize)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize -= nparts * maxpsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (partcnt < nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (totsize <= dstdev.capacity &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland partcnt <= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize += maxpsize;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland partcnt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* partcnt == 0 means skip to next volume */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (partcnt)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland partcnt--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(tmp_entry, ENTRY_MAX,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " %d", partcnt - lastpartcnt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cat_and_count(&hdrbuf, tmp_entry)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volcnt++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland totsize = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland lastpartcnt = partcnt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* first parts/volume number does not count */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volcnt--;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cat_and_count(&hdrbuf, "\n")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (cat_and_count(&hdrbuf, HDR_SUFFIX) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cat_and_count(&hdrbuf, "\n")) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MEM));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (&hdrbuf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwdsheader(struct dm_buf *hdr, char *src, char *device, char **pkg, PKCS7 *sig)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX], tmp_entry[ENTRY_MAX],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmp_file[L_tmpnam+1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char srcpath[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int list_fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int block_cnt;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int len;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char cwd[MAXPATHLEN + 1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t making_sig = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland making_sig = (sig != NULL) ? B_TRUE : B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.pathname)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_fd = creat(device, 0644);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_fd = open(device, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_fd < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_OPEN), device, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_ginit(device) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_OPEN), device, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The loop below assures compatibility with tapes that don't
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * have a block size (e.g.: Exabyte) by forcing EOR at the end
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * of each 512 bytes.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (block_cnt = 0; block_cnt < hdr->allocation;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland block_cnt += BLK_SIZE) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) write(ds_fd, (hdr->text_buffer + block_cnt), BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * write the first cpio() archive to the datastream
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * which should contain the pkginfo & pkgmap files
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for all packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) tmpnam(tmp_file); /* temporary file name */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if ((list_fd = open(tmp_file, O_RDWR | O_CREAT, 0644)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore logerr(pkg_gt(MSG_NOTMPFIL), tmp_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Create a cpio-compatible list of the requisite files in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the temporary file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!making_sig) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; pkg[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register ssize_t entry_size;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copy pkginfo and pkgmap filenames into the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary string allowing for the first line
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as a special case.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry_size = sprintf(tmp_entry,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (i == 0) ? "%s/%s\n%s/%s" : "\n%s/%s\n%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[i], PKGINFO, pkg[i], PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(list_fd, tmp_entry,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry_size) != entry_size) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore logerr(pkg_gt(MSG_NOTMPFIL), tmp_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(list_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland register ssize_t entry_size;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if we're making a signature, we must make a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary area full of symlinks to the requisite
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * files, plus an extra entry for the signature, so
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that cpio will put all files and signature in the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * same archive in a single invocation of cpio.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpsymdir = xstrdup(tmpnam(NULL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(tmpsymdir, S_IRWXU)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MKDIR), tmpsymdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* generate the signature */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (((len = snprintf(path, PATH_MAX, "%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpsymdir, SIGNATURE_FILENAME)) >= PATH_MAX) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland len < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOTMPFIL), tmpsymdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(path, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOTMPFIL), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) PEM_write_PKCS7(fp, sig);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; pkg[i]; i++) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(path, sizeof (path),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s", tmpsymdir, pkg[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (mkdir(path, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MKDIR), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(path, sizeof (path),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s/%s", tmpsymdir, pkg[i], PKGINFO);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(srcpath, sizeof (srcpath),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s/%s", src, pkg[i], PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (symlink(srcpath, path) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SYMLINK), path, srcpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(path, sizeof (path),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s/%s", tmpsymdir, pkg[i], PKGMAP);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(srcpath, sizeof (srcpath),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s/%s", src, pkg[i], PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (symlink(srcpath, path) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SYMLINK), path, srcpath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copy pkginfo and pkgmap filenames into the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * temporary string allowing for the first line
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as a special case.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore entry_size = snprintf(tmp_entry, sizeof (tmp_entry),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (i == 0) ? "%s/%s\n%s/%s" : "\n%s/%s\n%s/%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg[i], PKGINFO, pkg[i], PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(list_fd, tmp_entry,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland entry_size) != entry_size) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore logerr(pkg_gt(MSG_NOTMPFIL), tmp_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(list_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* add signature to list of files */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore entry_size = snprintf(tmp_entry, sizeof (tmp_entry), "\n%s",
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore SIGNATURE_FILENAME);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(list_fd, tmp_entry, entry_size) != entry_size) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOTMPFIL), tmp_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(list_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ecleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) lseek(list_fd, 0, SEEK_SET);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!making_sig) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(tmp_entry, sizeof (tmp_entry),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s -ocD -C %d", CPIOPROC, (int)BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when making a signature, we must make sure to follow
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * symlinks during the cpio so that we don't archive
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the links themselves
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(tmp_entry, sizeof (tmp_entry),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s -ocDL -C %d", CPIOPROC, (int)BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (making_sig) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* save cwd and change to symlink dir for cpio invocation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getcwd(cwd, MAXPATHLEN + 1) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(ERR_GETWD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(tmpsymdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), tmpsymdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = esystem(tmp_entry, list_fd, ds_fd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CMDFAIL), tmp_entry, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(list_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) unlink(tmp_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(list_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) unlink(tmp_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (making_sig) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* change to back to src dir for subsequent operations */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(cwd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), cwd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cleanup();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandckoverwrite(char *dir, char *inst, int options)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(path, sizeof (path), "%s/%s", dir, inst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(path, 0) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_OVERWRITE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rrmdir(path));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_EXISTS), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpkgxfer(char *srcinst, int options)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pkginfo info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp, *pp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *pt, *src, *dst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char dstdir[PATH_MAX],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland temp[PATH_MAX],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcdir[PATH_MAX],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cmd[CMDSIZE],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgname[NON_ABI_NAMELNGTH];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, n, part, nparts, maxpartsize, curpartcnt, iscomp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char volnos[128], tmpvol[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct statvfs64 svfsb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland longlong_t free_blocks;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat srcstat;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland info.pkginst = NULL; /* required initialization */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when this routine is entered, the first part of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package to transfer is already available in
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the directory indicated by 'src' --- unless the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * source device is a datstream, in which case only
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the pkginfo and pkgmap files are available in 'src'
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src = srcdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dst = dstdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_SILENT))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, pkg_gt(MSG_TRANSFER), srcinst);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcpy(dstinst, srcinst, sizeof (dstinst));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_ODTSTREAM)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* destination is a (possibly mounted) directory */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(dstdir, sizeof (dstdir),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s", dst, dstinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * need to check destination directory to assure
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * that we will not be duplicating a package which
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * already resides there (though we are allowed to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * overwrite the same version)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = src;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fpkginfo(&info, srcinst)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOEXISTS), srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginfo(&info, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgdir = dst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcpy(temp, srcinst, sizeof (temp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = strchr(temp, '.'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(temp, ".*", sizeof (temp));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = fpkginst(temp, info.arch, info.version)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the same instance already exists, although
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * its pkgid might be different
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_OVERWRITE) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcpy(dstinst, pt, sizeof (dstinst));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(dstdir, sizeof (dstdir),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s", dst, dstinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_DUPVERS), srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginfo(&info, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (options & PT_RENAME) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * find next available instance by appending numbers
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the package abbreviation until the instance
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * does not exist in the destination directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pt = strchr(temp, '.'))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pt = '\0';
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 2; (access(dstdir, 0) == 0); i++) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(dstinst, sizeof (dstinst),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s.%d", temp, i);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(dstdir, sizeof (dstdir),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s", dst, dstinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (options & PT_OVERWRITE) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * we're allowed to overwrite, but there seems
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to be no valid package to overwrite, and we are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * not allowed to rename the destination, so act
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as if we weren't given permission to overwrite
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * --- this keeps us from removing a destination
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * instance which is named the same as the source
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * instance, but really reflects a different pkg!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland options &= (~PT_OVERWRITE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginfo(&info, NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fpkginst(NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckoverwrite(dst, dstinst, options))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (2);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(dstdir) && mkdir(dstdir, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MKDIR), dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(srcdir, sizeof (srcdir),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s/%s", src, srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(srcdir, &srcstat) != -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chmod(dstdir, (srcstat.st_mode & S_IAMB)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHMODDIR), dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_STATDIR), srcdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_SILENT) && strcmp(dstinst, srcinst))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, pkg_gt(MSG_RENAME), dstinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(srcdir, sizeof (srcdir), "%s/%s", src, srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(srcdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), srcdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ids_name) { /* unpack the datatstream into a directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * transfer pkginfo & pkgmap first
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(cmd, sizeof (cmd),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s -pudm %s", CPIOPROC, dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pp = epopen(cmd, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_POPEN), cmd, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(pp, "%s\n%s\n", PKGINFO, PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = epclose(pp);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_PCLOSE), cmd, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_INFO_ONLY)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0); /* don't transfer objects */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(dstdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * for each part of the package, use cpio() to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * unpack the archive into the destination directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts = ds_findpkg(srcdev.cdevice, srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (part = 1; part <= nparts; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_getpkg(srcdev.cdevice, part, dstdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland part++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) chdir("/");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgumount(&dstdev))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (part <= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = pkgmount(&dstdev, NULL, part+1,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts, 1))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckoverwrite(dst, dstinst, options))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(dstdir) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland mkdir(dstdir, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MKDIR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * since volume is removable, each part
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * must contain a duplicate of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginfo file to properly identify the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * volume
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(srcdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pp = epopen(cmd, "w")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_POPEN),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cmd, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(pp, "pkginfo");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = epclose(pp);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_PCLOSE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cmd, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(dstdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(PKGMAP, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOPKGMAP), srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!rd_map_size(fp, &nparts, &maxpartsize, &compressedsize))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckvolseq(srcdir, 1, nparts)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SEQUENCE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write each part of this package */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_ODTSTREAM) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) mgets(line, 128);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland curpartcnt = -1;
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore /* LINTED E_SEC_SCANF_UNBOUNDED_COPY */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore if (sscanf(line, "%s %d %d %[ 0-9]", pkgname, &nparts,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland &maxpartsize, volnos) == 4) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sscanf(volnos,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%d %[ 0-9]", &curpartcnt, tmpvol);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcpy(volnos, tmpvol, sizeof (volnos));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (part = 1; part <= nparts; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (curpartcnt == 0 && (options & PT_ODTSTREAM)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char prompt[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int index;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volno++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(prompt,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt("Insert %%v %d of %d into %%p"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volno, ds_volcnt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = getvol(ods_name, NULL, DM_FORMAT, prompt))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ds_fd = open(dstdev.cdevice, O_WRONLY)) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_OPEN), dstdev.cdevice,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_ginit(dstdev.cdevice) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_OPEN), dstdev.cdevice,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sscanf(volnos, "%d %[ 0-9]", &index, tmpvol);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcpy(volnos, tmpvol, sizeof (volnos));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland curpartcnt += index;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_INFO_ONLY)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (part == 1) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(cmd, sizeof (cmd),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "find %s %s", PKGINFO, PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts && (isdir(INSTALL) == 0)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, INSTALL, sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(cmd, sizeof (cmd), "find %s", PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts > 1) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(temp, sizeof (temp),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s.%d", RELOC, part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(temp, &iscomp) || isdir(temp) == 0) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, temp, sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(temp, sizeof (temp),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s.%d", ROOT, part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(temp, &iscomp) || isdir(temp) == 0) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, temp, sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(temp, sizeof (temp),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore "%s.%d", ARCHIVE, part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(temp) == 0) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, temp, sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; reloc_names[i] != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(reloc_names[i], &iscomp) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland isdir(reloc_names[i]) == 0) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, reloc_names[i],
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; root_names[i] != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(root_names[i], &iscomp) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland isdir(root_names[i]) == 0) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, root_names[i],
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(ARCHIVE) == 0) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, ARCHIVE, sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (options & PT_ODTSTREAM) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(cmd + strlen(cmd),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore sizeof (cmd) - strlen(cmd),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -print | %s -ocD -C %d",
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore CPIOPROC, (int)BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (statvfs64(dstdir, &svfsb) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_STATVFS), dstdir, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free_blocks = (((long)svfsb.f_frsize > 0) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland howmany(svfsb.f_frsize, DEV_BSIZE) :
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland howmany(svfsb.f_bsize, DEV_BSIZE)) * svfsb.f_bavail;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((has_comp_size ? compressedsize : maxpartsize) >
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free_blocks) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore logerr(pkg_gt(MSG_NOSPACE),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore has_comp_size ?
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (long)compressedsize : (long)maxpartsize,
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore free_blocks);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(cmd + strlen(cmd),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore sizeof (cmd) - strlen(cmd),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore " -print | %s -pdum %s",
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore CPIOPROC, dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = esystem(cmd, -1, (options & PT_ODTSTREAM) ? ds_fd : -1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CMDFAIL), cmd, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland part++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.mount && (nparts > 1)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unmount current source volume */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) chdir("/");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgumount(&srcdev))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* loop until volume is mounted successfully */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (part <= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read only */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = pkgmount(&srcdev, NULL, part, nparts, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(srcdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore logerr(pkg_gt(MSG_CORRUPT));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) chdir("/");
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) pkgumount(&srcdev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckvolseq(srcdir, part, nparts)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) chdir("/");
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) pkgumount(&srcdev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!(options & PT_ODTSTREAM) && dstdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* unmount current volume */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgumount(&dstdev))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* loop until next volume is mounted successfully */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (part <= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* writable */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = pkgmount(&dstdev, NULL, part, nparts, 1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckoverwrite(dst, dstinst, options))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(dstdir) && mkdir(dstdir, 0755)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_MKDIR), dstdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((options & PT_ODTSTREAM) && part <= nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (curpartcnt >= 0 && part > curpartcnt) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char prompt[128];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int index;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volno++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_close(0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sprintf(prompt,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt("Insert %%v %d of %d into %%p"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ds_volno, ds_volcnt);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n = getvol(ods_name, NULL, DM_FORMAT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland prompt))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((ds_fd = open(dstdev.cdevice, 1)) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_OPEN),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dstdev.cdevice, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ds_ginit(dstdev.cdevice) < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_OPEN),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dstdev.cdevice, errno);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sscanf(volnos, "%d %[ 0-9]", &index,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpvol);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcpy(volnos, tmpvol, sizeof (volnos));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland curpartcnt += index;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: pkgdump
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Dump a cpio archive of a package's contents to a BIO.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: srcinst - Name of package, which resides on the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * device pointed to by the static 'srcdev' variable,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to dump.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bio - BIO object to dump data to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns : 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nonzero - failure. errors printed to screen.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandpkgdump(char *srcinst, BIO *bio)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *src;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp[MAXPATHLEN],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland srcdir[MAXPATHLEN],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland cmd[CMDSIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i, n, part, nparts, maxpartsize, iscomp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * when this routine is entered, the entire package
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is already available at 'src' - including the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkginfo/pkgmap files and the objects as well.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read the pkgmap to get it's size information */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(PKGMAP, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_NOPKGMAP), srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland nparts = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!rd_map_size(fp, &nparts, &maxpartsize, &compressedsize))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* make sure the first volume is available */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.mount) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src = srcdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(srcdir, MAXPATHLEN, "%s/%s", src, srcinst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ckvolseq(srcdir, 1, nparts)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_SEQUENCE));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * form cpio command that will output the contents of all of
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this package's parts
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (part = 1; part <= nparts; /* void */) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (part == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(cmd, CMDSIZE, "find %s %s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland PKGINFO, PKGMAP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts && (isdir(INSTALL) == 0)) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, " ", sizeof (cmd));
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) strlcat(cmd, INSTALL, sizeof (cmd));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(cmd, CMDSIZE, "find %s", PKGINFO);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (nparts > 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, MAXPATHLEN, "%s.%d", RELOC, part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(temp, &iscomp) || isdir(temp) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, " ", CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, temp, CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, MAXPATHLEN, "%s.%d", ROOT, part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(temp, &iscomp) || isdir(temp) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, " ", CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, temp, CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp, MAXPATHLEN, "%s.%d",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ARCHIVE, part);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(temp) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, " ", CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, temp, CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (nparts) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; reloc_names[i] != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(reloc_names[i], &iscomp) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland isdir(reloc_names[i]) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, " ", CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, reloc_names[i],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; root_names[i] != NULL; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (iscpio(root_names[i], &iscomp) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland isdir(root_names[i]) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, " ", CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, root_names[i],
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(ARCHIVE) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, " ", CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strlcat(cmd, ARCHIVE, CMDSIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) snprintf(cmd + strlen(cmd),
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore sizeof (cmd) - strlen(cmd),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland " -print | %s -ocD -C %d",
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore CPIOPROC, (int)BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * execute the command, dumping all standard output
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the BIO.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = BIO_dump_cmd(cmd, bio);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CMDFAIL), cmd, n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland part++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandsigtrap(int signo)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore _NOTE(ARGUNUSED(signo));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland signal_received++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcleanup(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) chdir("/");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmpdir) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) rrmdir(tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tmpdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpdir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmppath) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove any previous tmppath stuff */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) rrmdir(tmppath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tmppath);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmppath = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (tmpsymdir) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* remove temp symbolic links made for signed pkg */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) rrmdir(tmpsymdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(tmpsymdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tmpsymdir = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (srcdev.mount && !ids_name)
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) pkgumount(&srcdev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dstdev.mount && !ods_name)
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) pkgumount(&dstdev);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) ds_close(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: dump_hdr_and_pkgs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Dumps datastream header and each package's contents
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to the supplied BIO
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: bio - BIO object to dump data to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * hdr - Header for the datastream being dumped
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * pkglist - NULL-terminated list of packages
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to dump. The location of the packages are stored
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * in the static 'srcdev' variable.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns : 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nonzero - failure. errors printed to screen.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlanddump_hdr_and_pkgs(BIO *bio, struct dm_buf *hdr, char **pkglist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int block_cnt, i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char srcdir[MAXPATHLEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char cwd[MAXPATHLEN + 1];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *src;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* write out the header to the signature stream */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (block_cnt = 0; block_cnt < hdr->allocation;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland block_cnt += BLK_SIZE) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) BIO_write(bio, (hdr->text_buffer + block_cnt), BLK_SIZE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* save current directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (getcwd(cwd, MAXPATHLEN + 1) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(ERR_GETWD));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* now write out each package's contents */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; pkglist[i]; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * change to the source dir, so we can find and dump
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the package(s) bits into the BIO
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src = srcdev.dirname;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* change to the package source directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(srcdir, MAXPATHLEN, "%s/%s", src, pkglist[i]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(srcdir)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), srcdir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkgdump(pkglist[i], bio)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkglist[i] = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* change back to directory we were in upon entering this routine */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (chdir(cwd)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(pkg_gt(ERR_TRANSFER));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland logerr(pkg_gt(MSG_CHDIR), cwd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: BIO_dump_cmd
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: Dump the output of invoking a command
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to a BIO.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: cmd - Command to invoke
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * bio - BIO to dump output of command to
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * only 'stdout' is dumped.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns : 0 - success
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nonzero - failure. errors printed to screen.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandBIO_dump_cmd(char *cmd, BIO *bio)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[BLK_SIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int rc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* start up the process */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = epopen(cmd, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* read output in chunks, transfer to BIO */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fread(buf, BLK_SIZE, 1, fp) == 1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (BIO_write(bio, buf, BLK_SIZE) != BLK_SIZE) {
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) epclose(fp);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* done with stream, make sure no errors were encountered */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ferror(fp)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) epclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* done, close stream, report any errors */
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sighold(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rc = epclose(fp);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGINT);
4656d4747c8743290bfbe910c64cd75eb4e4af8dGarrett D'Amore (void) sigrelse(SIGHUP);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (rc != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland rpterr();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (rc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}