int ndmca_connect_tape_agent (struct ndm_session *sess) { int rc; if (sess->control_acb.job.tape_agent.conn_type == NDMCONN_TYPE_NONE) { rc = ndmca_connect_data_agent (sess); if (rc) { ndmconn_destruct (sess->plumb.data); return rc; } sess->plumb.tape = sess->plumb.data; rc = 0; } else { rc = ndmca_connect_xxx_agent (sess, &sess->plumb.tape, "#T", &sess->control_acb.job.tape_agent); ndmalogf (sess, 0, 7, "ndmca_connect_tape_agent: %d %p", rc, sess->plumb.tape); } if (rc == 0) { if (sess->plumb.tape->conn_type == NDMCONN_TYPE_RESIDENT) { sess->tape_acb.protocol_version = sess->plumb.tape->protocol_version; } } return rc; }
int ndmca_op_test_data (struct ndm_session *sess) { struct ndm_control_agent *ca = sess->control_acb; struct ndmconn * conn; int (*save_call) (struct ndmconn *conn, struct ndmp_xa_buf *xa); int rc; rc = ndmca_connect_data_agent(sess); if (rc) { ndmconn_destruct (sess->plumb.data); return rc; } conn = sess->plumb.data; save_call = conn->call; conn->call = ndma_call_no_tattle; /* perform query to find out about TCP and LOCAL support */ rc = ndmca_test_query_conn_types (sess, conn); if (rc) return rc; rc = ndmca_td_wrapper (sess, ndmca_td_idle); if (sess->plumb.data->protocol_version >= 3) { // version 3 and later adds LISTEN rc = ndmca_td_wrapper (sess, ndmca_td_listen); } ndmca_test_done_series (sess, "test-data"); ca = sess->control_acb; if (ca->has_tcp_addr && ca->has_local_addr) { ndmalogf (sess, "TEST", 0, "LOCAL and TCP addressing tested."); } else if (ca->has_tcp_addr) { ndmalogf (sess, "TEST", 0, "TCP addressing ONLY tested."); } else if (ca->has_local_addr) { ndmalogf (sess, "TEST", 0, "LOCAL addressing ONLY tested."); } else { ndmalogf (sess, "TEST", 0, "Neither TCP or LOCAL addressing tested."); } return 0; }
int ndmca_backreco_startup (struct ndm_session *sess) { struct ndm_control_agent *ca = sess->control_acb; int rc = 0; if (!ca->job.tape_tcp) rc = ndmca_op_robot_startup (sess, 1); if (rc) return rc; rc = ndmca_connect_data_agent(sess); if (rc) { ndmconn_destruct (sess->plumb.data); sess->plumb.data = NULL; return rc; } if (ca->job.tape_tcp) { return 0; } rc = ndmca_connect_tape_agent(sess); if (rc) { ndmconn_destruct (sess->plumb.tape); sess->plumb.tape = NULL; return rc; } rc = ndmca_mover_set_record_size (sess); if (rc) return rc; rc = ndmca_media_load_first (sess); if (rc) return rc; ndmca_media_calculate_offsets (sess); if (sess->control_acb->swap_connect && (sess->plumb.tape->protocol_version >= 3)) { if (sess->plumb.tape->protocol_version < 4) { rc = ndmca_data_listen (sess); if (rc) return rc; rc = ndmca_media_set_window_current (sess); if (rc) return rc; } else { rc = ndmca_media_set_window_current (sess); if (rc) return rc; rc = ndmca_data_listen (sess); if (rc) return rc; } } else { if (sess->plumb.tape->protocol_version < 4) { rc = ndmca_mover_listen (sess); if (rc) return rc; rc = ndmca_media_set_window_current (sess); if (rc) return rc; } else { rc = ndmca_media_set_window_current (sess); if (rc) return rc; rc = ndmca_mover_listen (sess); if (rc) return rc; } } return 0; }