/*
* Copyright (c) 2000,2001
* Traakan, Inc., Los Altos, CA
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice unmodified, this list of conditions, and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* Project: NDMJOB
* Ident: $Id: $
*
* Description:
* NDMPv9, represented here, is a ficticious version
* used internally and never over-the-wire. This
* isolates higher-level routines from variations
* between NDMP protocol version. At this time,
* NDMPv2, NDMPv3 and NDMPv4 are deployed. NDMPv9 tends
* to be bits and pieces of all supported protocol versions
* mashed together.
*
* While we want the higher-level routines isolated,
* for clarity we still want them to use data structures
* and construct that resemble NDMP. Higher-level routines
* manipulate NDMPv9 data structures. Mid-level routines
* translate between NDMPv9 and the over-the-wire version
* in use. Low-level routines do the over-the-wire functions.
*
* The approach of using the latest version internally
* and retrofiting earlier versions was rejected for
* two reasons. First, it means a tear-up of higher-level
* functions as new versions are deployed. Second,
* it makes building with selected version impossible.
* No matter what approach is taken, there will be
* some sort of retrofit between versions. NDMPv9
* is simply the internal version, and all bona-fide
* versions are retrofitted. v9 was chosen because
* it is unlikely the NDMP version will reach 9
* within the useful life of the NDMP architecture.
*
* NDMPv9 could be implemented in a hand-crafted header (.h)
* file, yet we continue to use the ONC RPC (.x) description
* for convenvience. It's easy to cut-n-paste from the other
* NDMP.x files. It's important that ndmp9_xdr.c never be
* generated nor compiled.
*/
/*
* (from ndmp3.x)
* ndmp.x
*
* Description : NDMP protocol rpcgen file.
*
* Copyright (c) 1999 Intelliguard Software, Network Appliance.
* All Rights Reserved.
*/
/*
* (from ndmp2.x)
* Copyright (c) 1997 Network Appliance. All Rights Reserved.
*
* Network Appliance makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
const NDMP9VER = 9;
/*
* General types
****************************************************************
*/
/*
* Error codes
*/
enum ndmp9_error {
NDMP9_NO_ERR, /* No error */
NDMP9_NOT_SUPPORTED_ERR, /* Call is not supported */
NDMP9_DEVICE_BUSY_ERR, /* The device is in use */
NDMP9_DEVICE_OPENED_ERR, /* Another tape or scsi device
* is already open */
NDMP9_NOT_AUTHORIZED_ERR, /* connection has not been authorized*/
NDMP9_PERMISSION_ERR, /* some sort of permission problem */
NDMP9_DEV_NOT_OPEN_ERR, /* SCSI device is not open */
NDMP9_IO_ERR, /* I/O error */
NDMP9_TIMEOUT_ERR, /* command timed out */
NDMP9_ILLEGAL_ARGS_ERR, /* illegal arguments in request */
NDMP9_NO_TAPE_LOADED_ERR, /* Cannot open because there is
no tape loaded */
NDMP9_WRITE_PROTECT_ERR, /* tape cannot be open for write */
NDMP9_EOF_ERR, /* Command encountered EOF */
NDMP9_EOM_ERR, /* Command encountered EOM */
NDMP9_FILE_NOT_FOUND_ERR, /* File not found during recover */
NDMP9_BAD_FILE_ERR, /* The file descriptor is invalid */
NDMP9_NO_DEVICE_ERR, /* The device is not at that target */
NDMP9_NO_BUS_ERR, /* Invalid controller */
NDMP9_XDR_DECODE_ERR, /* Can't decode the request argument */
NDMP9_ILLEGAL_STATE_ERR, /* Call can't be done at this state */
NDMP9_UNDEFINED_ERR, /* Undefined Error */
NDMP9_XDR_ENCODE_ERR, /* Can't encode the reply argument */
NDMP9_NO_MEM_ERR, /* no memory */
NDMP9_CONNECT_ERR, /* Error connecting to another
* NDMP server */
NDMP9_SEQUENCE_NUM_ERR,
NDMP9_READ_IN_PROGRESS_ERR = 25,
NDMP9_PRECONDITION_ERR = 26,
NDMP9_CLASS_NOT_SUPPORTED = 27,
NDMP9_VERSION_NOT_SUPPORTED = 28,
NDMP9_EXT_DUPL_CLASSES = 29,
NDMP9_EXT_DN_ILLEGAL = 30
};
/*
* Message codes
*/
enum ndmp9_message {
NDMP9_CONNECT_OPEN = 0x900, /* CONNECT INTERFACE */
NDMP9_CONNECT_CLIENT_AUTH = 0x901,
NDMP9_CONNECT_CLOSE = 0x902,
NDMP9_CONNECT_SERVER_AUTH = 0x903,
NDMP9_CONFIG_GET_HOST_INFO = 0x100, /* CONFIG INTERFACE */
NDMP9_CONFIG_GET_CONNECTION_TYPE = 0x102, /* NDMP2_CONFIG_GET_MOVER_TYPE on v2*/
NDMP9_CONFIG_GET_AUTH_ATTR = 0x103,
NDMP9_CONFIG_GET_BUTYPE_INFO = 0x104, /* NDMPv3 and forward */
NDMP9_CONFIG_GET_FS_INFO = 0x105, /* NDMPv3 and forward */
NDMP9_CONFIG_GET_TAPE_INFO = 0x106, /* NDMPv3 and forward */
NDMP9_CONFIG_GET_SCSI_INFO = 0x107, /* NDMPv3 and forward */
NDMP9_CONFIG_GET_SERVER_INFO =0x108, /* NDMPv3 and forward */
NDMP9_SCSI_OPEN = 0x200, /* SCSI INTERFACE */
NDMP9_SCSI_CLOSE = 0x201,
NDMP9_SCSI_GET_STATE = 0x202,
NDMP9_SCSI_SET_TARGET = 0x203,
NDMP9_SCSI_RESET_DEVICE = 0x204,
NDMP9_SCSI_RESET_BUS = 0x205,
NDMP9_SCSI_EXECUTE_CDB = 0x206,
NDMP9_TAPE_OPEN = 0x300, /* TAPE INTERFACE */
NDMP9_TAPE_CLOSE = 0x301,
NDMP9_TAPE_GET_STATE = 0x302,
NDMP9_TAPE_MTIO = 0x303,
NDMP9_TAPE_WRITE = 0x304,
NDMP9_TAPE_READ = 0x305,
NDMP9_TAPE_EXECUTE_CDB = 0x307,
NDMP9_DATA_GET_STATE = 0x400, /* DATA INTERFACE */
NDMP9_DATA_START_BACKUP = 0x401,
NDMP9_DATA_START_RECOVER = 0x402,
NDMP9_DATA_ABORT = 0x403,
NDMP9_DATA_GET_ENV = 0x404,
NDMP9_DATA_STOP = 0x407,
NDMP9_DATA_LISTEN = 0x409,
NDMP9_DATA_CONNECT = 0x40a,
NDMP9_DATA_START_RECOVER_FILEHIST = 0x40b,
NDMP9_NOTIFY_DATA_HALTED =0x501,/* NOTIFY INTERFACE */
NDMP9_NOTIFY_CONNECTED = 0x502,
NDMP9_NOTIFY_MOVER_HALTED = 0x503,
NDMP9_NOTIFY_MOVER_PAUSED = 0x504,
NDMP9_NOTIFY_DATA_READ =0x505,
NDMP9_LOG_FILE = 0x602, /* LOGGING INTERFACE */
NDMP9_LOG_MESSAGE = 0x603,
NDMP9_FH_ADD_FILE = 0x703, /* FILE HISTORY INTERFACE */
NDMP9_FH_ADD_DIR = 0x704,
NDMP9_FH_ADD_NODE = 0x705,
NDMP9_MOVER_GET_STATE = 0xa00, /* MOVER INTERFACE */
NDMP9_MOVER_LISTEN = 0xa01,
NDMP9_MOVER_CONTINUE = 0xa02,
NDMP9_MOVER_ABORT = 0xa03,
NDMP9_MOVER_STOP = 0xa04,
NDMP9_MOVER_SET_WINDOW = 0xa05,
NDMP9_MOVER_READ = 0xa06,
NDMP9_MOVER_CLOSE =0xa07,
NDMP9_MOVER_SET_RECORD_SIZE =0xa08,
NDMP9_MOVER_CONNECT =0xa09
};
/*
* Common message bodies
*/
%extern bool_t xdr_ndmp9_no_arguments();
%#define ndmp9_no_arguments int
struct ndmp9_just_error_reply {
ndmp9_error error;
};
/*
* 64-bit integers
*/
%extern bool_t xdr_ndmp9_u_quad();
%#define ndmp9_u_quad unsigned long long
/*
* Valid values. Sometimes we have values, and sometimes we don't.
*/
enum ndmp9_validity {
NDMP9_VALIDITY_INVALID = 0,
NDMP9_VALIDITY_VALID,
NDMP9_VALIDITY_MAYBE_INVALID,
NDMP9_VALIDITY_MAYBE_VALID
};
%#define NDMP9_INVALID_U_LONG 0xFFFFFFFFul
struct ndmp9_valid_u_long {
ndmp9_validity valid;
u_long value;
};
%#define NDMP9_INVALID_U_QUAD 0xFFFFFFFFFFFFFFFFull
struct ndmp9_valid_u_quad {
ndmp9_validity valid;
ndmp9_u_quad value;
};
/*
* Property values. A simple name/value pair. Used in lots of places.
*/
struct ndmp9_pval {
string name<>;
string value<>;
};
/*
* Authorization data. Three authorization types each
* with their particular values. Authorization is done
* in three steps:
* 1) Client determines which types of authorization are available
* on the server.
* 2) Client may get parameters (challenge) from server.
* 3) Client requests authorization based on a shared
* secret (password) with parameters (challenge) applied.
*/
enum ndmp9_auth_type {
NDMP9_AUTH_NONE, /* no password is required */
NDMP9_AUTH_TEXT, /* the clear text password */
NDMP9_AUTH_MD5 /* md5 */
};
union ndmp9_auth_attr switch (enum ndmp9_auth_type auth_type) {
case NDMP9_AUTH_NONE:
void;
case NDMP9_AUTH_TEXT:
void;
case NDMP9_AUTH_MD5:
opaque challenge[64];
};
struct ndmp9_auth_text {
string auth_id<>; /* account/user name */
string auth_password<>; /* clear-text password */
};
struct ndmp9_auth_md5 {
string auth_id<>; /* account/user name */
opaque auth_digest[16]; /* MD5 "hashed" password */
};
union ndmp9_auth_data switch (enum ndmp9_auth_type auth_type) {
case NDMP9_AUTH_NONE:
void;
case NDMP9_AUTH_TEXT:
struct ndmp9_auth_text auth_text;
case NDMP9_AUTH_MD5:
struct ndmp9_auth_md5 auth_md5;
};
/*
* The data connection (data stream, image stream, big ol' pipe)
* has two endpoints, Once side instigates the connection (connects),
* the other side receives the connection (listen/accept).
* Appears in DATA and MOVER interfaces.
*/
enum ndmp9_addr_type {
NDMP9_ADDR_LOCAL,
NDMP9_ADDR_TCP,
/* IPC and FC addr types contemplated but never deployed */
NDMP9_ADDR_AS_CONNECTED = 0x1000
};
struct ndmp9_tcp_addr {
u_long ip_addr;
u_short port;
};
union ndmp9_addr switch (ndmp9_addr_type addr_type) {
case NDMP9_ADDR_LOCAL:
case NDMP9_ADDR_AS_CONNECTED:
void;
case NDMP9_ADDR_TCP:
ndmp9_tcp_addr tcp_addr;
};
/*
* CONNECT INTERFACE
****************************************************************
*
* The CONNECT INTERFACE is used to condition and authorize
* the control connection from the CONTROL Agent (DMA, Client)
* to the DATA, TAPE, or SCSI Agent (DSP, Servers).
*
* Most of this is addressed by NDMP0 (zero), which is a companion
* ficticious version. The NDMP0 features must never change to
* support protocol version negotiation. Once the version is
* negotiated, subsequent negotiations and authorization can
* take place.
*/
/* NDMP9_CONNECT_OPEN -- must never change, negotiate protocol version */
struct ndmp9_connect_open_request {
u_short protocol_version; /* the version of protocol supported */
};
typedef ndmp9_just_error_reply ndmp9_connect_open_reply;
/* NDMP9_CONNECT_CLIENT_AUTH -- authorize client */
struct ndmp9_connect_client_auth_request {
ndmp9_auth_data auth_data;
};
typedef ndmp9_just_error_reply ndmp9_connect_client_auth_reply;
/* NDMP9_CONNECT_CLOSE -- must never change, terminate control connection */
typedef ndmp9_no_arguments ndmp9_connect_close_request;
typedef ndmp9_no_arguments ndmp9_connect_close_reply;
/* NDMP9_CONNECT_SERVER_AUTH -- once client is authorized, ask server to
* prove itself -- nobody is using this */
struct ndmp9_connect_server_auth_request {
ndmp9_auth_attr client_attr;
};
struct ndmp9_connect_server_auth_reply {
ndmp9_error error;
ndmp9_auth_data server_result;
};
/*
* CONFIG INTERFACE
****************************************************************
*
* The CONFIG interfaces allow the CONTROL Agent (DMA, client) to
* obtain resource and other information from the DATA/TAPE/SCSI
* Agent (DSP, server).
*
* For NDMPv9, the whole show is lumped into a single data structure.
* The specific CONFIG interfaces, which vary between versions,
* pick-n-choose the info needed.
*/
struct ndmp9_butype_info {
string butype_name<>;
ndmp9_valid_u_long v2attr;
ndmp9_valid_u_long v3attr;
ndmp9_valid_u_long v4attr;
ndmp9_pval default_env<>;
};
struct ndmp9_fs_info {
string fs_type<>;
string fs_logical_device<>;
string fs_physical_device<>;
ndmp9_valid_u_quad total_size;
ndmp9_valid_u_quad used_size;
ndmp9_valid_u_quad avail_size;
ndmp9_valid_u_quad total_inodes;
ndmp9_valid_u_quad used_inodes;
ndmp9_pval fs_env<>;
string fs_status<>;
};
struct ndmp9_device_capability {
string device<>;
ndmp9_valid_u_long v3attr;
ndmp9_valid_u_long v4attr;
ndmp9_pval capability<>;
};
struct ndmp9_device_info {
string model<>;
ndmp9_device_capability caplist<>;
};
const NDMP9_CONFIG_CONNTYPE_LOCAL = 0x0001;
const NDMP9_CONFIG_CONNTYPE_TCP = 0x0002;
const NDMP9_CONFIG_AUTHTYPE_NONE = 0x0001;
const NDMP9_CONFIG_AUTHTYPE_TEXT = 0x0002;
const NDMP9_CONFIG_AUTHTYPE_MD5 = 0x0004;
struct ndmp9_config_info {
ndmp9_error error;
/* ndmp[23]_config_get_host_info_reply */
string hostname<>; /* host name */
string os_type<>; /* The O/S type (e.g. SOLARIS) */
string os_vers<>; /* The O/S version (e.g. 2.5) */
string hostid<>;
/* ndmp[34]_config_get_server_info_reply */
string vendor_name<>;
string product_name<>;
string revision_number<>;
/* ndmp2_config_get_host_info */
/* ndmp[34]_config_get_server_info */
u_long authtypes;
/* ndmp2_config_get_mover_type */
/* ndmp[34]_config_get_connection_type */
u_long conntypes;
/* ndmp2_config_get_butype_attr */
/* ndmp[34]_config_get_butype_info */
ndmp9_butype_info butype_info<>;
/* ndmp[34]_config_get_fs_info */
ndmp9_fs_info fs_info<>;
/* ndmp[34]_config_get_tape_info */
ndmp9_device_info tape_info<>;
/* ndmp[34]_config_get_scsi_info */
ndmp9_device_info scsi_info<>;
};
/* NDMP9_CONFIG_GET_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_info_request;
struct ndmp9_config_get_info_reply {
ndmp9_error error;
ndmp9_config_info config_info;
};
/* NDMP9_CONFIG_GET_HOST_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_host_info_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_host_info_reply;
/* NDMP9_CONFIG_GET_CONNECTION_TYPE */
typedef ndmp9_no_arguments ndmp9_config_get_connection_type_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_connection_type_reply;
/* NDMP9_CONFIG_GET_SERVER_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_server_info_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_server_info_reply;
/* NDMP9_CONFIG_GET_BUTYPE_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_butype_info_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_butype_info_reply;
/* NDMP9_CONFIG_GET_FS_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_fs_info_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_fs_info_reply;
/* NDMP9_CONFIG_GET_TAPE_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_tape_info_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_tape_info_reply;
/* NDMP9_CONFIG_GET_SCSI_INFO */
typedef ndmp9_no_arguments ndmp9_config_get_scsi_info_request;
typedef ndmp9_config_get_info_reply ndmp9_config_get_scsi_info_reply;
/* NDMP9_CONFIG_GET_AUTH_ATTR */
struct ndmp9_config_get_auth_attr_request {
ndmp9_auth_type auth_type;
};
struct ndmp9_config_get_auth_attr_reply {
ndmp9_error error;
ndmp9_auth_attr server_attr;
};
/*
* SCSI INTERFACE
****************************************************************
*
* A SCSI pass-thru service. The CONTROL Agent (DMA, Client)
* manipulates a SCSI Media Changer through this interface.
* It may be used for other purposes.
*/
/* NDMP9_SCSI_OPEN */
struct ndmp9_scsi_open_request {
string device<>;
};
typedef ndmp9_just_error_reply ndmp9_scsi_open_reply;
/* NDMP9_SCSI_CLOSE */
typedef ndmp9_no_arguments ndmp9_scsi_close_request;
typedef ndmp9_just_error_reply ndmp9_scsi_close_reply;
/* NDMP9_SCSI_GET_STATE */
typedef ndmp9_no_arguments ndmp9_scsi_get_state_request;
struct ndmp9_scsi_get_state_reply {
ndmp9_error error;
short target_controller;
short target_id;
short target_lun;
};
/* NDMP9_SCSI_SET_TARGET -- deleted for NDMPv4 */
struct ndmp9_scsi_set_target_request {
string device<>;
u_short target_controller;
u_short target_id;
u_short target_lun;
};
typedef ndmp9_just_error_reply ndmp9_scsi_set_target_reply;
/* NDMP9_SCSI_RESET_DEVICE */
typedef ndmp9_no_arguments ndmp9_scsi_reset_device_request;
typedef ndmp9_just_error_reply ndmp9_scsi_reset_device_reply;
/* NDMP9_SCSI_RESET_BUS -- deleted for NDMPv4 */
typedef ndmp9_no_arguments ndmp9_scsi_reset_bus_request;
typedef ndmp9_just_error_reply ndmp9_scsi_reset_bus_reply;
/* NDMP9_SCSI_EXECUTE_CDB */
enum ndmp9_scsi_data_dir {
NDMP9_SCSI_DATA_DIR_NONE = 0,
NDMP9_SCSI_DATA_DIR_IN = 1, /* Expect data from SCSI device */
NDMP9_SCSI_DATA_DIR_OUT = 2 /* Transfer data to SCSI device */
};
struct ndmp9_execute_cdb_request {
ndmp9_scsi_data_dir data_dir;
u_long timeout;
u_long datain_len; /* Set for expected datain */
opaque cdb<>;
opaque dataout<>;
};
struct ndmp9_execute_cdb_reply {
ndmp9_error error;
u_char status; /* SCSI status bytes */
u_long dataout_len;
opaque datain<>; /* SCSI datain */
opaque ext_sense<>; /* Extended sense data */
};
typedef ndmp9_execute_cdb_request ndmp9_scsi_execute_cdb_request;
typedef ndmp9_execute_cdb_reply ndmp9_scsi_execute_cdb_reply;
/******************/
/* TAPE INTERFACE */
/******************/
/* NDMP9_TAPE_OPEN */
enum ndmp9_tape_open_mode {
NDMP9_TAPE_READ_MODE,
NDMP9_TAPE_RDWR_MODE,
NDMP9_TAPE_RAW_MODE /* new for NDMPv4 */
};
enum ndmp9_tape_state {
NDMP9_TAPE_STATE_IDLE, /* not doing anything */
NDMP9_TAPE_STATE_OPEN, /* open, tape operations OK */
NDMP9_TAPE_STATE_MOVER /* mover active, tape ops locked out */
/* ie read, write, mtio, close, cdb */
};
struct ndmp9_tape_open_request {
string device<>;
ndmp9_tape_open_mode mode;
};
typedef ndmp9_just_error_reply ndmp9_tape_open_reply;
/* NDMP9_TAPE_CLOSE */
typedef ndmp9_no_arguments ndmp9_tape_close_request;
typedef ndmp9_just_error_reply ndmp9_tape_close_reply;
/* NDMP9_TAPE_GET_STATE */
const NDMP9_TAPE_STATE_NOREWIND = 0x0008; /* non-rewind device */
const NDMP9_TAPE_STATE_WR_PROT = 0x0010; /* write-protected */
const NDMP9_TAPE_STATE_ERROR = 0x0020; /* media error */
const NDMP9_TAPE_STATE_UNLOAD = 0x0040; /* tape will be unloaded when
* the device is closed */
typedef ndmp9_no_arguments ndmp9_tape_get_state_request;
struct ndmp9_tape_get_state_reply {
ndmp9_error error;
u_long flags; /* compatible NDMP[2349] */
ndmp9_tape_state state;
ndmp9_tape_open_mode open_mode;
ndmp9_valid_u_long file_num;
ndmp9_valid_u_long soft_errors;
ndmp9_valid_u_long block_size;
ndmp9_valid_u_long blockno;
ndmp9_valid_u_quad total_space;
ndmp9_valid_u_quad space_remain;
ndmp9_valid_u_long partition;
};
/* NDMP9_TAPE_MTIO */
enum ndmp9_tape_mtio_op {
NDMP9_MTIO_FSF,
NDMP9_MTIO_BSF,
NDMP9_MTIO_FSR,
NDMP9_MTIO_BSR,
NDMP9_MTIO_REW,
NDMP9_MTIO_EOF,
NDMP9_MTIO_OFF
};
struct ndmp9_tape_mtio_request {
ndmp9_tape_mtio_op tape_op;
u_long count;
};
struct ndmp9_tape_mtio_reply {
ndmp9_error error;
u_long resid_count;
};
/* NDMP9_TAPE_WRITE */
struct ndmp9_tape_write_request {
opaque data_out<>;
};
struct ndmp9_tape_write_reply {
ndmp9_error error;
u_long count;
};
/* NDMP9_TAPE_READ */
struct ndmp9_tape_read_request {
u_long count;
};
struct ndmp9_tape_read_reply {
ndmp9_error error;
opaque data_in<>;
};
/* NDMP9_TAPE_EXECUTE_CDB */
typedef ndmp9_execute_cdb_request ndmp9_tape_execute_cdb_request;
typedef ndmp9_execute_cdb_reply ndmp9_tape_execute_cdb_reply;
/********************************/
/* MOVER INTERFACE */
/********************************/
enum ndmp9_mover_state {
NDMP9_MOVER_STATE_IDLE,
NDMP9_MOVER_STATE_LISTEN,
NDMP9_MOVER_STATE_ACTIVE,
NDMP9_MOVER_STATE_PAUSED,
NDMP9_MOVER_STATE_HALTED,
NDMP9_MOVER_STATE_STANDBY /* awaiting mover_read_request */
};
enum ndmp9_mover_mode {
NDMP9_MOVER_MODE_READ, /* read from data conn; write to tape */
NDMP9_MOVER_MODE_WRITE /* write to data conn; read from tape */
};
enum ndmp9_mover_pause_reason {
NDMP9_MOVER_PAUSE_NA,
NDMP9_MOVER_PAUSE_EOM,
NDMP9_MOVER_PAUSE_EOF,
NDMP9_MOVER_PAUSE_SEEK,
NDMP9_MOVER_PAUSE_MEDIA_ERROR,
NDMP9_MOVER_PAUSE_EOW
};
enum ndmp9_mover_halt_reason {
NDMP9_MOVER_HALT_NA,
NDMP9_MOVER_HALT_CONNECT_CLOSED,
NDMP9_MOVER_HALT_ABORTED,
NDMP9_MOVER_HALT_INTERNAL_ERROR,
NDMP9_MOVER_HALT_CONNECT_ERROR,
NDMP9_MOVER_HALT_MEDIA_ERROR
};
/* NDMP9_MOVER_GET_STATE */
typedef ndmp9_no_arguments ndmp9_mover_get_state_request;
struct ndmp9_mover_get_state_reply {
ndmp9_error error;
ndmp9_mover_state state;
ndmp9_mover_mode mode;
ndmp9_mover_pause_reason pause_reason;
ndmp9_mover_halt_reason halt_reason;
u_long record_size;
u_long record_num;
ndmp9_u_quad bytes_moved;
ndmp9_u_quad seek_position;
ndmp9_u_quad bytes_left_to_read;
ndmp9_u_quad window_offset;
ndmp9_u_quad window_length;
ndmp9_addr data_connection_addr;
};
/* NDMP9_MOVER_LISTEN */
struct ndmp9_mover_listen_request {
ndmp9_mover_mode mode;
ndmp9_addr_type addr_type;
};
struct ndmp9_mover_listen_reply {
ndmp9_error error;
ndmp9_addr data_connection_addr;
};
/* NDMP9_MOVER_CONNECT */
struct ndmp9_mover_connect_request {
ndmp9_mover_mode mode;
ndmp9_addr addr;
};
typedef ndmp9_just_error_reply ndmp9_mover_connect_reply;
/* NDMP9_MOVER_SET_RECORD_SIZE */
struct ndmp9_mover_set_record_size_request {
u_long record_size;
};
typedef ndmp9_just_error_reply ndmp9_mover_set_record_size_reply;
/* NDMP9_MOVER_SET_WINDOW */
struct ndmp9_mover_set_window_request {
ndmp9_u_quad offset;
ndmp9_u_quad length;
};
typedef ndmp9_just_error_reply ndmp9_mover_set_window_reply;
/* NDMP9_MOVER_CONTINUE */
typedef ndmp9_no_arguments ndmp9_mover_continue_request;
typedef ndmp9_just_error_reply ndmp9_mover_continue_reply;
/* NDMP9_MOVER_ABORT */
typedef ndmp9_no_arguments ndmp9_mover_abort_request;
typedef ndmp9_just_error_reply ndmp9_mover_abort_reply;
/* NDMP9_MOVER_STOP */
typedef ndmp9_no_arguments ndmp9_mover_stop_request;
typedef ndmp9_just_error_reply ndmp9_mover_stop_reply;
/* NDMP9_MOVER_READ */
struct ndmp9_mover_read_request {
ndmp9_u_quad offset;
ndmp9_u_quad length;
};
typedef ndmp9_just_error_reply ndmp9_mover_read_reply;
/* NDMP9_MOVER_CLOSE */
typedef ndmp9_no_arguments ndmp9_mover_close_request;
typedef ndmp9_just_error_reply ndmp9_mover_close_reply;
/****************************/
/* DATA INTERFACE */
/****************************/
enum ndmp9_data_operation {
NDMP9_DATA_OP_NOACTION,
NDMP9_DATA_OP_BACKUP,
NDMP9_DATA_OP_RECOVER,
NDMP9_DATA_OP_RECOVER_FILEHIST
};
enum ndmp9_data_state {
NDMP9_DATA_STATE_IDLE,
NDMP9_DATA_STATE_ACTIVE,
NDMP9_DATA_STATE_HALTED,
NDMP9_DATA_STATE_LISTEN,
NDMP9_DATA_STATE_CONNECTED
};
enum ndmp9_data_halt_reason {
NDMP9_DATA_HALT_NA,
NDMP9_DATA_HALT_SUCCESSFUL,
NDMP9_DATA_HALT_ABORTED,
NDMP9_DATA_HALT_INTERNAL_ERROR,
NDMP9_DATA_HALT_CONNECT_ERROR
};
/* NDMP9_DATA_START_BACKUP */
typedef ndmp9_no_arguments ndmp9_data_get_state_request;
struct ndmp9_data_get_state_reply {
ndmp9_error error;
ndmp9_data_operation operation;
ndmp9_data_state state;
ndmp9_data_halt_reason halt_reason;
ndmp9_u_quad bytes_processed;
ndmp9_valid_u_quad est_bytes_remain;
ndmp9_valid_u_long est_time_remain;
ndmp9_addr data_connection_addr;
ndmp9_u_quad read_offset;
ndmp9_u_quad read_length;
};
struct ndmp9_name {
string original_path<>; /* relative to backup root */
string destination_path<>;
/* nt_destination_path<> */
ndmp9_valid_u_quad fh_info;
};
/* NDMP9_DATA_START_BACKUP */
struct ndmp9_data_start_backup_request {
string bu_type<>; /* backup method to use */
ndmp9_pval env<>; /* Parameters that may modify backup */
ndmp9_addr addr;
};
typedef ndmp9_just_error_reply ndmp9_data_start_backup_reply;
/* NDMP9_DATA_START_RECOVER */
struct ndmp9_data_start_recover_request {
ndmp9_pval env<>;
ndmp9_name nlist<>;
string bu_type<>;
ndmp9_addr addr;
};
typedef ndmp9_just_error_reply ndmp9_data_start_recover_reply;
/* NDMP9_DATA_START_RECOVER_FILEHIST */
typedef ndmp9_data_start_recover_request ndmp9_data_start_recover_filehist_request;
typedef ndmp9_data_start_recover_reply ndmp9_data_start_recover_filehist_reply;
/* NDMP9_DATA_ABORT */
typedef ndmp9_no_arguments ndmp9_data_abort_request;
typedef ndmp9_just_error_reply ndmp9_data_abort_reply;
/* NDMP9_DATA_STOP */
typedef ndmp9_no_arguments ndmp9_data_stop_request;
typedef ndmp9_just_error_reply ndmp9_data_stop_reply;
/* NDMP9_DATA_GET_ENV */
typedef ndmp9_no_arguments ndmp9_data_get_env_request;
struct ndmp9_data_get_env_reply {
ndmp9_error error;
ndmp9_pval env<>;
};
/* NDMP9_DATA_LISTEN */
struct ndmp9_data_listen_request {
ndmp9_addr_type addr_type;
};
struct ndmp9_data_listen_reply {
ndmp9_error error;
ndmp9_addr data_connection_addr;
};
/* NDMP9_DATA_CONNECT */
struct ndmp9_data_connect_request {
ndmp9_addr addr;
};
typedef ndmp9_just_error_reply ndmp9_data_connect_reply;
/****************************/
/* NOTIFY INTERFACE */
/****************************/
/* NDMP9_NOTIFY_DATA_HALTED */
struct ndmp9_notify_data_halted_request {
ndmp9_data_halt_reason reason;
};
enum ndmp9_connect_reason {
NDMP9_CONNECTED, /* Connect sucessfully */
NDMP9_SHUTDOWN, /* Connection shutdown */
NDMP9_REFUSED /* reach the maximum number of connections */
};
/* NDMP9_NOTIFY_CONNECTED */
struct ndmp9_notify_connected_request {
ndmp9_connect_reason reason;
u_short protocol_version;
string text_reason<>;
};
/* NDMP9_NOTIFY_MOVER_HALTED */
struct ndmp9_notify_mover_halted_request {
ndmp9_mover_halt_reason reason;
};
/* NDMP9_NOTIFY_MOVER_PAUSED */
struct ndmp9_notify_mover_paused_request {
ndmp9_mover_pause_reason reason;
ndmp9_u_quad seek_position;
};
/* NDMP9_NOTIFY_DATA_READ */
struct ndmp9_notify_data_read_request {
ndmp9_u_quad offset;
ndmp9_u_quad length;
};
/********************************/
/* LOG INTERFACE */
/********************************/
/* NDMP9_LOG_MESSAGE */
enum ndmp9_log_type {
NDMP9_LOG_NORMAL,
NDMP9_LOG_DEBUG,
NDMP9_LOG_ERROR,
NDMP9_LOG_WARNING
};
struct ndmp9_log_message_request {
ndmp9_log_type log_type;
u_long message_id;
string entry<>;
ndmp9_valid_u_long associated_message_sequence;
};
/* No reply */
enum ndmp9_recovery_status {
NDMP9_RECOVERY_SUCCESSFUL = 0,
NDMP9_RECOVERY_FAILED_PERMISSION = 1,
NDMP9_RECOVERY_FAILED_NOT_FOUND = 2,
NDMP9_RECOVERY_FAILED_NO_DIRECTORY = 3,
NDMP9_RECOVERY_FAILED_OUT_OF_MEMORY = 4,
NDMP9_RECOVERY_FAILED_IO_ERROR = 5,
NDMP9_RECOVERY_FAILED_UNDEFINED_ERROR = 6
};
/* NDMP9_LOG_FILE */
struct ndmp9_log_file_request {
string name<>;
ndmp9_recovery_status recovery_status;
};
/* No reply */
/*
* FILE HISTORY INTERFACES
****************************************************************
*/
enum ndmp9_file_type {
NDMP9_FILE_DIR,
NDMP9_FILE_FIFO,
NDMP9_FILE_CSPEC,
NDMP9_FILE_BSPEC,
NDMP9_FILE_REG,
NDMP9_FILE_SLINK,
NDMP9_FILE_SOCK,
NDMP9_FILE_REGISTRY,
NDMP9_FILE_OTHER
};
struct ndmp9_file_stat {
ndmp9_file_type ftype;
ndmp9_valid_u_long mtime;
ndmp9_valid_u_long atime;
ndmp9_valid_u_long ctime;
ndmp9_valid_u_long uid;
ndmp9_valid_u_long gid;
ndmp9_valid_u_long mode;
ndmp9_valid_u_quad size;
ndmp9_valid_u_long links;
/*
* Add NT attributes here as ndmp9_valid_....
*/
ndmp9_valid_u_quad node; /* id on disk at backup time */
ndmp9_valid_u_quad fh_info; /* id on tape at backup time */
};
/*
* ndmp_fh_add_file
* no reply
*/
struct ndmp9_file {
string unix_path<>;
/* nt_path<> here */
/* dos_path<> here */
ndmp9_file_stat fstat;
};
struct ndmp9_fh_add_file_request {
ndmp9_file files<>;
};
/*
* ndmp_fh_add_dir
* no reply
*/
struct ndmp9_dir {
string unix_name<>;
/* nt_name<> here */
/* dos_name<> here */
ndmp9_u_quad node;
ndmp9_u_quad parent;
};
struct ndmp9_fh_add_dir_request {
ndmp9_dir dirs<>;
};
/*
* ndmp_fh_add_node
* no reply
*/
struct ndmp9_node {
ndmp9_file_stat fstat;
};
struct ndmp9_fh_add_node_request {
ndmp9_node nodes<>;
};
/* No reply */