5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define HDR_FSUSAGE "#name remote_name writeable bfree bused ifree iused"
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#define MALCOUNT 5 /* package entries to allocate in a block */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define PKGNAMESIZE 32 /* package entries to allocate in a block */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* The dryrun and continuation filenames */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* These tell us if the actual files are initialized yet. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic int this_type; /* type of transaction from main.c */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Their associated file pointers */
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:1; /* 1 if runlevel test returned an error. */
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 struct dr_pkg_entry *packages; /* pointer to the list of packages */
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 Waterlandstatic char *exitmsg; /* the last meaningful message printed */
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 Waterlandwr_OK(FILE *fp, char *parameter, int set, int value)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (set ? (value ? "OK" : "NOT_OK") : "NOT_TESTED"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (struct dr_pkg_entry), "package dryrun")) == -1)
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 (void) snprintf((*pkg_entry)->pkginst, PKGNAMESIZE, "%s%s",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (pkgname ? pkgname : ""), ((this_exitcode == 0) ? "" : "-"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, " %s", pkg_entry->pkginst);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd, &string_size, sizeof (string_size)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd, string, string_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd, &(string_size), sizeof (string_size)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp_dra = fopen(dryrun_sumasc, "wb")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_sumasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "DR_TYPE=%s\n", (dr_info.type == REMOVE_TYPE ?
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "PKG_INSTALL_ROOT=%s\n", (((get_inst_root()) &&
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "CONTINUE", 1, !(dr_info.do_not_continue));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PARTIAL", dr_info.partial_set, dr_info.partial);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "RUNLEVEL", dr_info.runlevel_set, dr_info.runlevel);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "REQUESTEXITCODE=%d\n", dr_info.reqexit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "CHECKINSTALLEXITCODE=%d\n", dr_info.checkexit);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PKGFILES", dr_info.pkgfiles_set, dr_info.pkgfiles);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "DEPEND", dr_info.depend_set, dr_info.depend);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "SPACE", dr_info.space_set, dr_info.space);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "CONFLICT", dr_info.conflict_set, dr_info.conflict);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "SETUID", dr_info.setuid_set, dr_info.setuid);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PRIV", dr_info.priv_set, dr_info.priv);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland wr_OK(fp_dra, "PKGDIRS", dr_info.pkgdirs_set, dr_info.pkgdirs);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "EXITCODE=%d\n", dr_info.exitcode);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "ERRORMSG=%s\n", (exitmsg ? exitmsg : "NONE"));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp_dra = fopen(dryrun_fsasc, "wb")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_fsasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "%s\nFSUSAGE=\\\n\"\\\n", HDR_FSUSAGE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; fs_mntpt = get_fs_name_n(n); n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "%s %s %s %d %d %lu %lu \\\n",
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp_dra = fopen(dryrun_poasc, "wb")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), dryrun_poasc);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(fp_dra, "WOULD_INSTALL=\\\n\"\\\n");
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 (extptr[n]->mstat.contchg || extptr[n]->mstat.attrchg)) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Count it, if it's going into the dryrun file. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This writes out a dryrun file.
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 /* Write the dryrun info table. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, &dr_info, sizeof (struct drinfo)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write out the package instance list. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, pkg_entry->pkginst, PKGNAMESIZE) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write out the fstable records. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < dr_info.total_fs_recs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, fs_entry, fsentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, fs_entry->fstype))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, fs_entry->remote_name))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Write out the package objects and their attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Don't save metafiles. */
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 (extptr[n]->mstat.contchg || extptr[n]->mstat.attrchg)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (write(fd_drb, extptr[n], extentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, extptr[n]->cf_ent.path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!write_string(fd_drb, extptr[n]->cf_ent.ainfo.local))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland extptr[n]->cf_ent.pinfo = eptstat(&(extptr[n]->cf_ent),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now all of the entries about the various packages that own
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkginfo = pkginfo->next; /* May be several */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * This function reads in the various continuation file data in order to seed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the internal data structures.
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 if ((fd_cnb = open(continue_bin, O_RDONLY)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOOPEN), continue_bin);
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 /* Read in the dryrun package records. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < tot_pkgs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &pkg_name, PKGNAMESIZE) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read in the fstable records. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < dr_info.total_fs_recs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char name[PATH_MAX], remote_name[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &fs_entry, fsentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read_string(fd_cnb, &fstype[0]) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read_string(fd_cnb, &remote_name[0]) == NULL)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (load_fsentry(&fs_entry, name, fstype, remote_name)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* Read in the package objects and their attributes. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (n = 0; n < dr_info.total_ext_recs; n++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX], local[PATH_MAX], *local_ptr;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &ext_entry, extentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
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 if (ext_entry.mstat.dir2nondir && dryrun_mode)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Since we just read this from a continuation file; it is,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * by definition, preloaded.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland local_ptr = read_string(fd_cnb, &local[0]);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Now all of the entries about the various packages that own
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * this entry.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd_cnb, &pinfo_area, pinfoentry_size) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland progerr(gettext(ERR_NOREAD), continue_bin);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland seed_pkgobjmap(&ext_entry, path, local_ptr);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Return as reading is done, so pkginstall doesn't
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * read the same info from the system.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Initialize a dryrun file by assigning it a name and creating it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland n = open(targ_file, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644);
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 char *dot_pos = (temp_path+strlen(dr_dir)+7);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* First create or confirm the directory. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp_path, sizeof (temp_path), "%s/dryrun", dr_dir);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_sumasc, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_fsasc, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!init_drfile(&dryrun_poasc, temp_path))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* First confirm the directory. */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return; /* no continuation directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(temp_path, sizeof (temp_path),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* default to install if the value is kookie. */
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.