Blame ndmp-src/ndma_cops_backreco.c

Packit Service 392537
/*
Packit Service 392537
 * Copyright (c) 1998,1999,2000
Packit Service 392537
 *	Traakan, Inc., Los Altos, CA
Packit Service 392537
 *	All rights reserved.
Packit Service 392537
 *
Packit Service 392537
 * Redistribution and use in source and binary forms, with or without
Packit Service 392537
 * modification, are permitted provided that the following conditions
Packit Service 392537
 * are met:
Packit Service 392537
 * 1. Redistributions of source code must retain the above copyright
Packit Service 392537
 *    notice unmodified, this list of conditions, and the following
Packit Service 392537
 *    disclaimer.
Packit Service 392537
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 392537
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 392537
 *    documentation and/or other materials provided with the distribution.
Packit Service 392537
 *
Packit Service 392537
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit Service 392537
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 392537
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service 392537
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit Service 392537
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 392537
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 392537
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 392537
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service 392537
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service 392537
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service 392537
 * SUCH DAMAGE.
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * Project:  NDMJOB
Packit Service 392537
 * Ident:    $Id: $
Packit Service 392537
 *
Packit Service 392537
 * Description:
Packit Service 392537
 *
Packit Service 392537
 */
Packit Service 392537
Packit Service 392537
Packit Service 392537
#include "ndmagents.h"
Packit Service 392537
#include "amutil.h"
Packit Service 392537
Packit Service 392537
Packit Service 392537
#ifndef NDMOS_OPTION_NO_CONTROL_AGENT
Packit Service 392537
Packit Service 392537
int ndmca_monitor_backup_tape_tcp (struct ndm_session *sess);
Packit Service 392537
int ndmca_monitor_recover_tape_tcp (struct ndm_session *sess);
Packit Service 392537
int ndmca_monitor_shutdown_tape_tcp (struct ndm_session *sess);
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_op_create_backup (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
Packit Service 392537
	ca->tape_mode = NDMP9_TAPE_RDWR_MODE;
Packit Service 392537
	ca->mover_mode = NDMP9_MOVER_MODE_READ;
Packit Service 392537
	ca->is_label_op = 0;
Packit Service 392537
Packit Service 392537
	rc = ndmca_backreco_startup (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_data_start_backup (sess);
Packit Service 392537
	if (rc == 0) {
Packit Service 392537
	    rc = ndmca_monitor_startup (sess);
Packit Service 392537
	    if (rc == 0) {
Packit Service 392537
		rc = ndmca_monitor_backup (sess);
Packit Service 392537
	    }
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (rc == 0)
Packit Service 392537
	    rc = ndmca_monitor_shutdown (sess);
Packit Service 392537
	else
Packit Service 392537
	    ndmca_monitor_shutdown (sess);
Packit Service 392537
Packit Service 392537
	ndmca_media_tattle (sess);
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_op_recover_files (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
Packit Service 392537
	ca->tape_mode = NDMP9_TAPE_READ_MODE;
Packit Service 392537
	ca->mover_mode = NDMP9_MOVER_MODE_WRITE;
Packit Service 392537
	ca->is_label_op = 0;
Packit Service 392537
Packit Service 392537
	rc = ndmca_backreco_startup (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_data_start_recover (sess);
Packit Service 392537
	if (rc == 0) {
Packit Service 392537
		rc = ndmca_monitor_startup (sess);
Packit Service 392537
		if (rc == 0) {
Packit Service 392537
			rc = ndmca_monitor_recover (sess);
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (rc == 0)
Packit Service 392537
	    rc = ndmca_monitor_shutdown (sess);
Packit Service 392537
	else
Packit Service 392537
	    ndmca_monitor_shutdown (sess);
Packit Service 392537
Packit Service 392537
	if (rc == 0) {
Packit Service 392537
	    if (ca->recover_log_file_count > 0) {
Packit Service 392537
		struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
		int		    n_nlist = ca->job.nlist_tab.n_nlist;
Packit Service 392537
Packit Service 392537
		ndmalogf (sess, 0, 0,
Packit Service 392537
			  "LOG_FILE messages: %d OK, %d ERROR, total %d of %d",
Packit Service 392537
			  ca->recover_log_file_ok,
Packit Service 392537
			  ca->recover_log_file_error,
Packit Service 392537
			  ca->recover_log_file_count,
Packit Service 392537
			  n_nlist);
Packit Service 392537
		if (ca->recover_log_file_ok < n_nlist) {
Packit Service 392537
		    rc = 1;
Packit Service 392537
		}
Packit Service 392537
	    } else {
Packit Service 392537
		ndmalogf (sess, 0, 1,
Packit Service 392537
			  "DATA did not report any LOG_FILE messages");
Packit Service 392537
	    }
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if(!ca->job.tape_tcp)
Packit Service 392537
		ndmca_media_tattle (sess);
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_op_recover_fh (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
Packit Service 392537
	ca->tape_mode = NDMP9_TAPE_READ_MODE;
Packit Service 392537
	ca->mover_mode = NDMP9_MOVER_MODE_WRITE;
Packit Service 392537
	ca->is_label_op = 0;
Packit Service 392537
Packit Service 392537
	rc = ndmca_backreco_startup (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_data_start_recover_filehist (sess);
Packit Service 392537
	if (rc == 0) {
Packit Service 392537
		rc = ndmca_monitor_startup (sess);
Packit Service 392537
		if (rc == 0) {
Packit Service 392537
			rc = ndmca_monitor_recover (sess);
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (rc == 0)
Packit Service 392537
	    rc = ndmca_monitor_shutdown (sess);
Packit Service 392537
	else
Packit Service 392537
	    ndmca_monitor_shutdown (sess);
Packit Service 392537
Packit Service 392537
	ndmca_media_tattle (sess);
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
char *ndmca_data_est(struct ndm_control_agent *ca)
Packit Service 392537
{
Packit Service 392537
    char *estb;
Packit Service 392537
    static char estb_buf[64];
Packit Service 392537
Packit Service 392537
    estb = 0;
Packit Service 392537
    if (ca->data_state.est_bytes_remain.valid &&
Packit Service 392537
	(ca->data_state.est_bytes_remain.value >= 1024)) {
Packit Service 392537
	snprintf(estb_buf,
Packit Service 392537
		 sizeof (estb_buf),
Packit Service 392537
		 " left %lldKB",
Packit Service 392537
		 ca->data_state.est_bytes_remain.value/1024LL);
Packit Service 392537
	estb = estb_buf;
Packit Service 392537
    }
Packit Service 392537
Packit Service 392537
    return estb;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_backup (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			count;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	ndmp9_mover_state	ms;
Packit Service 392537
	char *estb;
Packit Service 392537
Packit Service 392537
	if (ca->job.tape_tcp) {
Packit Service 392537
		return ndmca_monitor_backup_tape_tcp(sess);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 3, "Monitoring backup");
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
Packit Service 392537
		if (ndmca_monitor_get_states(sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
		ms = ca->mover_state.state;
Packit Service 392537
Packit Service 392537
		estb = ndmca_data_est(ca);
Packit Service 392537
Packit Service 392537
		ndmalogf (sess, 0, 1,
Packit Service 392537
			  "DATA: bytes %lldKB%s  MOVER: written %lldKB record %d",
Packit Service 392537
			  ca->data_state.bytes_processed/1024LL,
Packit Service 392537
			  estb ? estb : "",
Packit Service 392537
			  ca->mover_state.bytes_moved/1024LL,
Packit Service 392537
			  ca->mover_state.record_num);
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_ACTIVE
Packit Service 392537
		 && ms == NDMP9_MOVER_STATE_ACTIVE) {
Packit Service 392537
			count = 0;
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * Check MOVER for needed tape change during DATA_FLOW_TO_TAPE.
Packit Service 392537
		 * Have to do this before checking DATA. Even if DATA halted,
Packit Service 392537
		 * MOVER may be holding unwritten data. Have to perform
Packit Service 392537
		 * the tape change.
Packit Service 392537
		 */
Packit Service 392537
		if (ms == NDMP9_MOVER_STATE_PAUSED) {
Packit Service 392537
			ndmp9_mover_pause_reason	pr;
Packit Service 392537
Packit Service 392537
			pr = ca->mover_state.pause_reason;
Packit Service 392537
Packit Service 392537
			if (!ca->pending_notify_mover_paused) {
Packit Service 392537
				/* count=count */
Packit Service 392537
				continue;		/* wait for notice */
Packit Service 392537
			}
Packit Service 392537
Packit Service 392537
			ca->pending_notify_mover_paused = 0;
Packit Service 392537
Packit Service 392537
			ndmalogf (sess, 0, 3, "Mover paused, reason=%s",
Packit Service 392537
					ndmp9_mover_pause_reason_to_str (pr));
Packit Service 392537
Packit Service 392537
			/* backups are different then recoverys... When
Packit Service 392537
                         * we reach the end of a window, we signal EOW
Packit Service 392537
                         * except in V2 where we signal EOF. EOM occurs
Packit Service 392537
			 * at EOT (or EOF does).
Packit Service 392537
			 * This is based on reading comments in the email
Packit Service 392537
			 * archives...
Packit Service 392537
			 */
Packit Service 392537
			if ((pr == NDMP9_MOVER_PAUSE_EOM) ||
Packit Service 392537
			    (pr == NDMP9_MOVER_PAUSE_EOW)) {
Packit Service 392537
				if (ndmca_monitor_load_next(sess) == 0) {
Packit Service 392537
					/* count=count */
Packit Service 392537
					continue;	/* Happy */
Packit Service 392537
				}
Packit Service 392537
				/* Something went wrong with tape change. */
Packit Service 392537
			} else if ((sess->plumb.tape->protocol_version <= 2) &&
Packit Service 392537
				   pr == NDMP9_MOVER_PAUSE_EOF) {
Packit Service 392537
				if (ndmca_monitor_load_next(sess) == 0) {
Packit Service 392537
					/* count=count */
Packit Service 392537
					continue;	/* Happy */
Packit Service 392537
				}
Packit Service 392537
				/* Something went wrong with tape change. */
Packit Service 392537
			} else {
Packit Service 392537
				/* All other pause reasons
Packit Service 392537
				 * are critically bogus. */
Packit Service 392537
Packit Service 392537
			}
Packit Service 392537
			ndmalogf (sess, 0, 0,
Packit Service 392537
				"Operation paused w/o remedy, cancelling");
Packit Service 392537
			ndmca_mover_abort (sess);
Packit Service 392537
			return -1;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * If DATA has halted, the show is over.
Packit Service 392537
		 */
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED) {
Packit Service 392537
			if (ms != NDMP9_MOVER_STATE_HALTED) {
Packit Service 392537
				ndmalogf (sess, 0, 3,
Packit Service 392537
					"DATA halted, MOVER active");
Packit Service 392537
				/*
Packit Service 392537
				 * MOVER still occupied. It might be a
Packit Service 392537
				 * heartbeat away from asking for another
Packit Service 392537
				 * tape. Give it a chance.
Packit Service 392537
				 */
Packit Service 392537
				continue;
Packit Service 392537
			}
Packit Service 392537
Packit Service 392537
			ndmalogf (sess, 0, 2, "Operation done, cleaning up");
Packit Service 392537
Packit Service 392537
			ndmca_monitor_get_post_backup_env (sess);
Packit Service 392537
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
#if 1
Packit Service 392537
		if (ms == NDMP9_MOVER_STATE_HALTED) {
Packit Service 392537
			if (ds == NDMP9_DATA_STATE_ACTIVE) {
Packit Service 392537
				ndmalogf (sess, 0, 3,
Packit Service 392537
					"MOVER halted, DATA active");
Packit Service 392537
				/*
Packit Service 392537
				 * DATA still occupied.
Packit Service 392537
				 */
Packit Service 392537
				continue;
Packit Service 392537
			}
Packit Service 392537
		}
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		if (ms != NDMP9_MOVER_STATE_ACTIVE && count == 0) {
Packit Service 392537
			/* Not active. Not paused. Something wrong */
Packit Service 392537
			ndmalogf (sess, 0, 0,
Packit Service 392537
				"Operation in unreasonable state, cancelling");
Packit Service 392537
			return -1;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
Packit Service 392537
	return -1;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_backup_tape_tcp (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			count;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	char *estb;
Packit Service 392537
	struct ndmlog *		ixlog = &ca->job.index_log;
Packit Service 392537
	char *			pname = get_pname();
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 3, "Monitoring backup");
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
Packit Service 392537
		if (ndmca_monitor_get_states(sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
Packit Service 392537
		estb = ndmca_data_est(ca);
Packit Service 392537
Packit Service 392537
		ndmalogf (sess, 0, 1,
Packit Service 392537
			  "DATA: bytes %lldKB%s",
Packit Service 392537
			  ca->data_state.bytes_processed/1024LL,
Packit Service 392537
			  estb ? estb : "");
Packit Service 392537
Packit Service 392537
		if (strcmp(pname, "amndmjob") == 0) {
Packit Service 392537
			ndmlogf (ixlog, "DATA SIZE", 0, "%lldKB",
Packit Service 392537
				 ca->data_state.bytes_processed/1024LL);
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_ACTIVE) {
Packit Service 392537
			count = 0;
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * If DATA has halted, the show is over.
Packit Service 392537
		 */
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED) {
Packit Service 392537
			ndmalogf (sess, 0, 2, "Operation done, cleaning up");
Packit Service 392537
Packit Service 392537
			ndmca_monitor_get_post_backup_env (sess);
Packit Service 392537
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
Packit Service 392537
	return -1;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_get_post_backup_env (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	struct ndmlog *		ixlog = &ca->job.index_log;
Packit Service 392537
	int			rc, i;
Packit Service 392537
	ndmp9_pval *		pv;
Packit Service 392537
Packit Service 392537
	rc = ndmca_data_get_env (sess);
Packit Service 392537
	if (rc && ca->data_state.error == NDMP9_ILLEGAL_STATE_ERR) {
Packit Service 392537
		ndmalogf (sess, 0, 2, "fetch post backup env failed");
Packit Service 392537
		return 0;
Packit Service 392537
	}
Packit Service 392537
	if (rc) {
Packit Service 392537
		ndmalogf (sess, 0, 0, "fetch post backup env failed");
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	for (i = 0; i < ca->job.result_env_tab.n_env; i++) {
Packit Service 392537
		pv = &ca->job.result_env_tab.env[i];
Packit Service 392537
Packit Service 392537
		ndmlogf (ixlog, "DE", 0, "%s=%s", pv->name, pv->value);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_recover (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			count, rc;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	ndmp9_mover_state	ms;
Packit Service 392537
	char *estb;
Packit Service 392537
	int last_state_print = 0;
Packit Service 392537
Packit Service 392537
	if (ca->job.tape_tcp) {
Packit Service 392537
		return (ndmca_monitor_recover_tape_tcp(sess));
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 3, "Monitoring recover");
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		if (ca->pending_notify_data_read) {
Packit Service 392537
			ca->pending_notify_data_read = 0;
Packit Service 392537
Packit Service 392537
			rc = ndmca_mover_read (sess,
Packit Service 392537
				ca->last_notify_data_read.offset,
Packit Service 392537
				ca->last_notify_data_read.length);
Packit Service 392537
			if (rc) {
Packit Service 392537
				ndmalogf (sess, 0, 0, "data-read failed");
Packit Service 392537
				return -1;
Packit Service 392537
			}
Packit Service 392537
			if (count < 5)
Packit Service 392537
				continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
Packit Service 392537
Packit Service 392537
		if (ndmca_monitor_get_states(sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
		ms = ca->mover_state.state;
Packit Service 392537
Packit Service 392537
		estb = ndmca_data_est(ca);
Packit Service 392537
Packit Service 392537
		if ((ds != NDMP9_DATA_STATE_ACTIVE) ||
Packit Service 392537
		    (ms != NDMP9_MOVER_STATE_ACTIVE) ||
Packit Service 392537
		    ((time(0) - last_state_print) >= 5)) {
Packit Service 392537
Packit Service 392537
		    ndmalogf (sess, 0, 1,
Packit Service 392537
			      "DATA: bytes %lldKB%s  MOVER: read %lldKB record %d",
Packit Service 392537
			      ca->data_state.bytes_processed/1024LL,
Packit Service 392537
			      estb ? estb : "",
Packit Service 392537
			      ca->mover_state.bytes_moved/1024LL,
Packit Service 392537
			      ca->mover_state.record_num);
Packit Service 392537
		    last_state_print = time(0);
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_ACTIVE
Packit Service 392537
		 && ms == NDMP9_MOVER_STATE_ACTIVE) {
Packit Service 392537
			count = 0;
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * Check MOVER for needed tape change during DATA_FLOW_TO_TAPE.
Packit Service 392537
		 * Have to do this before checking DATA. Even if DATA halted,
Packit Service 392537
		 * MOVER may be holding unwritten data. Have to perform
Packit Service 392537
		 * the tape change.
Packit Service 392537
		 */
Packit Service 392537
		if (ms == NDMP9_MOVER_STATE_PAUSED) {
Packit Service 392537
			ndmp9_mover_pause_reason	pr;
Packit Service 392537
Packit Service 392537
			pr = ca->mover_state.pause_reason;
Packit Service 392537
Packit Service 392537
			if (!ca->pending_notify_mover_paused) {
Packit Service 392537
				/* count=count */
Packit Service 392537
				continue;		/* wait for notice */
Packit Service 392537
			}
Packit Service 392537
Packit Service 392537
			ca->pending_notify_mover_paused = 0;
Packit Service 392537
Packit Service 392537
			ndmalogf (sess, 0, 3, "Mover paused, reason=%s",
Packit Service 392537
					ndmp9_mover_pause_reason_to_str (pr));
Packit Service 392537
Packit Service 392537
			if (((pr == NDMP9_MOVER_PAUSE_EOF) ||
Packit Service 392537
			     (pr == NDMP9_MOVER_PAUSE_SEEK))
Packit Service 392537
			    && (ca->cur_media_ix+1 == ca->job.media_tab.n_media)) {
Packit Service 392537
				/*
Packit Service 392537
				 * Last tape consumed by tape agent.
Packit Service 392537
				 * The DATA agent may be just shy
Packit Service 392537
				 * of done, but there is no way for
Packit Service 392537
				 * us to tell. So, close the
Packit Service 392537
				 * image stream from the TAPE
Packit Service 392537
				 * agent side, thus indicating
Packit Service 392537
				 * EOF to the DATA agent.
Packit Service 392537
				 */
Packit Service 392537
				ndmalogf (sess, 0, 2, "End of tapes");
Packit Service 392537
				ndmca_mover_close (sess);
Packit Service 392537
				/* count=count */
Packit Service 392537
				continue;
Packit Service 392537
			}
Packit Service 392537
Packit Service 392537
			if (pr == NDMP9_MOVER_PAUSE_EOM
Packit Service 392537
			 || pr == NDMP9_MOVER_PAUSE_EOF) {
Packit Service 392537
				if (ndmca_monitor_load_next(sess) == 0) {
Packit Service 392537
					/* count=count */
Packit Service 392537
					continue;	/* Happy */
Packit Service 392537
				}
Packit Service 392537
				/* Something went wrong with tape change. */
Packit Service 392537
			} else if (pr == NDMP9_MOVER_PAUSE_SEEK) {
Packit Service 392537
				if (ndmca_monitor_seek_tape(sess) == 0) {
Packit Service 392537
					/* count=count */
Packit Service 392537
					continue;	/* Happy */
Packit Service 392537
				}
Packit Service 392537
				/* Something went wrong with tape change. */
Packit Service 392537
			} else {
Packit Service 392537
				/* All other pause reasons
Packit Service 392537
				 * are critically bogus. */
Packit Service 392537
			}
Packit Service 392537
			ndmalogf (sess, 0, 0,
Packit Service 392537
				"Operation paused w/o remedy, cancelling");
Packit Service 392537
			ndmca_mover_abort (sess);
Packit Service 392537
			return -1;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * If DATA has halted, the show is over.
Packit Service 392537
		 */
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED) {
Packit Service 392537
			if (ms != NDMP9_MOVER_STATE_HALTED) {
Packit Service 392537
				ndmalogf (sess, 0, 3,
Packit Service 392537
					"DATA halted, MOVER active");
Packit Service 392537
				/*
Packit Service 392537
				 * MOVER still occupied. It might
Packit Service 392537
				 * figure it out. Then again, it might
Packit Service 392537
				 * be awaiting a MOVER_READ. The NDMP
Packit Service 392537
				 * design does not provide a state
Packit Service 392537
				 * for awaiting MOVER_READ, so we have
Packit Service 392537
				 * to guess.
Packit Service 392537
				 */
Packit Service 392537
				if (count > 0) {
Packit Service 392537
					ndmca_mover_close(sess);
Packit Service 392537
				}
Packit Service 392537
				continue;
Packit Service 392537
			}
Packit Service 392537
Packit Service 392537
			ndmalogf (sess, 0, 2, "Operation done, cleaning up");
Packit Service 392537
Packit Service 392537
			ndmca_monitor_get_post_backup_env (sess);
Packit Service 392537
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (ms != NDMP9_MOVER_STATE_ACTIVE && count == 0) {
Packit Service 392537
			/* Not active. Not paused. Something wrong */
Packit Service 392537
			ndmalogf (sess, 0, 0,
Packit Service 392537
				"Operation in unreasonable state, cancelling");
Packit Service 392537
			return -1;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
Packit Service 392537
	return -1;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_recover_tape_tcp (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			count;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	char *estb;
Packit Service 392537
	int last_state_print = 0;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 3, "Monitoring recover");
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
Packit Service 392537
		ndmca_mon_wait_for_something (sess, count <= 1 ? 30 : 10);
Packit Service 392537
Packit Service 392537
		if (ndmca_monitor_get_states(sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
Packit Service 392537
		estb = ndmca_data_est(ca);
Packit Service 392537
Packit Service 392537
		if ((ds != NDMP9_DATA_STATE_ACTIVE) ||
Packit Service 392537
		    ((time(0) - last_state_print) >= 5)) {
Packit Service 392537
Packit Service 392537
		    ndmalogf (sess, 0, 1,
Packit Service 392537
			      "DATA: bytes %lldKB%s  MOVER: read %lldKB record %d",
Packit Service 392537
			      ca->data_state.bytes_processed/1024LL,
Packit Service 392537
			      estb ? estb : "",
Packit Service 392537
			      ca->mover_state.bytes_moved/1024LL,
Packit Service 392537
			      ca->mover_state.record_num);
Packit Service 392537
		    last_state_print = time(0);
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_ACTIVE) {
Packit Service 392537
			count = 0;
Packit Service 392537
			continue;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		/*
Packit Service 392537
		 * If DATA has halted, the show is over.
Packit Service 392537
		 */
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED) {
Packit Service 392537
			ndmalogf (sess, 0, 2, "Operation done, cleaning up");
Packit Service 392537
Packit Service 392537
			ndmca_monitor_get_post_backup_env (sess);
Packit Service 392537
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 0, "Operation monitoring mishandled, cancelling");
Packit Service 392537
	return -1;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_backreco_startup (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc = 0;
Packit Service 392537
Packit Service 392537
	if (!ca->job.tape_tcp)
Packit Service 392537
		rc = ndmca_op_robot_startup (sess, 1);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_connect_data_agent(sess);
Packit Service 392537
	if (rc) {
Packit Service 392537
		ndmconn_destruct (sess->plumb.data);
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (ca->job.tape_tcp) {
Packit Service 392537
		return 0;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = ndmca_connect_tape_agent(sess);
Packit Service 392537
	if (rc) {
Packit Service 392537
		ndmconn_destruct (sess->plumb.tape);
Packit Service 392537
		return rc;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = ndmca_mover_set_record_size (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_load_first (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	ndmca_media_calculate_offsets (sess);
Packit Service 392537
Packit Service 392537
	if (sess->control_acb.swap_connect &&
Packit Service 392537
	    (sess->plumb.tape->protocol_version >= 3)) {
Packit Service 392537
	    if (sess->plumb.tape->protocol_version < 4) {
Packit Service 392537
		rc = ndmca_data_listen (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
Packit Service 392537
		rc = ndmca_media_set_window_current (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
	    } else {
Packit Service 392537
		rc = ndmca_media_set_window_current (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
Packit Service 392537
		rc = ndmca_data_listen (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
	    }
Packit Service 392537
	} else {
Packit Service 392537
	    if (sess->plumb.tape->protocol_version < 4) {
Packit Service 392537
		rc = ndmca_mover_listen (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
Packit Service 392537
		rc = ndmca_media_set_window_current (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
	    } else {
Packit Service 392537
		rc = ndmca_media_set_window_current (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
Packit Service 392537
		rc = ndmca_mover_listen (sess);
Packit Service 392537
		if (rc) return rc;
Packit Service 392537
	    }
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_startup (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	ndmp9_mover_state	ms;
Packit Service 392537
	int			count;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 3, "Waiting for operation to start");
Packit Service 392537
Packit Service 392537
	if (ca->job.tape_tcp)
Packit Service 392537
		return 0;
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		if (ndmca_monitor_get_states (sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
		if (!ca->job.tape_tcp)
Packit Service 392537
			ms = ca->mover_state.state;
Packit Service 392537
		else
Packit Service 392537
			ms = NDMP9_MOVER_STATE_ACTIVE;
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_ACTIVE
Packit Service 392537
		 && ms == NDMP9_MOVER_STATE_ACTIVE) {
Packit Service 392537
			ndmalogf (sess, 0, 1, "Operation started");
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED
Packit Service 392537
		    && ms == NDMP9_MOVER_STATE_HALTED) {
Packit Service 392537
			/* operation finished immediately */
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (ds != NDMP9_DATA_STATE_IDLE
Packit Service 392537
		 && ms != NDMP9_MOVER_STATE_IDLE
Packit Service 392537
		 && ms != NDMP9_MOVER_STATE_LISTEN) {
Packit Service 392537
			ndmalogf (sess, 0, 1,
Packit Service 392537
				  "Operation started in unusual fashion");
Packit Service 392537
			return 0;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		ndmca_mon_wait_for_something (sess, 2);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 0, "Operation failed to start");
Packit Service 392537
	return -1;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/*
Packit Service 392537
 * Just make sure things get finished
Packit Service 392537
 */
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_shutdown (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	ndmp9_data_halt_reason	dhr;
Packit Service 392537
	ndmp9_mover_state	ms;
Packit Service 392537
	ndmp9_mover_halt_reason	mhr;
Packit Service 392537
	int			count;
Packit Service 392537
	int			finish;
Packit Service 392537
Packit Service 392537
	if (ca->job.tape_tcp) {
Packit Service 392537
		return ndmca_monitor_shutdown_tape_tcp(sess);
Packit Service 392537
	}
Packit Service 392537
	ndmalogf (sess, 0, 3, "Waiting for operation to halt");
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		ndmca_mon_wait_for_something (sess, 2);
Packit Service 392537
Packit Service 392537
		if (ndmca_monitor_get_states (sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
		ms = ca->mover_state.state;
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED
Packit Service 392537
		 && ms == NDMP9_MOVER_STATE_HALTED) {
Packit Service 392537
		        dhr = ca->data_state.halt_reason;
Packit Service 392537
			mhr = ca->mover_state.halt_reason;
Packit Service 392537
			break;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (count > 2) {
Packit Service 392537
			if (ds != NDMP9_DATA_STATE_HALTED)
Packit Service 392537
				ndmca_data_abort(sess);
Packit Service 392537
			if (ms != NDMP9_MOVER_STATE_HALTED)
Packit Service 392537
				ndmca_mover_abort(sess);
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (ca->tape_state.error == NDMP9_NO_ERR) {
Packit Service 392537
		ndmca_monitor_unload_last_tape (sess);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (count >= 10) {
Packit Service 392537
		ndmalogf (sess, 0, 0,
Packit Service 392537
			"Operation did not halt, something wrong");
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 2, "Operation halted, stopping");
Packit Service 392537
Packit Service 392537
	ds = ca->data_state.state;
Packit Service 392537
	ms = ca->mover_state.state;
Packit Service 392537
	dhr = ca->data_state.halt_reason;
Packit Service 392537
	mhr = ca->mover_state.halt_reason;
Packit Service 392537
Packit Service 392537
	if ((ds == NDMP9_DATA_STATE_HALTED)
Packit Service 392537
	    && (ms == NDMP9_MOVER_STATE_HALTED)) {
Packit Service 392537
	    if ((dhr == NDMP9_DATA_HALT_SUCCESSFUL) &&
Packit Service 392537
		(mhr == NDMP9_MOVER_HALT_CONNECT_CLOSED)) {
Packit Service 392537
		/* Successful operation */
Packit Service 392537
		ndmalogf (sess, 0, 0, "Operation ended OKAY");
Packit Service 392537
		finish = 0;
Packit Service 392537
	    } else {
Packit Service 392537
		/* Questionable success */
Packit Service 392537
		ndmalogf (sess, 0, 0, "Operation ended questionably");
Packit Service 392537
		finish = 1;
Packit Service 392537
	    }
Packit Service 392537
	} else {
Packit Service 392537
	    ndmalogf (sess, 0, 0, "Operation ended in failure");
Packit Service 392537
	    finish = -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmca_data_stop (sess);
Packit Service 392537
	ndmca_mover_stop (sess);
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		if (ndmca_monitor_get_states(sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
		ms = ca->mover_state.state;
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_IDLE
Packit Service 392537
		 && ms == NDMP9_MOVER_STATE_IDLE) {
Packit Service 392537
			break;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (count >= 10) {
Packit Service 392537
		ndmalogf (sess, 0, 0,
Packit Service 392537
			"Operation did not stop, something wrong");
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return finish;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_shutdown_tape_tcp (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	ndmp9_data_state	ds;
Packit Service 392537
	ndmp9_data_halt_reason	dhr;
Packit Service 392537
	int			count;
Packit Service 392537
	int			finish;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 3, "Waiting for operation to halt");
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		ndmca_mon_wait_for_something (sess, 2);
Packit Service 392537
Packit Service 392537
		if (ndmca_monitor_get_states (sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_HALTED) {
Packit Service 392537
		        dhr = ca->data_state.halt_reason;
Packit Service 392537
			break;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		if (count > 2) {
Packit Service 392537
			if (ds != NDMP9_DATA_STATE_HALTED)
Packit Service 392537
				ndmca_data_abort(sess);
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (count >= 10) {
Packit Service 392537
		ndmalogf (sess, 0, 0,
Packit Service 392537
			"Operation did not halt, something wrong");
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 2, "Operation halted, stopping");
Packit Service 392537
Packit Service 392537
	ds = ca->data_state.state;
Packit Service 392537
	dhr = ca->data_state.halt_reason;
Packit Service 392537
Packit Service 392537
	if (ds == NDMP9_DATA_STATE_HALTED) {
Packit Service 392537
	    if (dhr == NDMP9_DATA_HALT_SUCCESSFUL) {
Packit Service 392537
		/* Successful operation */
Packit Service 392537
		ndmalogf (sess, 0, 0, "Operation ended OKAY");
Packit Service 392537
		finish = 0;
Packit Service 392537
	    } else {
Packit Service 392537
		/* Questionable success */
Packit Service 392537
		ndmalogf (sess, 0, 0, "Operation ended questionably");
Packit Service 392537
		finish = 1;
Packit Service 392537
	    }
Packit Service 392537
	} else {
Packit Service 392537
	    ndmalogf (sess, 0, 0, "Operation ended in failure");
Packit Service 392537
	    finish = -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmca_data_stop (sess);
Packit Service 392537
Packit Service 392537
	for (count = 0; count < 10; count++) {
Packit Service 392537
		if (ndmca_monitor_get_states(sess) < 0)
Packit Service 392537
		    break;
Packit Service 392537
Packit Service 392537
#if 0
Packit Service 392537
		if (count > 2)
Packit Service 392537
			ndmca_mon_show_states(sess);
Packit Service 392537
#endif
Packit Service 392537
Packit Service 392537
		ds = ca->data_state.state;
Packit Service 392537
Packit Service 392537
		if (ds == NDMP9_DATA_STATE_IDLE) {
Packit Service 392537
			break;
Packit Service 392537
		}
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	if (count >= 10) {
Packit Service 392537
		ndmalogf (sess, 0, 0,
Packit Service 392537
			"Operation did not stop, something wrong");
Packit Service 392537
		return -1;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return finish;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_get_states (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int rc = 0;
Packit Service 392537
Packit Service 392537
	if (ndmca_data_get_state (sess) < 0)
Packit Service 392537
	    rc = -1;
Packit Service 392537
	if (!ca->job.tape_tcp) {
Packit Service 392537
	    if (ndmca_mover_get_state (sess) < 0)
Packit Service 392537
		rc = -1;
Packit Service 392537
	    ndmca_tape_get_state_no_tattle (sess);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	return rc;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_load_next (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 1, "Operation requires next tape");
Packit Service 392537
Packit Service 392537
	ndmca_media_capture_mover_window (sess);
Packit Service 392537
	ndmca_media_calculate_offsets (sess);
Packit Service 392537
Packit Service 392537
	if (ca->tape_mode == NDMP9_TAPE_RDWR_MODE) {
Packit Service 392537
	    if (ca->mover_state.pause_reason != NDMP9_MOVER_PAUSE_EOM)
Packit Service 392537
		ndmca_media_write_filemarks (sess);
Packit Service 392537
	    else
Packit Service 392537
		ndmalogf (sess, 0, 1, "At EOM, not writing filemarks");
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_unload_current(sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_load_next(sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_set_window_current (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_mover_continue(sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 1, "Operation resuming");
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
/* VERY VERY HARD */
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_seek_tape (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
	unsigned long long	pos;
Packit Service 392537
Packit Service 392537
	pos = ca->last_notify_mover_paused.seek_position;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 1, "Operation requires a different tape");
Packit Service 392537
Packit Service 392537
/*	ndmca_media_capture_mover_window (sess);	// !!! */
Packit Service 392537
	ndmca_media_calculate_offsets (sess);
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_unload_current(sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_load_seek (sess, pos);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_set_window_current (sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	rc = ndmca_mover_continue(sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 1, "Operation resuming");
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_monitor_unload_last_tape (struct ndm_session *sess)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			rc;
Packit Service 392537
Packit Service 392537
	if (!ca->media_is_loaded)
Packit Service 392537
		return 0;
Packit Service 392537
Packit Service 392537
	ndmca_media_capture_mover_window (sess);
Packit Service 392537
	ndmca_media_calculate_offsets (sess);
Packit Service 392537
Packit Service 392537
	if (ca->tape_mode == NDMP9_TAPE_RDWR_MODE) {
Packit Service 392537
		ndmca_media_write_filemarks (sess);
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	rc = ndmca_media_unload_current(sess);
Packit Service 392537
	if (rc) return rc;
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
Packit Service 392537
int
Packit Service 392537
ndmca_mon_wait_for_something (struct ndm_session *sess, int max_delay_secs)
Packit Service 392537
{
Packit Service 392537
	struct ndm_control_agent *ca = &sess->control_acb;
Packit Service 392537
	int			delta, notices;
Packit Service 392537
	int			time_ref = time(0) + max_delay_secs;
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 5, "mon_wait_for_something() entered");
Packit Service 392537
Packit Service 392537
	for (;;) {
Packit Service 392537
		delta = time_ref - time(0);
Packit Service 392537
		if (delta <= 0)
Packit Service 392537
			break;
Packit Service 392537
Packit Service 392537
		notices = 0;
Packit Service 392537
		if (ca->pending_notify_data_read) {
Packit Service 392537
			/* leave visible */
Packit Service 392537
			notices++;
Packit Service 392537
		}
Packit Service 392537
		if (ca->pending_notify_data_halted) {
Packit Service 392537
			/* just used to "wake up" */
Packit Service 392537
			ca->pending_notify_data_halted = 0;
Packit Service 392537
			notices++;
Packit Service 392537
		}
Packit Service 392537
		if (ca->pending_notify_mover_paused) {
Packit Service 392537
			/* leave visible */
Packit Service 392537
			notices++;
Packit Service 392537
		}
Packit Service 392537
		if (ca->pending_notify_mover_halted) {
Packit Service 392537
			/* just used to "wake up" */
Packit Service 392537
			ca->pending_notify_mover_halted = 0;
Packit Service 392537
			notices++;
Packit Service 392537
		}
Packit Service 392537
Packit Service 392537
		ndma_session_quantum (sess, notices ? 0 : delta);
Packit Service 392537
Packit Service 392537
		if (notices)
Packit Service 392537
			break;
Packit Service 392537
	}
Packit Service 392537
Packit Service 392537
	ndmalogf (sess, 0, 5, "mon_wait_for_something() happened, resid=%d",
Packit Service 392537
			delta);
Packit Service 392537
Packit Service 392537
	return 0;
Packit Service 392537
}
Packit Service 392537
#endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */