コード例 #1
0
ファイル: ndma_ctst_data.c プロジェクト: eneuhauss/bareos
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;
}
コード例 #2
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #3
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #4
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #5
0
ファイル: ndma_ctrl_calls.c プロジェクト: TonyChiang/amanda
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;
}
コード例 #6
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #7
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #8
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #9
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #10
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #11
0
ファイル: ndma_ctrl_calls.c プロジェクト: malclocke/amanda
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;
}
コード例 #12
0
ファイル: ndma_ctst_tape.c プロジェクト: B-Rich/amanda
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;
}