int ndmca_test_data_listen (struct ndm_session *sess, ndmp9_error expect_err, ndmp9_addr_type addr_type) { struct ndmconn * conn = sess->plumb.data; struct ndm_control_agent *ca = sess->control_acb; int rc; /* close previous test if there is one */ ndmca_test_close (sess); switch (conn->protocol_version) { default: return -1234; #ifndef NDMOS_OPTION_NO_NDMP3 case NDMP3VER: NDMC_WITH(ndmp3_data_listen, NDMP3VER) request->addr_type = addr_type; rc = NDMTEST_CALL(conn); if (rc) return rc; if (expect_err == NDMP9_NO_ERR && request->addr_type != reply->data_connection_addr.addr_type) { /* TODO: use proper test format */ ndmalogf (sess, "Test", 1, "DATA_LISTEN addr_type mismatch"); return -1; } ndmp_3to9_addr (&reply->data_connection_addr, &ca->data_addr); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP3 */ #ifndef NDMOS_OPTION_NO_NDMP4 case NDMP4VER: NDMC_WITH(ndmp4_data_listen, NDMP4VER) request->addr_type = addr_type; rc = NDMTEST_CALL(conn); if (rc) return rc; if (expect_err == NDMP9_NO_ERR && request->addr_type != reply->connect_addr.addr_type) { /* TODO: use proper test format */ ndmalogf (sess, "Test", 1, "DATA_LISTEN addr_type mismatch"); return -1; } ndmp_4to9_addr (&reply->connect_addr, &ca->data_addr); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP4 */ } return 0; }
int ndmca_data_connect (struct ndm_session *sess) { struct ndmconn * conn = sess->plumb.data; struct ndm_control_agent *ca = &sess->control_acb; int rc; ndmp9_addr addr; if (ca->job.tape_tcp) { char *host; char *port; struct sockaddr_in sin; host = ca->job.tape_tcp; port = strchr(ca->job.tape_tcp, ':'); *port++ = '\0'; rc = ndmhost_lookup(host, &sin); addr.addr_type = NDMP9_ADDR_TCP; addr.ndmp9_addr_u.tcp_addr.ip_addr = ntohl(sin.sin_addr.s_addr); addr.ndmp9_addr_u.tcp_addr.port = atoi(port); } else { addr = ca->mover_addr; } NDMC_WITH(ndmp9_data_connect, NDMP9VER) request->addr = addr; rc = NDMC_CALL(conn); NDMC_ENDWITH return rc; }
int ndmca_mover_listen (struct ndm_session *sess) { struct ndmconn * conn = sess->plumb.tape; struct ndm_control_agent *ca = &sess->control_acb; int rc; NDMC_WITH(ndmp9_mover_listen, NDMP9VER) request->mode = ca->mover_mode; if (sess->plumb.tape == sess->plumb.data) { request->addr_type = NDMP9_ADDR_LOCAL; } else { request->addr_type = NDMP9_ADDR_TCP; } rc = NDMC_CALL(conn); if (rc) return rc; if (request->addr_type != reply->data_connection_addr.addr_type) { ndmalogf (sess, 0, 0, "MOVER_LISTEN addr_type mismatch"); return -1; } ca->mover_addr = reply->data_connection_addr; NDMC_ENDWITH return 0; }
int ndmca_mover_set_record_size (struct ndm_session *sess) { struct ndmconn * conn = sess->plumb.tape; struct ndm_control_agent *ca = &sess->control_acb; int rc; NDMC_WITH(ndmp9_mover_set_record_size, NDMP9VER) request->record_size = ca->job.record_size; rc = NDMC_CALL(conn); NDMC_ENDWITH return rc; }
int ndmca_data_connect (struct ndm_session *sess) { struct ndmconn * conn = sess->plumb.data; struct ndm_control_agent *ca = &sess->control_acb; int rc; NDMC_WITH(ndmp9_data_connect, NDMP9VER) request->addr = ca->mover_addr; rc = NDMC_CALL(conn); NDMC_ENDWITH return rc; }
int ndmca_mover_read (struct ndm_session *sess, unsigned long long offset, unsigned long long length) { struct ndmconn * conn = sess->plumb.tape; int rc; NDMC_WITH(ndmp9_mover_read, NDMP9VER) request->offset = offset; request->length = length; rc = NDMC_CALL(conn); NDMC_ENDWITH return rc; }
int ndmca_tape_open (struct ndm_session *sess) { struct ndmconn * conn = sess->plumb.tape; struct ndm_control_agent *ca = &sess->control_acb; int rc; NDMC_WITH (ndmp9_tape_open, NDMP9VER) request->device = ca->job.tape_device; request->mode = ca->tape_mode; rc = NDMC_CALL(conn); ca->tape_state.error = reply->error; NDMC_ENDWITH return rc; }
int ndmca_tape_write (struct ndm_session *sess, char *buf, unsigned count) { struct ndmconn * conn = sess->plumb.tape; int rc; NDMC_WITH(ndmp9_tape_write, NDMP9VER) request->data_out.data_out_len = count; request->data_out.data_out_val = buf; rc = NDMC_CALL(conn); if (rc == 0) { if (reply->count != count) rc = -1; } NDMC_ENDWITH return rc; }
int ndmca_tape_read_partial (struct ndm_session *sess, char *buf, unsigned count, int *read_count) { struct ndmconn * conn = sess->plumb.tape; int rc; NDMC_WITH(ndmp9_tape_read, NDMP9VER) request->count = count; rc = NDMC_CALL(conn); if (rc == 0) { *read_count = reply->data_in.data_in_len; bcopy (reply->data_in.data_in_val, buf, *read_count); } else { rc = reply->error; } NDMC_FREE_REPLY(); NDMC_ENDWITH return rc; }
int ndmca_data_start_recover_filehist (struct ndm_session *sess) { struct ndmconn * conn = sess->plumb.data; struct ndm_control_agent *ca = &sess->control_acb; unsigned n_env = ca->job.env_tab.n_env; ndmp9_pval * env = ca->job.env_tab.env; unsigned n_nlist = ca->job.nlist_tab.n_nlist; ndmp9_name * nlist = ca->job.nlist_tab.nlist; ndmp9_addr addr; int rc; if (conn->protocol_version > 2) { if (ca->swap_connect) { if ( (rc = ndmca_mover_connect (sess)) != 0) { return rc; } } else { if ( (rc = ndmca_data_connect (sess)) != 0) { return rc; } } addr.addr_type = NDMP9_ADDR_AS_CONNECTED; } else { addr = ca->mover_addr; } NDMC_WITH(ndmp9_data_start_recover_filehist, NDMP9VER) request->addr = addr; request->bu_type = ca->job.bu_type; request->env.env_len = n_env; request->env.env_val = env; request->nlist.nlist_len = n_nlist; request->nlist.nlist_val = nlist; rc = NDMC_CALL(conn); NDMC_ENDWITH return rc; }
int ndmca_tape_mtio (struct ndm_session *sess, ndmp9_tape_mtio_op op, u_long count, u_long *resid) { struct ndmconn * conn = sess->plumb.tape; int rc; NDMC_WITH(ndmp9_tape_mtio, NDMP9VER) request->tape_op = op; request->count = count; rc = NDMC_CALL(conn); if (!rc) { if (resid) { *resid = reply->resid_count; } else if (reply->resid_count != 0) { return -1; } } NDMC_ENDWITH return rc; }
int ndmca_test_tape_read_2cnt (struct ndm_session *sess, ndmp9_error expect_err, char *buf, unsigned count, unsigned true_count) { struct ndmconn * conn = sess->plumb.tape; int rc; /* close previous test if there is one */ ndmca_test_close (sess); switch (conn->protocol_version) { default: return -1234; #ifndef NDMOS_OPTION_NO_NDMP2 case NDMP2VER: NDMC_WITH(ndmp2_tape_read, NDMP2VER) request->count = count; rc = NDMTEST_CALL(conn); if (rc == 0 && expect_err == NDMP9_NO_ERR) { if (reply->data_in.data_in_len == true_count) { bcopy (reply->data_in.data_in_val, buf, true_count); } else { rc = -1; } } NDMC_FREE_REPLY(); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP2 */ #ifndef NDMOS_OPTION_NO_NDMP3 case NDMP3VER: NDMC_WITH(ndmp3_tape_read, NDMP3VER) request->count = count; rc = NDMTEST_CALL(conn); if (rc == 0 && expect_err == NDMP9_NO_ERR) { if (reply->data_in.data_in_len == true_count) { bcopy (reply->data_in.data_in_val, buf, true_count); } else { rc = -1; } } NDMC_FREE_REPLY(); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP3 */ #ifndef NDMOS_OPTION_NO_NDMP4 case NDMP4VER: NDMC_WITH(ndmp4_tape_read, NDMP4VER) request->count = count; rc = NDMTEST_CALL(conn); if (rc == 0 && expect_err == NDMP9_NO_ERR) { if (reply->data_in.data_in_len == true_count) { bcopy (reply->data_in.data_in_val, buf, true_count); } else { rc = -1; } } NDMC_FREE_REPLY(); NDMC_ENDWITH break; #endif /* !NDMOS_OPTION_NO_NDMP4 */ } return rc; }