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 2007 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/wait.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkgstrct.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <pkglib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libintl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libadm.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "libinst.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "dryrun.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define HDR_FSUSAGE "#name remote_name writeable bfree bused ifree iused"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOCREAT "cannot create %s."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOOPEN "cannot open %s."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOWRITE "cannot write to %s."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOREAD "cannot read from %s."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_FSFAIL "cannot construct filesystem table entry."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_BADTYPE "cannot record %s dryrun from %s continuation file."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ERR_NOCONT "cannot install from continue file due to error " \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "stacking."
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ISUMASC_SUFFIX ".isum.asc"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define FSASC_SUFFIX ".fs.asc"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define IPOASC_SUFFIX ".ipo.asc"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define IBIN_SUFFIX ".inst.bin"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MALCOUNT 5 /* package entries to allocate in a block */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGNAMESIZE 32 /* package entries to allocate in a block */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern struct cfextra **extlist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandextern char *pkginst;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct cfextra **extptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int dryrun_mode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int continue_mode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int this_exitcode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* The dryrun and continuation filenames */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *dryrun_sumasc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *dryrun_fsasc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *dryrun_poasc;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *dryrun_bin;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *continue_bin;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* These tell us if the actual files are initialized yet. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int dryrun_initialized = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int continue_initialized = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int this_type; /* type of transaction from main.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int pkg_handle = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int tot_pkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Their associated file pointers */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic FILE *fp_dra;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int fd_drb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int fd_cnb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstruct dr_pkg_entry {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkginst[PKGNAMESIZE + 2];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dr_pkg_entry *next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic struct drinfo {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned partial_set:1; /* 1 if a partial installation was detected. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned partial:1; /* 1 if a partial installation was detected. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned runlevel_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned runlevel:1; /* 1 if runlevel test returned an error. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned pkgfiles_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned pkgfiles:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned depend_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned depend:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned space_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned space:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned conflict_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned conflict:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned setuid_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned setuid:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned priv_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned priv:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned pkgdirs_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned pkgdirs:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned reqexit_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned checkexit_set:1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int type; /* type of operation */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int reqexit; /* request script exit code */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int checkexit; /* checkinstall script exit code */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int exitcode; /* overall program exit code. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dr_pkg_entry *packages; /* pointer to the list of packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int total_ext_recs; /* total extlist entries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int total_fs_recs; /* total fs_tab entries */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int total_pkgs; /* total number of dryrun packages */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int do_not_continue; /* error stacking is likely */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland} dr_info;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *exitmsg; /* the last meaningful message printed */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * In the event that live continue (continue from a dryrun source only)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * becomes a feature, it will be necessary to keep track of those events such
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * as multiply edited files and files dependent upon multiple class action
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * scripts that will lead to "tolerance stacking". Calling this function
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * states that we've lost the level of precision necessary for a live
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * continue.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_continue_not_ok(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.do_not_continue = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandcontinue_is_ok(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (!dr_info.do_not_continue);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwr_OK(FILE *fp, char *parameter, int set, int value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp, "%s=%s\n", parameter,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (set ? (value ? "OK" : "NOT_OK") : "NOT_TESTED"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandadd_pkg_to_list(char *pkgname)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dr_pkg_entry **pkg_entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pkg_handle == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((pkg_handle = bl_create(MALCOUNT,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (struct dr_pkg_entry), "package dryrun")) == -1)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_entry = &(dr_info.packages);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (*pkg_entry != NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_entry = &((*pkg_entry)->next);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* LINTED pointer cast may result in improper alignment */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *pkg_entry = (struct dr_pkg_entry *)bl_next_avail(pkg_handle);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.total_pkgs++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf((*pkg_entry)->pkginst, PKGNAMESIZE, "%s%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pkgname ? pkgname : ""), ((this_exitcode == 0) ? "" : "-"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwrite_pkglist_ascii(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dr_pkg_entry *pkg_entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "PKG_LIST=\"");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_entry = dr_info.packages;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pkg_entry) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, " %s", pkg_entry->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_entry = pkg_entry->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "\"\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwrite_string(int fd, char *string)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int string_size;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (string)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland string_size = strlen(string) + 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland string_size = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd, &string_size, sizeof (string_size)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (string_size > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd, string, string_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandread_string(int fd, char *buffer)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland size_t string_size;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd, &(string_size), sizeof (string_size)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (string_size != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd, buffer, string_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (NULL);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (buffer);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwrite_dryrun_ascii()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *fs_mntpt, *src_name;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp_dra = fopen(dryrun_sumasc, "wb")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_sumasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "DR_TYPE=%s\n", (dr_info.type == REMOVE_TYPE ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "REMOVE" : "INSTALL"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "PKG_INSTALL_ROOT=%s\n", (((get_inst_root()) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(get_inst_root(), "/") != 0)) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_inst_root() : ""));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland write_pkglist_ascii();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "CONTINUE", 1, !(dr_info.do_not_continue));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PARTIAL", dr_info.partial_set, dr_info.partial);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "RUNLEVEL", dr_info.runlevel_set, dr_info.runlevel);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "REQUESTEXITCODE=%d\n", dr_info.reqexit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "CHECKINSTALLEXITCODE=%d\n", dr_info.checkexit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PKGFILES", dr_info.pkgfiles_set, dr_info.pkgfiles);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "DEPEND", dr_info.depend_set, dr_info.depend);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "SPACE", dr_info.space_set, dr_info.space);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "CONFLICT", dr_info.conflict_set, dr_info.conflict);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "SETUID", dr_info.setuid_set, dr_info.setuid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PRIV", dr_info.priv_set, dr_info.priv);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PKGDIRS", dr_info.pkgdirs_set, dr_info.pkgdirs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "EXITCODE=%d\n", dr_info.exitcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "ERRORMSG=%s\n", (exitmsg ? exitmsg : "NONE"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp_dra);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp_dra = fopen(dryrun_fsasc, "wb")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_fsasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "%s\nFSUSAGE=\\\n\"\\\n", HDR_FSUSAGE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; fs_mntpt = get_fs_name_n(n); n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int bfree, bused;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bfree = get_blk_free_n(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bused = get_blk_used_n(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (bfree || bused) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "%s %s %s %d %d %lu %lu \\\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fs_mntpt,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ((src_name = get_source_name_n(n)) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland src_name : "none?"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (is_fs_writeable_n(n) ? "TRUE" : "FALSE"),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bfree,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland bused,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_inode_free_n(n),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland get_inode_used_n(n));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.total_fs_recs = n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "\"\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp_dra);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp_dra = fopen(dryrun_poasc, "wb")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_poasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.total_ext_recs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "WOULD_INSTALL=\\\n\"\\\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; extptr && extptr[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Write it out if it's a successful change or it is from the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * prior dryrun file (meaning it was a change back then).
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((this_exitcode == 0 &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (extptr[n]->mstat.contchg || extptr[n]->mstat.attrchg)) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland extptr[n]->mstat.preloaded) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "%c %s \\\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland extptr[n]->cf_ent.ftype,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland extptr[n]->client_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Count it, if it's going into the dryrun file. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (extptr[n]->cf_ent.ftype != 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.total_ext_recs++;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "\"\n");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp_dra);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This writes out a dryrun file.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwrite_dryrun_bin()
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct fstable *fs_entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo *pkginfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct dr_pkg_entry *pkg_entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fsentry_size = sizeof (struct fstable);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int extentry_size = sizeof (struct cfextra);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pinfoentry_size = sizeof (struct pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fd_drb = open(dryrun_bin,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland O_RDWR | O_APPEND | O_TRUNC)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write the dryrun info table. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, &dr_info, sizeof (struct drinfo)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write out the package instance list. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_entry = dr_info.packages;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (pkg_entry) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, pkg_entry->pkginst, PKGNAMESIZE) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_entry = pkg_entry->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write out the fstable records. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < dr_info.total_fs_recs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fs_entry = get_fs_entry(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, fs_entry, fsentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, fs_entry->name))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, fs_entry->fstype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, fs_entry->remote_name))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write out the package objects and their attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; extptr && extptr[n]; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Don't save metafiles. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (extptr[n]->cf_ent.ftype == 'i')
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If it's a new package object (not left over from the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * continuation file) and it indicates no changes to the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * system, skip it. Only files that will change the system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * are stored.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (extptr[n]->mstat.preloaded == 0 &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland !(this_exitcode == 0 &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (extptr[n]->mstat.contchg || extptr[n]->mstat.attrchg)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, extptr[n], extentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, extptr[n]->cf_ent.path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, extptr[n]->cf_ent.ainfo.local))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland extptr[n]->cf_ent.pinfo = eptstat(&(extptr[n]->cf_ent),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginst, CONFIRM_CONT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now all of the entries about the various packages that own
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfo = extptr[n]->cf_ent.pinfo;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, pkginfo,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfoentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOWRITE), dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfo = pkginfo->next; /* May be several */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pkginfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd_drb);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandinit_drinfo(void) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.partial != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.partial_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.runlevel != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.runlevel_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.pkgfiles != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.pkgfiles_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.depend != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.depend_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.space != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.space_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.conflict != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.conflict_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.setuid != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.setuid_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.priv != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.priv_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.pkgdirs != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.pkgdirs_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.reqexit == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.reqexit_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.checkexit == 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.checkexit_set = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.packages = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland tot_pkgs = dr_info.total_pkgs;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.total_pkgs = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function reads in the various continuation file data in order to seed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the internal data structures.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandread_continue_bin(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fsentry_size = sizeof (struct fstable);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int extentry_size = sizeof (struct cfextra);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int pinfoentry_size = sizeof (struct pinfo);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkgobjinit();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_pkgobjspace())
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fd_cnb = open(continue_bin, O_RDONLY)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read the dryrun info structure. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &dr_info, sizeof (struct drinfo)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland init_drinfo();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (this_type != dr_info.type) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_BADTYPE),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (this_type == REMOVE_TYPE) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "a remove" : "an install",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (dr_info.type == REMOVE_TYPE) ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "a remove" : "an install");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read in the dryrun package records. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < tot_pkgs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char pkg_name[PKGNAMESIZE];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &pkg_name, PKGNAMESIZE) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland add_pkg_to_list(pkg_name);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read in the fstable records. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < dr_info.total_fs_recs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct fstable fs_entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char name[PATH_MAX], remote_name[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char fstype[200];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &fs_entry, fsentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read_string(fd_cnb, &name[0]) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read_string(fd_cnb, &fstype[0]) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read_string(fd_cnb, &remote_name[0]) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (load_fsentry(&fs_entry, name, fstype, remote_name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_FSFAIL));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read in the package objects and their attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < dr_info.total_ext_recs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct cfextra ext_entry;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct pinfo pinfo_area, *pinfo_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX], local[PATH_MAX], *local_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &ext_entry, extentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If the previous dryrun replaced a directory with a
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * non-directory and we're going into *another* dryrun, we're
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * stacking errors and continuation should not be permitted.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ext_entry.mstat.dir2nondir && dryrun_mode)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.do_not_continue = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since we just read this from a continuation file; it is,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by definition, preloaded.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ext_entry.mstat.preloaded = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read_string(fd_cnb, &path[0]) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland local_ptr = read_string(fd_cnb, &local[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ext_entry.cf_ent.pinfo = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now all of the entries about the various packages that own
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland do {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &pinfo_area, pinfoentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo_ptr = eptstat(&(ext_entry.cf_ent),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo_area.pkg, CONFIRM_CONT);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (pinfo_ptr->next) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo_ptr = pinfo_ptr->next;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pinfo_ptr = NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } while (pinfo_ptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland seed_pkgobjmap(&ext_entry, path, local_ptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd_cnb);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return as reading is done, so pkginstall doesn't
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * read the same info from the system.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandin_dryrun_mode(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (dryrun_mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_dryrun_mode(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dryrun_mode = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandin_continue_mode(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (continue_mode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_continue_mode(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue_mode = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Initialize a dryrun file by assigning it a name and creating it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * empty.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandinit_drfile(char **targ_ptr, char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int n;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *targ_file;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *targ_ptr = strdup(path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland targ_file = *targ_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(targ_file, W_OK) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) unlink(targ_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = open(targ_file, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (n < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOCREAT), targ_file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(n);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Initialize all required dryrun files and see that the target directory is
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * present. If all goes well, we're in dryrun mode. If it doesn't, we're not.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandinit_dryrunfile(char *dr_dir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *dot_pos = (temp_path+strlen(dr_dir)+7);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* First create or confirm the directory. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(dr_dir) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) mkpath(dr_dir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp_path, sizeof (temp_path), "%s/dryrun", dr_dir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(dot_pos, ISUMASC_SUFFIX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_sumasc, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(dot_pos, FSASC_SUFFIX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_fsasc, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(dot_pos, IPOASC_SUFFIX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_poasc, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) strcpy(dot_pos, IBIN_SUFFIX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_bin, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dryrun_initialized = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandinit_contfile(char *cn_dir)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char temp_path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* First confirm the directory. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (isdir(cn_dir) != 0)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return; /* no continuation directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp_path, sizeof (temp_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland "%s/dryrun%s", cn_dir, IBIN_SUFFIX);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue_bin = strdup(temp_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (access(continue_bin, W_OK) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue_initialized = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_dr_exitmsg(char *value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland exitmsg = value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandset_dr_info(int type, int value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland switch (type) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case PARTIAL:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.partial_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.partial_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.partial = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case RUNLEVEL:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.runlevel_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.runlevel_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.runlevel = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case PKGFILES:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.pkgfiles_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.pkgfiles_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.pkgfiles = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case DEPEND:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.depend_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.depend_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.depend = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case SPACE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.space_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.space_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.space = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case CONFLICT:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.conflict_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.conflict_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.conflict = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case SETUID:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.setuid_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.setuid_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.setuid = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case PRIV:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.priv_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.priv_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.priv = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case PKGDIRS:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.pkgdirs_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.pkgdirs_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.pkgdirs = (value ? 1 : 0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case REQUESTEXITCODE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.reqexit_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.reqexit_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.reqexit = value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case CHECKEXITCODE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.checkexit_set == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.checkexit_set = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.checkexit = value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case EXITCODE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dr_info.exitcode == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.exitcode = value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland this_exitcode = value;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* default to install if the value is kookie. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland case DR_TYPE:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (value == REMOVE_TYPE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland this_type = REMOVE_TYPE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland else
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland this_type = INSTALL_TYPE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandvoid
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandwrite_dryrun_file(struct cfextra **extlist)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland extptr = extlist;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dryrun_initialized) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland dr_info.type = this_type;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland add_pkg_to_list(pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland write_dryrun_ascii();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland write_dryrun_bin();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dryrun_mode) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(dryrun_sumasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(dryrun_fsasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(dryrun_poasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(dryrun_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: read_continuation
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: If continuation is initialised, reads the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * continuation binary file. The path for the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * same is freed, if set, as this is the last
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * chance to do so.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Sets: Error condition, through the pointer passed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * if read failed.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE - if the continuation binary file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * from previous dryrun is read successfully.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * B_FALSE - if either continuation is not initialised
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or read was not successful.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandread_continuation(int *error)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t ret = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *error = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (continue_initialized) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!read_continue_bin()) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland continue_mode = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *error = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (ret);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (continue_mode) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland ret = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (ret);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}