1 /* 2 * Copyright (c) 1998,1999,2000 3 * Traakan, Inc., Los Altos, CA 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice unmodified, this list of conditions, and the following 11 * disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 /* 30 * Project: NDMJOB 31 * Ident: $Id: $ 32 * 33 * Description: 34 * 35 ******************************************************************** 36 * 37 * NDMP Elements of a backup/restore session 38 * 39 * +-----+ ########### 40 * | Job |----># CONTROL # +----------------+ 41 * +-----+ # Agent #<---->|FILE/MEDIA INDEX| 42 * # # +----------------+ 43 * ########### 44 * | | | 45 * +----------------+ | +---------------------+ 46 * | control | connections | 47 * V V V 48 * ############ ############ +-------+ ######### 49 * # DATA # # TAPE # | | # ROBOT # 50 * # Agent # # Agent # | ROBOT |<-># Agent # 51 * +-----+ # +------+ # image # +------+ # |+-----+| # # 52 * |FILES|====|butype|============|mover |=====|DRIVE|| # # 53 * +-----+ # +------+ # stream # +------+ # |+-----+| # # 54 * ############ ############ +-------+ ######### 55 * 56 * 57 ******************************************************************** 58 * 59 * NDMAGENTS components overview 60 * 61 * 62 * "job" -> ndma_client_session() ndma_server_session() 63 * | | 64 * /-------------/ Q 65 * | v 66 * | +------------------------------------+ +-----------+ 67 * | /->| SESSION QUANTUM |----->| disp conn | 68 * | | +------------------------------------+ \ +-----------+ 69 * | Q Q Q Q Q Q | v | 70 * | | | | | | | | +----------+ | 71 * | /-----|----+--|----+----|----+--|----+---|----| dispatch | | 72 * | | | | | | | | | | | | | | request | | 73 * | v | v v v v v v v v v | +----------+ | 74 * | +-------+ +----+ +------+ +----+ +-----+ | ^ | 75 * +>|CONTROL| |DATA| |IMAGE | |TAPE| |ROBOT| | | | 76 * | | | |->|STREAM|<-| | | | | | | 77 * | | | *====* *====* | | | | | ndmconn_recv() 78 * | ndmca | ndmda| |ndmis | ndmta| |ndmra| | | | 79 * +-------+ +----+ +------+ +----+ +-----+ | |resi | 80 * | | | | | | | +------+ | 81 * \-----|-+----|----+-------+-------------->| call | | 82 * | | | +------+ | 83 * formatter| |image_stream | |remo | 84 * v v | v v 85 * +---------+<---ndmchan_poll()----/ +---------+ 86 * | ndmchan |<---------------------------| ndmconn | 87 * +---------+ +---------+ 88 * non-blocking I/O XDR wrapper 89 * 90 * -----> caller/callee 91 * --Q--> quantum (CPU scheduling) 92 * ====== image stream shared data structures 93 * 94 ******************************************************************** 95 */ 96 97 #ifndef BAREOS_NDMP_NDMAGENTS_H_ 98 #define BAREOS_NDMP_NDMAGENTS_H_ 1 99 100 #include "ndmp/ndmlib.h" 101 102 #ifdef __cplusplus 103 extern "C" { 104 #endif 105 106 /* 107 * VERSION AND RELEASE CONSTANTS -- KEEPER ONLY 108 **************************************************************** 109 * 110 * Revision constants for the source code. These may only be 111 * changed by the keeper of these sources. Contact ndmp-tech@ndmp.org 112 * for a pointer to the latest sources and the current keeper. 113 * 114 * The Version increases every time there is a significant 115 * design change. Significant means new functionality, 116 * reorganization of key data structures, etc. The Release 117 * increases every time the keeper releases an update to 118 * the current version, such as bug fixes or integration 119 * of new contributions. 120 * 121 * There are provisions for a free-form string for revisions 122 * of the O/S specific portions (NDMOS_CONST_NDMOS_REVISION) 123 * and for local revisions (NDMOS_CONST_NDMJOBLIB_REVISION) 124 * which reflect in-house change levels. 125 */ 126 #define NDMJOBLIB_VERSION 1 127 #define NDMJOBLIB_RELEASE 2 128 129 130 131 132 struct ndm_session; /* forward decl */ 133 134 135 136 137 /* 138 * NDM_ENV_TABLE and NDM_NLIST_TABLE 139 **************************************************************** 140 * Used by DATA and CONTROL agents 141 */ 142 #ifndef NDM_MAX_ENV 143 #define NDM_MAX_ENV 1024 144 #endif 145 146 struct ndm_env_entry { 147 ndmp9_pval pval; 148 struct ndm_env_entry * next; 149 }; 150 151 struct ndm_env_table { 152 int32_t n_env; 153 ndmp9_pval * enumerate; 154 int32_t enumerate_length; 155 struct ndm_env_entry * head; 156 struct ndm_env_entry * tail; 157 }; 158 159 /* ndma_listmgt.c */ 160 extern ndmp9_pval * ndma_enumerate_env_list (struct ndm_env_table *envtab); 161 extern struct ndm_env_entry * ndma_store_env_list (struct ndm_env_table *envtab, ndmp9_pval *pv); 162 extern struct ndm_env_entry * ndma_update_env_list (struct ndm_env_table *envtab, ndmp9_pval *pv); 163 extern void ndma_destroy_env_list (struct ndm_env_table *envtab); 164 165 #ifndef NDM_MAX_NLIST 166 #define NDM_MAX_NLIST 10240 167 #endif 168 169 struct ndm_nlist_entry { 170 ndmp9_name name; 171 ndmp9_error result_err; 172 unsigned result_count; 173 struct ndm_nlist_entry * next; 174 }; 175 176 177 struct ndm_nlist_table { 178 int32_t n_nlist; 179 ndmp9_name * enumerate; 180 int32_t enumerate_length; 181 struct ndm_nlist_entry * head; 182 struct ndm_nlist_entry * tail; 183 }; 184 185 186 /* ndma_listmgt.c */ 187 extern ndmp9_name * ndma_enumerate_nlist (struct ndm_nlist_table *nlist); 188 extern struct ndm_nlist_entry * ndma_store_nlist (struct ndm_nlist_table *nlist, ndmp9_name *nl); 189 extern void ndma_destroy_nlist (struct ndm_nlist_table *nlist); 190 191 #ifndef NDMOS_OPTION_NO_CONTROL_AGENT 192 /* 193 * CONTROL AGENT 194 **************************************************************** 195 */ 196 197 #include "ndmp/smc.h" /* SCSI Media Changer */ 198 199 200 #ifndef NDM_MAX_MEDIA 201 #define NDM_MAX_MEDIA 40 202 #endif 203 204 struct ndm_media_table { 205 int32_t n_media; 206 struct ndmmedia *head; 207 struct ndmmedia *tail; 208 }; 209 210 /* ndma_listmgt.c */ 211 extern struct ndmmedia * ndma_store_media (struct ndm_media_table *mtab, uint16_t element_address); 212 extern struct ndmmedia * ndma_clone_media_entry (struct ndm_media_table *mtab, struct ndmmedia *to_clone); 213 extern void ndmca_destroy_media_table (struct ndm_media_table *mtab); 214 215 #define NDM_JOB_OP_BACKUP (0x100 | 'c') 216 #define NDM_JOB_OP_EXTRACT (0x100 | 'x') 217 #define NDM_JOB_OP_TOC (0x100 | 't') 218 #define NDM_JOB_OP_QUERY_AGENTS (0x100 | 'q') 219 #define NDM_JOB_OP_INIT_LABELS (0x100 | 'I') 220 #define NDM_JOB_OP_LIST_LABELS (0x100 | 'L') 221 #define NDM_JOB_OP_REMEDY_ROBOT (0x100 | 'Z') 222 223 /* test operations */ 224 #define NDM_JOB_OP_TEST_TAPE (0x200 | 'T') 225 #define NDM_JOB_OP_TEST_MOVER (0x200 | 'M') 226 #define NDM_JOB_OP_TEST_DATA (0x200 | 'D') 227 228 /* tape handling operations */ 229 #define NDM_JOB_OP_REWIND_TAPE (0x300 | 'r') 230 #define NDM_JOB_OP_EJECT_TAPE (0x300 | 'j') 231 #define NDM_JOB_OP_MOVE_TAPE (0x300 | 'm') 232 #define NDM_JOB_OP_LOAD_TAPE (0x300 | 'l') 233 #define NDM_JOB_OP_UNLOAD_TAPE (0x300 | 'u') 234 #define NDM_JOB_OP_IMPORT_TAPE (0x300 | 'i') 235 #define NDM_JOB_OP_EXPORT_TAPE (0x300 | 'e') 236 #define NDM_JOB_OP_INIT_ELEM_STATUS (0x300 | 'I') 237 238 /* daemon operations */ 239 #define NDM_JOB_OP_DAEMON 'd' 240 241 struct ndm_job_param { 242 int32_t operation; /* NDM_JOB_OP_... */ 243 int32_t time_limit; /* command timeout, 0 is off */ 244 245 struct ndmagent data_agent; /* DATA AGENT host/pw */ 246 char * bu_type; /* e.g. "tar" */ 247 int32_t bu_level; /* e.g. 0..9 for dump */ 248 struct ndm_env_table env_tab; /* for BACKUP+RECOVER ops */ 249 struct ndm_nlist_table nlist_tab; /* for RECOVER ops */ 250 struct ndm_env_table result_env_tab; /* after BACKUP */ 251 struct ndmlog index_log; /* to log NDMP_FH_ADD_... */ 252 253 struct ndmagent tape_agent; /* TAPE AGENT host/pw */ 254 char * tape_device; /* eg "/dev/rmt0" */ 255 unsigned tape_timeout; /* secs total to retry open */ 256 unsigned record_size; /* in bytes, 10k typical */ 257 uint64_t last_w_offset; /* last window offset sent */ 258 struct ndmscsi_target * tape_target; /* unused for now */ 259 char * tape_tcp; /* tcp direct */ 260 NDM_FLAG_DECL(use_eject) /* eject upon close (unload) */ 261 262 struct ndmagent robot_agent; /* ROBOT AGENT host/pw */ 263 struct ndmscsi_target * robot_target; /* SCSI coord of robot */ 264 unsigned robot_timeout; /* secs total to retry move */ 265 NDM_FLAG_DECL(have_robot) /* yes, we have robot, today */ 266 NDM_FLAG_DECL(auto_remedy) /* if drive loaded, unload */ 267 NDM_FLAG_DECL(remedy_all) /* OP_REMEDY, all drives */ 268 NDM_FLAG_DECL(drive_addr_given) 269 NDM_FLAG_DECL(from_addr_given) 270 NDM_FLAG_DECL(to_addr_given) 271 unsigned drive_addr; /* 0->first, !0->elem addr */ 272 unsigned from_addr; /* for MOVE and EXPORT */ 273 unsigned to_addr; /* for MOVE and IMPORT */ 274 /* use move for many I/E */ 275 276 struct ndm_media_table media_tab; /* media to use, params */ 277 struct ndm_media_table result_media_tab; /* results after job */ 278 279 uint32_t n_file_entry; 280 uint32_t n_dir_entry; 281 uint32_t n_node_entry; 282 uint64_t root_node; 283 284 uint64_t bytes_written; 285 uint64_t bytes_read; 286 }; 287 288 /* ndma_job.c */ 289 extern int ndma_job_audit (struct ndm_job_param *job, 290 char *errbuf, int errskip); 291 extern int ndma_job_media_audit (struct ndm_job_param *job, 292 char *errbuf, int errskip); 293 extern void ndma_job_auto_adjust (struct ndm_job_param *job); 294 295 296 struct ndm_control_agent { 297 /* The JOB, see immediately above */ 298 struct ndm_job_param job; 299 NDM_FLAG_DECL(swap_connect) 300 NDM_FLAG_DECL(has_tcp_addr) 301 NDM_FLAG_DECL(has_local_addr) 302 303 /* DATA agent */ 304 ndmp9_data_operation data_op; 305 ndmp9_data_get_state_reply data_state; 306 NDM_FLAG_DECL(pending_notify_data_read) 307 NDM_FLAG_DECL(pending_notify_data_halted) 308 ndmp9_notify_data_read_request last_notify_data_read; 309 ndmp9_addr data_addr; 310 int32_t recover_log_file_count; 311 int32_t recover_log_file_ok; 312 int32_t recover_log_file_error; 313 314 /* Image stream */ 315 ndmp9_addr mover_addr; 316 ndmp9_mover_mode mover_mode; 317 318 /* TAPE Agent */ 319 ndmp9_mover_get_state_reply mover_state; 320 NDM_FLAG_DECL(pending_notify_mover_paused) 321 NDM_FLAG_DECL(pending_notify_mover_halted) 322 ndmp9_notify_mover_paused_request last_notify_mover_paused; 323 324 ndmp9_tape_open_mode tape_mode; 325 ndmp9_tape_get_state_reply tape_state; 326 327 /* Media management, media_table inside of job */ 328 int32_t cur_media_ix; /* references struct ndmmedia index field */ 329 NDM_FLAG_DECL(media_is_loaded) 330 NDM_FLAG_DECL(is_label_op) 331 332 /* ROBOT Agent */ 333 struct smc_ctrl_block * smc_cb; 334 unsigned drive_addr; 335 336 #ifndef NDMOS_OPTION_NO_TEST_AGENTS 337 /* when testing */ 338 char * active_test; /* name of test or 0 if no test */ 339 char * active_test_failed; /* active test failed */ 340 char * active_test_warned; /* active test warned */ 341 342 char * test_phase; /* name of sub-series test phase */ 343 int32_t test_step; /* test sequence number */ 344 345 int32_t n_step_pass; /* per phase test stats */ 346 int32_t n_step_fail; 347 int32_t n_step_warn; 348 int32_t n_step_tests; 349 350 int32_t total_n_step_pass; /* total test stats */ 351 int32_t total_n_step_fail; 352 int32_t total_n_step_warn; 353 int32_t total_n_step_tests; 354 #endif 355 356 #ifdef NDMOS_MACRO_CONTROL_AGENT_ADDITIONS 357 NDMOS_MACRO_CONTROL_AGENT_ADDITIONS 358 #endif /* NDMOS_MACRO_CONTROL_AGENT_ADDITIONS */ 359 }; 360 361 362 /* ndma_control.c */ 363 extern int ndmca_initialize (struct ndm_session *sess); 364 extern int ndmca_commission (struct ndm_session *sess); 365 extern int ndmca_decommission (struct ndm_session *sess); 366 extern int ndmca_destroy (struct ndm_session *sess); 367 extern int ndmca_control_agent (struct ndm_session *sess); 368 369 /* ndma_cops_backreco.c */ 370 extern int ndmca_op_create_backup (struct ndm_session *sess); 371 extern int ndmca_op_recover_files (struct ndm_session *sess); 372 extern int ndmca_op_recover_fh (struct ndm_session *sess); 373 extern int ndmca_monitor_backup (struct ndm_session *sess); 374 extern int ndmca_monitor_get_post_backup_env (struct ndm_session *sess); 375 extern int ndmca_monitor_recover (struct ndm_session *sess); 376 extern int ndmca_backreco_startup (struct ndm_session *sess); 377 extern int ndmca_monitor_startup (struct ndm_session *sess); 378 extern int ndmca_monitor_shutdown (struct ndm_session *sess); 379 extern int ndmca_monitor_get_states (struct ndm_session *sess); 380 extern int ndmca_monitor_load_next (struct ndm_session *sess); 381 extern int ndmca_monitor_seek_tape (struct ndm_session *sess); 382 extern int ndmca_monitor_unload_last_tape (struct ndm_session *sess); 383 extern int ndmca_mon_wait_for_something (struct ndm_session *sess, 384 int32_t max_delay_secs); 385 386 struct ndmca_jobcontrol_callbacks { 387 int (*is_job_canceled)(struct ndm_session *sess); 388 }; 389 390 extern void ndmca_jobcontrol_register_callbacks ( 391 struct ndm_session *sess, 392 struct ndmca_jobcontrol_callbacks *callbacks); 393 394 extern void ndmca_jobcontrol_unregister_callbacks ( 395 struct ndm_session *sess); 396 397 /* ndma_cops_labels.c */ 398 extern int ndmca_op_init_labels (struct ndm_session *sess); 399 extern int ndmca_op_list_labels (struct ndm_session *sess); 400 401 402 /* ndma_cops_query.c */ 403 404 struct ndmca_query_callbacks { 405 int (*get_tape_info)(struct ndm_session *sess, 406 ndmp9_device_info *info, 407 unsigned n_info); 408 /* 409 int (*get_host_info)(struct ndm_session *sess); 410 int (*get_fs_info)(struct ndm_session *sess); 411 int (*get_scsi_info)(struct ndm_session *sess); 412 */ 413 }; 414 415 extern void ndmca_query_register_callbacks ( 416 struct ndm_session *sess, 417 struct ndmca_query_callbacks *callbacks); 418 419 extern void ndmca_query_unregister_callbacks ( 420 struct ndm_session *sess); 421 422 423 extern int ndmca_op_query (struct ndm_session *sess); 424 extern int ndmca_opq_data (struct ndm_session *sess); 425 extern int ndmca_opq_tape (struct ndm_session *sess); 426 extern int ndmca_opq_robot (struct ndm_session *sess); 427 extern int ndmca_opq_host_info (struct ndm_session *sess, 428 struct ndmconn *conn); 429 extern int ndmca_opq_get_mover_type (struct ndm_session *sess, 430 struct ndmconn *conn); 431 extern int ndmca_opq_get_butype_attr (struct ndm_session *sess, 432 struct ndmconn *conn); 433 extern int ndmca_opq_get_fs_info (struct ndm_session *sess, 434 struct ndmconn *conn); 435 extern int ndmca_opq_get_tape_info (struct ndm_session *sess, 436 struct ndmconn *conn); 437 extern int ndmca_opq_get_scsi_info (struct ndm_session *sess, 438 struct ndmconn *conn); 439 extern void ndmalogqr (struct ndm_session *sess, char *fmt, ...); 440 441 442 /* ndma_cops_robot.c */ 443 extern int ndmca_op_robot_remedy (struct ndm_session *sess); 444 extern int ndmca_op_robot_startup (struct ndm_session *sess, 445 int32_t verify_media_flag); 446 extern int ndmca_op_init_elem_status (struct ndm_session *sess); 447 extern int ndmca_op_rewind_tape (struct ndm_session *sess); 448 extern int ndmca_op_eject_tape (struct ndm_session *sess); 449 extern int ndmca_op_mtio (struct ndm_session *sess, 450 ndmp9_tape_mtio_op mtio_op); 451 452 extern int ndmca_op_move_tape (struct ndm_session *sess); 453 extern int ndmca_op_import_tape (struct ndm_session *sess); 454 extern int ndmca_op_export_tape (struct ndm_session *sess); 455 extern int ndmca_op_load_tape (struct ndm_session *sess); 456 extern int ndmca_op_unload_tape (struct ndm_session *sess); 457 458 459 /* ndma_ctrl_calls.c */ 460 extern int ndmca_connect_close (struct ndm_session *sess); 461 extern int ndmca_data_get_state (struct ndm_session *sess); 462 extern int ndmca_data_connect (struct ndm_session *sess); 463 extern int ndmca_data_listen (struct ndm_session *sess); 464 extern int ndmca_data_start_backup (struct ndm_session *sess); 465 extern int ndmca_data_start_recover (struct ndm_session *sess); 466 extern int ndmca_data_start_recover_filehist (struct ndm_session *sess); 467 extern int ndmca_data_abort (struct ndm_session *sess); 468 extern int ndmca_data_get_env (struct ndm_session *sess); 469 extern int ndmca_data_stop (struct ndm_session *sess); 470 extern int ndmca_tape_open (struct ndm_session *sess); 471 extern int ndmca_tape_close (struct ndm_session *sess); 472 extern int ndmca_tape_get_state (struct ndm_session *sess); 473 extern int ndmca_tape_get_state_no_tattle (struct ndm_session *sess); 474 extern int ndmca_tape_mtio (struct ndm_session *sess, 475 ndmp9_tape_mtio_op op, uint32_t count, uint32_t *resid); 476 extern int ndmca_tape_write (struct ndm_session *sess, 477 char *buf, unsigned count); 478 extern int ndmca_tape_read (struct ndm_session *sess, 479 char *buf, unsigned count); 480 extern int ndmca_mover_get_state (struct ndm_session *sess); 481 extern int ndmca_mover_listen (struct ndm_session *sess); 482 extern int ndmca_mover_connect (struct ndm_session *sess); 483 extern int ndmca_mover_continue (struct ndm_session *sess); 484 extern int ndmca_mover_abort (struct ndm_session *sess); 485 extern int ndmca_mover_stop (struct ndm_session *sess); 486 extern int ndmca_mover_set_window (struct ndm_session *sess, 487 uint64_t offset, uint64_t length); 488 extern int ndmca_mover_read (struct ndm_session *sess, 489 uint64_t offset, uint64_t length); 490 extern int ndmca_mover_close (struct ndm_session *sess); 491 extern int ndmca_mover_set_record_size (struct ndm_session *sess); 492 493 494 /* ndma_ctrl_media.c */ 495 496 struct ndmca_media_callbacks { 497 int (*load_first)(struct ndm_session *sess); 498 int (*load_next)(struct ndm_session *sess); 499 int (*unload_current)(struct ndm_session *sess); 500 }; 501 502 extern void ndmca_media_register_callbacks (struct ndm_session *sess, 503 struct ndmca_media_callbacks *callbacks); 504 extern void ndmca_media_unregister_callbacks (struct ndm_session *sess); 505 extern int ndmca_media_load_first (struct ndm_session *sess); 506 extern int ndmca_media_load_next (struct ndm_session *sess); 507 extern int ndmca_media_unload_last (struct ndm_session *sess); 508 extern int ndmca_media_change (struct ndm_session *sess); 509 extern int ndmca_media_load_seek (struct ndm_session *sess, 510 uint64_t pos); 511 extern int ndmca_media_load_current (struct ndm_session *sess); 512 extern int ndmca_media_unload_current (struct ndm_session *sess); 513 extern int ndmca_media_unload_best_effort (struct ndm_session *sess); 514 extern int ndmca_media_open_tape (struct ndm_session *sess); 515 extern int ndmca_media_close_tape (struct ndm_session *sess); 516 extern int ndmca_media_mtio_tape (struct ndm_session *sess, 517 ndmp9_tape_mtio_op op, uint32_t count, uint32_t *resid); 518 extern int ndmca_media_write_filemarks (struct ndm_session *sess); 519 extern int ndmca_media_read_label (struct ndm_session *sess, 520 char labbuf[]); 521 extern int ndmca_media_write_label (struct ndm_session *sess, 522 int32_t type, char labbuf[]); 523 extern int ndmca_media_check_label (struct ndm_session *sess, 524 int32_t type, char labbuf[]); 525 extern int ndmca_media_verify (struct ndm_session *sess); 526 extern int ndmca_media_tattle (struct ndm_session *sess); 527 extern uint64_t 528 ndmca_media_capture_tape_offset (struct ndm_session *sess); 529 extern int ndmca_media_capture_mover_window (struct ndm_session *sess); 530 extern int ndmca_media_calculate_windows (struct ndm_session *sess); 531 extern int ndmca_media_calculate_offsets (struct ndm_session *sess); 532 extern int ndmca_media_set_window_current (struct ndm_session *sess); 533 534 535 /* ndma_ctrl_robot.c */ 536 extern int ndmca_robot_issue_scsi_req (struct smc_ctrl_block *smc); 537 extern int ndmca_robot_prep_target (struct ndm_session *sess); 538 extern int ndmca_robot_obtain_info (struct ndm_session *sess); 539 extern int ndmca_robot_init_elem_status (struct ndm_session *sess); 540 extern int ndmca_robot_startup (struct ndm_session *sess); 541 extern int ndmca_robot_move (struct ndm_session *sess, 542 int32_t src_addr, int32_t dst_addr); 543 extern int ndmca_robot_load (struct ndm_session *sess, int32_t slot_addr); 544 extern int ndmca_robot_unload (struct ndm_session *sess, int32_t slot_addr); 545 extern struct smc_element_descriptor * 546 ndmca_robot_find_element (struct ndm_session *sess, 547 int32_t element_address); 548 extern int ndmca_robot_check_ready (struct ndm_session *sess); 549 extern int ndmca_robot_remedy_ready (struct ndm_session *sess); 550 extern int ndmca_robot_query (struct ndm_session *sess); 551 extern int ndmca_robot_verify_media (struct ndm_session *sess); 552 extern int ndmca_robot_synthesize_media (struct ndm_session *sess); 553 554 555 /* ndma_ctrl_conn.c */ 556 extern int ndmca_connect_xxx_agent (struct ndm_session *sess, 557 struct ndmconn **connp, char *prefix, 558 struct ndmagent *agent); 559 extern int ndmca_connect_data_agent (struct ndm_session *sess); 560 extern int ndmca_connect_tape_agent (struct ndm_session *sess); 561 extern int ndmca_connect_robot_agent (struct ndm_session *sess); 562 extern int ndmca_connect_control_agent (struct ndm_session *sess); 563 564 565 566 /* ndma_ctst_tape.c */ 567 extern int ndmca_op_test_tape (struct ndm_session *sess); 568 569 /* ndma_ctst_mover.c */ 570 extern int ndmca_op_test_mover (struct ndm_session *sess); 571 572 /* ndma_ctst_data.c */ 573 extern int ndmca_op_test_data (struct ndm_session *sess); 574 575 /* ndma_ctst_subr.c */ 576 extern int ndmca_test_query_conn_types (struct ndm_session *sess, 577 struct ndmconn *ref_conn); 578 extern int ndmca_test_load_tape (struct ndm_session *sess); 579 extern int ndmca_test_unload_tape (struct ndm_session *sess); 580 extern int ndmca_test_call (struct ndmconn *conn, 581 struct ndmp_xa_buf *xa, ndmp9_error expect_err); 582 extern int ndmca_test_check_expect_errs (struct ndmconn *conn, 583 int32_t rc, ndmp9_error expect_errs[]); 584 extern int ndmca_test_check_expect (struct ndmconn *conn, 585 int32_t rc, ndmp9_error expect_err); 586 extern int ndmca_test_check_expect_no_err (struct ndmconn *conn, 587 int32_t rc); 588 extern int ndmca_test_check_expect_illegal_state (struct ndmconn *conn, 589 int32_t rc); 590 extern int ndmca_test_check_expect_illegal_args (struct ndmconn *conn, 591 int32_t rc); 592 extern void ndmca_test_phase (struct ndm_session *sess, 593 char *test_phase, char *desc); 594 extern void ndmca_test_log_step (struct ndm_session *sess, 595 int32_t level, char *msg); 596 extern void ndmca_test_log_note (struct ndm_session *sess, 597 int32_t level, char *msg); 598 extern void ndmca_test_done_phase (struct ndm_session *sess); 599 extern void ndmca_test_done_series (struct ndm_session *sess, 600 char *series_name); 601 extern void ndmca_test_open (struct ndm_session *sess, 602 char *test_name, 603 char *sub_test_name); 604 extern void ndmca_test_warn (struct ndm_session *sess, char *warn_msg); 605 extern void ndmca_test_fail (struct ndm_session *sess, char *fail_msg); 606 extern void ndmca_test_close (struct ndm_session *sess); 607 608 609 extern void ndmca_test_fill_data (char *buf, int32_t bufsize, 610 int32_t recno, int32_t fileno); 611 612 #endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */ 613 614 615 616 617 #ifndef NDMOS_OPTION_NO_DATA_AGENT 618 /* 619 * DATA AGENT 620 **************************************************************** 621 * 622 * NDMP Elements of Data Agent (backup) 623 * 624 * +-----------+stderr 625 * | bu_type |--------formatter_err---------NDMP_LOG-------> to CONTROL 626 * | formatter | 627 * | process |========formatter_data=+=====================> to image stream 628 * +-----------+stdout | 629 * +-------+ 630 * | snoop |--NDMP_FH_ADD_x--> to CONTROL 631 * +-------+ 632 * 633 **************************************************************** 634 * 635 * NDMP Elements of Data Agent (recover) 636 * 637 * +-----------+stderr 638 * | bu_type |--------formatter_err---------NDMP_LOG-------> to CONTROL 639 * | formatter | +--------+ 640 * | process |<=======fmt_data=| direct |==================< from image str 641 * +-----------+stdin | |-NOTIFY_DATA_READ-> to CONTROL 642 * | snoop | 643 * +--------+ 644 * 645 **************************************************************** 646 * 647 * NDMP Elements of Data Agent (recover filehist) 648 * 649 * +--------+ 650 * | direct |==================< from image str 651 * | |-NOTIFY_DATA_READ-> to CONTROL 652 * | snoop |--NDMP_FH_ADD_x---> to CONTROL 653 * +--------+ 654 * 655 **************************************************************** 656 */ 657 658 659 660 #ifndef NDMDA_N_FMT_IMAGE_BUF 661 #define NDMDA_N_FMT_IMAGE_BUF (8*1024) 662 #endif 663 #ifndef NDMDA_N_FHH_BUF 664 #define NDMDA_N_FHH_BUF (8*1024) 665 #endif 666 #ifndef NDMDA_N_FMT_ERROR_BUF 667 #define NDMDA_N_FMT_ERROR_BUF (8*1024) 668 #endif 669 #ifndef NDMDA_N_FMT_WRAP_BUF 670 #define NDMDA_N_FMT_WRAP_BUF (4*1024) 671 #endif 672 #ifndef NDMDA_MAX_CMD 673 #define NDMDA_MAX_CMD (4*1024) 674 #endif 675 676 677 678 #ifndef NDMOS_OPTION_NO_GTAR_BUTYPE 679 extern int ndmda_butype_gtar_config_get_attrs (struct ndm_session *sess, 680 uint32_t *attrs_p, int32_t protocol_version); 681 682 extern int ndmda_butype_gtar_config_get_default_env ( 683 struct ndm_session *sess, 684 ndmp9_pval **env_p, int32_t *n_env_p, 685 int32_t protocol_version); 686 extern int ndmda_butype_gtar_attach (struct ndm_session *sess); 687 #endif 688 #ifndef NDMOS_OPTION_NO_DUMP_BUTYPE 689 extern int ndmda_butype_dump_config_get_attrs (struct ndm_session *sess, 690 uint32_t *attrs_p, int32_t protocol_version); 691 692 extern int ndmda_butype_dump_config_get_default_env ( 693 struct ndm_session *sess, 694 ndmp9_pval **env_p, int32_t *n_env_p, 695 int32_t protocol_version); 696 extern int ndmda_butype_dump_attach (struct ndm_session *sess); 697 #endif 698 699 700 701 702 struct ndm_data_recovery_interval { 703 ndmp9_u_quad offset; 704 ndmp9_u_quad length; 705 }; 706 707 enum ndm_data_recovery_access_method { 708 NDMDA_RECO_ACCESS_SEQUENTIAL = 1, 709 NDMDA_RECO_ACCESS_DIRECT, 710 NDMDA_RECO_ACCESS_SEMI_DIRECT, 711 NDMDA_RECO_ACCESS_SEMI_DIRECT_PENDING 712 }; 713 714 enum ndm_data_recovery_state { 715 NDMDA_RECO_STATE_START = 1, 716 NDMDA_RECO_STATE_PASS_THRU, 717 NDMDA_RECO_STATE_CHOOSE_NLENT, 718 NDMDA_RECO_STATE_ACQUIRE, 719 NDMDA_RECO_STATE_DISPOSE, 720 NDMDA_RECO_STATE_FINISH_NLENT, 721 NDMDA_RECO_STATE_ALL_DONE 722 }; 723 724 enum ndm_data_recovery_acquire_mode { 725 NDMDA_RECO_ACQUIRE_EVERYTHING = 1, 726 NDMDA_RECO_ACQUIRE_SEARCHING, 727 NDMDA_RECO_ACQUIRE_MATCHING 728 }; 729 730 enum ndm_data_recovery_disposition { 731 NDMDA_RECO_DISPOSITION_PASS = 1, 732 NDMDA_RECO_DISPOSITION_DISCARD 733 }; 734 735 736 struct ndm_data_agent { 737 int32_t protocol_version; 738 739 char bu_type[32]; 740 struct ndm_env_table env_tab; 741 struct ndm_nlist_table nlist_tab; 742 743 NDM_FLAG_DECL(enable_hist) 744 uint64_t pass_resid; 745 746 ndmp9_data_get_state_reply data_state; 747 int32_t data_notify_pending; 748 749 struct ndmchan formatter_image; /* stdin/out */ 750 struct ndmchan formatter_error; /* stderr */ 751 struct ndmchan formatter_wrap; /* fd=3 */ 752 int32_t formatter_pid; 753 754 char * fmt_image_buf; 755 char * fmt_error_buf; 756 char * fmt_wrap_buf; 757 758 struct ndmfhheap fhh; 759 uint32_t * fhh_buf; 760 761 #ifdef NDMOS_MACRO_DATA_AGENT_ADDITIONS 762 NDMOS_MACRO_DATA_AGENT_ADDITIONS 763 #endif /* NDMOS_MACRO_DATA_AGENT_ADDITIONS */ 764 }; 765 766 767 768 /* ndma_data.c */ 769 extern int ndmda_initialize (struct ndm_session *sess); 770 extern int ndmda_commission (struct ndm_session *sess); 771 extern int ndmda_decommission (struct ndm_session *sess); 772 extern int ndmda_destroy (struct ndm_session *sess); 773 extern int ndmda_belay (struct ndm_session *sess); 774 775 extern ndmp9_error ndmda_data_start_backup (struct ndm_session *sess); 776 extern ndmp9_error ndmda_data_start_recover (struct ndm_session *sess); 777 extern ndmp9_error ndmda_data_start_recover_fh (struct ndm_session *sess); 778 779 extern void ndmda_sync_state (struct ndm_session *sess); 780 extern ndmp9_error ndmda_data_listen (struct ndm_session *sess); 781 extern ndmp9_error ndmda_data_connect (struct ndm_session *sess); 782 extern void ndmda_data_abort (struct ndm_session *sess); 783 extern void ndmda_sync_environment (struct ndm_session *sess); 784 extern void ndmda_data_halt (struct ndm_session *sess, 785 ndmp9_data_halt_reason reason); 786 extern void ndmda_data_stop (struct ndm_session *sess); 787 788 extern int ndmda_quantum (struct ndm_session *sess); 789 extern int ndmda_quantum_image (struct ndm_session *sess); 790 extern int ndmda_quantum_stderr (struct ndm_session *sess); 791 extern int ndmda_quantum_wrap (struct ndm_session *sess); 792 793 extern int ndmda_wrap_in (struct ndm_session *sess, 794 char *wrap_line); 795 796 extern void ndmda_send_logmsg (struct ndm_session *sess, 797 char *fmt, ...); 798 799 extern void ndmda_send_notice (struct ndm_session *sess); 800 extern void ndmda_send_data_read (struct ndm_session *sess, 801 uint64_t offset, uint64_t length); 802 803 extern int ndmda_copy_environment (struct ndm_session *sess, 804 ndmp9_pval *env, unsigned n_env); 805 extern struct ndmp9_pval *ndmda_find_env (struct ndm_session *sess, 806 char *name); 807 808 extern int ndmda_interpret_boolean_value (char *value_str, 809 int32_t default_value); 810 811 extern void ndmda_purge_environment (struct ndm_session *sess); 812 813 extern int ndmda_copy_nlist (struct ndm_session *sess, 814 ndmp9_name *nlist, unsigned n_nlist); 815 extern void ndmda_purge_nlist (struct ndm_session *sess); 816 extern int ndmda_count_invalid_fh_info (struct ndm_session *sess); 817 extern int ndmda_count_invalid_fh_info_pending 818 (struct ndm_session *sess); 819 820 /* in ndma_data_recover.c */ 821 extern int ndmda_quantum_recover_common (struct ndm_session *sess); 822 extern int ndmda_reco_state_start (struct ndm_session *sess); 823 extern int ndmda_reco_pass_thru (struct ndm_session *sess); 824 extern int ndmda_reco_state_pass_thru (struct ndm_session *sess); 825 extern int ndmda_reco_state_choose_nlent (struct ndm_session *sess); 826 extern int ndmda_reco_state_acquire (struct ndm_session *sess); 827 extern int ndmda_reco_state_dispose (struct ndm_session *sess); 828 extern int ndmda_reco_state_finish_nlent (struct ndm_session *sess); 829 extern int ndmda_reco_state_all_done (struct ndm_session *sess); 830 extern int ndmda_reco_assess_channels (struct ndm_session *sess); 831 extern int ndmda_reco_assess_intervals (struct ndm_session *sess); 832 extern int ndmda_reco_align_to_wanted (struct ndm_session *sess); 833 extern int ndmda_reco_obtain_wanted (struct ndm_session *sess); 834 extern int ndmda_reco_send_data_read (struct ndm_session *sess, 835 uint64_t offset, uint64_t length); 836 extern int ndmda_reco_internal_error (struct ndm_session *sess, 837 char *why); 838 839 /* ndma_data_fh.c */ 840 extern int ndmda_fh_initialize (struct ndm_session *sess); 841 extern int ndmda_fh_commission (struct ndm_session *sess); 842 extern int ndmda_fh_decommission (struct ndm_session *sess); 843 extern int ndmda_fh_destroy (struct ndm_session *sess); 844 extern int ndmda_fh_belay (struct ndm_session *sess); 845 extern void ndmda_fh_add_file (struct ndm_session *sess, 846 ndmp9_file_stat *filestat, char *name); 847 extern void ndmda_fh_add_dir (struct ndm_session *sess, 848 uint64_t dir_fileno, 849 char *name, 850 uint64_t fileno); 851 extern void ndmda_fh_add_node (struct ndm_session *sess, 852 ndmp9_file_stat *filestat); 853 854 extern int ndmda_fh_prepare (struct ndm_session *sess, 855 int vers, int msg, int entry_size, 856 unsigned n_item, 857 unsigned total_size_of_items); 858 extern void ndmda_fh_flush (struct ndm_session *sess); 859 860 /* ndma_data_pfe.c (pipe-fork-exec) */ 861 extern int ndmda_pipe_fork_exec (struct ndm_session *sess, 862 char *cmd, int is_backup); 863 extern int ndmda_add_to_cmd_with_escapes (char *cmd, 864 char *word, char *special); 865 extern int ndmda_add_to_cmd (char *cmd, char *word); 866 extern int ndmda_add_to_cmd_allow_file_wildcards (char *cmd, 867 char *word); 868 869 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */ 870 871 872 873 874 #ifndef NDMOS_OPTION_NO_TAPE_AGENT 875 /* 876 * TAPE AGENT 877 **************************************************************** 878 */ 879 880 struct ndm_tape_agent { 881 int protocol_version; 882 883 /* TAPE */ 884 ndmp9_tape_get_state_reply tape_state; 885 886 /* MOVER */ 887 ndmp9_mover_get_state_reply mover_state; 888 uint32_t mover_window_first_blockno; 889 uint64_t mover_window_end; 890 uint64_t mover_want_pos; 891 int mover_notify_pending; 892 893 int pending_change_after_drain; 894 ndmp9_mover_state pending_mover_state; 895 ndmp9_mover_halt_reason pending_mover_halt_reason; 896 ndmp9_mover_pause_reason pending_mover_pause_reason; 897 898 char *tape_buffer; 899 uint32_t tb_blockno; 900 901 #ifdef NDMOS_MACRO_TAPE_AGENT_ADDITIONS 902 NDMOS_MACRO_TAPE_AGENT_ADDITIONS 903 #endif /* NDMOS_MACRO_DATA_AGENT_ADDITIONS */ 904 }; 905 906 #define NDMTA_TAPE_IS_WRITABLE(TA) \ 907 ( (TA)->tape_state.open_mode == NDMP9_TAPE_RDWR_MODE \ 908 || (TA)->tape_state.open_mode == NDMP9_TAPE_RAW_MODE) 909 910 extern int ndmta_initialize (struct ndm_session *sess); 911 extern int ndmta_commission (struct ndm_session *sess); 912 extern int ndmta_decommission (struct ndm_session *sess); 913 extern int ndmta_destroy (struct ndm_session *sess); 914 extern int ndmta_init_mover_state (struct ndm_session *sess); 915 916 extern void ndmta_mover_sync_state (struct ndm_session *sess); 917 ndmp9_error ndmta_mover_listen (struct ndm_session *sess, 918 ndmp9_mover_mode mover_mode); 919 ndmp9_error ndmta_mover_connect (struct ndm_session *sess, 920 ndmp9_mover_mode mover_mode); 921 extern void ndmta_mover_halt (struct ndm_session *sess, 922 ndmp9_mover_halt_reason reason); 923 extern void ndmta_mover_pause (struct ndm_session *sess, 924 ndmp9_mover_pause_reason reason); 925 extern void ndmta_mover_active (struct ndm_session *sess); 926 extern void ndmta_mover_start_active (struct ndm_session *sess); 927 extern void ndmta_mover_stop (struct ndm_session *sess); 928 extern void ndmta_mover_abort (struct ndm_session *sess); 929 extern void ndmta_mover_continue (struct ndm_session *sess); 930 extern void ndmta_mover_close (struct ndm_session *sess); 931 extern void ndmta_mover_read (struct ndm_session *sess, 932 uint64_t offset, uint64_t length); 933 934 extern int ndmta_quantum (struct ndm_session *sess); 935 extern int ndmta_read_quantum (struct ndm_session *sess); 936 extern int ndmta_write_quantum (struct ndm_session *sess); 937 extern void ndmta_mover_send_notice (struct ndm_session *sess); 938 939 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */ 940 941 942 943 944 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT 945 /* 946 * ROBOT AGENT 947 **************************************************************** 948 */ 949 950 struct ndm_robot_agent { 951 int protocol_version; 952 953 ndmp9_scsi_get_state_reply scsi_state; 954 955 #ifdef NDMOS_MACRO_ROBOT_AGENT_ADDITIONS 956 NDMOS_MACRO_ROBOT_AGENT_ADDITIONS 957 #endif /* NDMOS_MACRO_ROBOT_AGENT_ADDITIONS */ 958 }; 959 960 extern int ndmra_initialize (struct ndm_session *sess); 961 extern int ndmra_commission (struct ndm_session *sess); 962 extern int ndmra_decommission (struct ndm_session *sess); 963 extern int ndmra_destroy (struct ndm_session *sess); 964 965 /* all semantic operations are done directly to the ndmos_scsi layer */ 966 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */ 967 968 969 970 971 /* 972 * IMAGE STREAM 973 **************************************************************** 974 */ 975 976 enum ndmis_connect_status { 977 NDMIS_CONN_IDLE = 0, 978 NDMIS_CONN_LISTEN, 979 NDMIS_CONN_ACCEPTED, 980 NDMIS_CONN_CONNECTED, 981 NDMIS_CONN_DISCONNECTED, 982 NDMIS_CONN_CLOSED, 983 NDMIS_CONN_BOTCHED, 984 NDMIS_CONN_REMOTE, 985 NDMIS_CONN_EXCLUDE 986 }; 987 typedef enum ndmis_connect_status ndmis_connect_status; 988 989 struct ndmis_end_point { 990 char * name; 991 ndmis_connect_status connect_status; 992 int transfer_mode; 993 ndmp9_addr_type addr_type; 994 }; 995 996 struct ndmis_remote { 997 ndmis_connect_status connect_status; 998 int transfer_mode; 999 ndmp9_addr local_addr; 1000 ndmp9_addr peer_addr; 1001 ndmp9_addr listen_addr; 1002 struct ndmchan listen_chan; 1003 struct ndmchan sanity_chan; 1004 }; 1005 1006 struct ndm_image_stream { 1007 struct ndmis_end_point data_ep; 1008 struct ndmis_end_point tape_ep; 1009 1010 struct ndmis_remote remote; 1011 1012 /* transfer stuff */ 1013 int transfer_mode; 1014 struct ndmchan chan; 1015 char * buf; 1016 int buflen; 1017 }; 1018 1019 extern int ndmis_initialize (struct ndm_session *sess); 1020 extern int ndmis_commission (struct ndm_session *sess); 1021 extern int ndmis_decommission (struct ndm_session *sess); 1022 extern int ndmis_destroy (struct ndm_session *sess); 1023 extern int ndmis_belay (struct ndm_session *sess); 1024 1025 extern int ndmis_quantum (struct ndm_session *sess); 1026 1027 extern ndmp9_error ndmis_data_listen (struct ndm_session *sess, 1028 ndmp9_addr_type addr_type, ndmp9_addr *ret_addr, 1029 char *reason); 1030 extern ndmp9_error ndmis_tape_listen (struct ndm_session *sess, 1031 ndmp9_addr_type addr_type, ndmp9_addr *ret_addr, 1032 char *reason); 1033 extern ndmp9_error ndmis_data_connect (struct ndm_session *sess, 1034 ndmp9_addr *addr, char *reason); 1035 extern ndmp9_error ndmis_tape_connect (struct ndm_session *sess, 1036 ndmp9_addr *addr, char *reason); 1037 extern int 1038 ndmis_data_start (struct ndm_session *sess, int chan_mode); 1039 extern int 1040 ndmis_tape_start (struct ndm_session *sess, int chan_mode); 1041 extern int 1042 ndmis_data_close (struct ndm_session *sess); 1043 extern int 1044 ndmis_tape_close (struct ndm_session *sess); 1045 1046 1047 extern ndmp9_error ndmis_audit_data_listen (struct ndm_session *sess, 1048 ndmp9_addr_type addr_type, char *reason); 1049 extern ndmp9_error ndmis_audit_tape_listen (struct ndm_session *sess, 1050 ndmp9_addr_type addr_type, char *reason); 1051 extern ndmp9_error ndmis_audit_data_connect (struct ndm_session *sess, 1052 ndmp9_addr_type addr_type, char *reason); 1053 extern ndmp9_error ndmis_audit_tape_connect (struct ndm_session *sess, 1054 ndmp9_addr_type addr_type, char *reason); 1055 1056 extern ndmp9_error ndmis_audit_ep_listen ( 1057 struct ndm_session *sess, 1058 ndmp9_addr_type addr_type, 1059 char *reason, 1060 struct ndmis_end_point *mine_ep, 1061 struct ndmis_end_point *peer_ep); 1062 1063 extern ndmp9_error ndmis_audit_ep_connect ( 1064 struct ndm_session *sess, 1065 ndmp9_addr_type addr_type, 1066 char *reason, 1067 struct ndmis_end_point *mine_ep, 1068 struct ndmis_end_point *peer_ep); 1069 1070 extern ndmp9_error ndmis_ep_listen ( 1071 struct ndm_session *sess, 1072 ndmp9_addr_type addr_type, 1073 ndmp9_addr *ret_addr, 1074 char *reason, 1075 struct ndmis_end_point *mine_ep, 1076 struct ndmis_end_point *peer_ep); 1077 1078 extern ndmp9_error ndmis_ep_connect ( 1079 struct ndm_session *sess, 1080 ndmp9_addr *addr, 1081 char *reason, 1082 struct ndmis_end_point *mine_ep, 1083 struct ndmis_end_point *peer_ep); 1084 1085 extern int ndmis_ep_close ( 1086 struct ndm_session *sess, 1087 struct ndmis_end_point *mine_ep, 1088 struct ndmis_end_point *peer_ep); 1089 1090 extern int ndmis_tcp_listen (struct ndm_session *sess, 1091 struct ndmp9_addr *listen_addr); 1092 extern int ndmis_tcp_accept (struct ndm_session *sess); 1093 extern int ndmis_tcp_connect (struct ndm_session *sess, 1094 struct ndmp9_addr *connect_addr); 1095 extern int ndmis_tcp_close (struct ndm_session *sess); 1096 1097 extern int ndmis_tcp_get_local_and_peer_addrs ( 1098 struct ndm_session *sess); 1099 extern int ndmis_tcp_green_light (struct ndm_session *sess, 1100 int sock, ndmis_connect_status new_status); 1101 1102 1103 1104 /* 1105 * PLUMBING 1106 **************************************************************** 1107 */ 1108 1109 struct ndm_plumbing { 1110 struct ndmconn * control; 1111 struct ndmconn * data; 1112 struct ndmconn * tape; 1113 struct ndmconn * robot; 1114 1115 struct ndm_image_stream * image_stream; 1116 }; 1117 1118 1119 1120 1121 /* 1122 * SESSION 1123 **************************************************************** 1124 */ 1125 1126 struct ndm_session_param { 1127 struct ndmlog log; 1128 char * log_tag; 1129 int log_level; 1130 char * config_file_name; 1131 }; 1132 1133 struct ndm_session { 1134 #ifndef NDMOS_OPTION_NO_CONTROL_AGENT 1135 struct ndm_control_agent *control_acb; 1136 struct ndmca_media_callbacks *media_cbs; 1137 struct ndmca_query_callbacks *query_cbs; 1138 struct ndmca_jobcontrol_callbacks *jobcontrol_cbs; 1139 #endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */ 1140 #ifndef NDMOS_OPTION_NO_DATA_AGENT 1141 struct ndm_data_agent *data_acb; 1142 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */ 1143 #ifndef NDMOS_OPTION_NO_TAPE_AGENT 1144 struct ndm_tape_agent *tape_acb; 1145 struct ndm_tape_simulator_callbacks *ntsc; 1146 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */ 1147 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT 1148 struct ndm_robot_agent *robot_acb; 1149 struct ndm_robot_simulator_callbacks *nrsc; 1150 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */ 1151 1152 struct ndm_auth_callbacks *nac; 1153 1154 struct ndm_plumbing plumb; 1155 1156 struct ndm_session_param *param; 1157 1158 /* scratch pad stuff */ 1159 ndmp9_config_info *config_info; 1160 char md5_challenge[64]; /* CONNECT_AUTH MD5 */ 1161 1162 NDM_FLAG_DECL(conn_open) 1163 NDM_FLAG_DECL(conn_authorized) 1164 NDM_FLAG_DECL(conn_snooping) 1165 NDM_FLAG_DECL(md5_challenge_valid) 1166 NDM_FLAG_DECL(control_agent_enabled) 1167 NDM_FLAG_DECL(data_agent_enabled) 1168 NDM_FLAG_DECL(tape_agent_enabled) 1169 NDM_FLAG_DECL(robot_agent_enabled) 1170 NDM_FLAG_DECL(dump_media_info) 1171 NDM_FLAG_DECL(error_raised) 1172 1173 int connect_status; 1174 1175 /* Void pointer to session specific data the calling process wants to associate */ 1176 void * session_handle; 1177 1178 #ifdef NDMOS_MACRO_SESSION_ADDITIONS 1179 NDMOS_MACRO_SESSION_ADDITIONS 1180 #endif /* NDMOS_MACRO_SESSION_ADDITIONS */ 1181 }; 1182 1183 1184 /* ndma_session.c */ 1185 extern int ndma_client_session (struct ndm_session *sess, 1186 struct ndm_job_param *job, int swap_connect); 1187 extern int ndma_server_session (struct ndm_session *sess, 1188 int control_sock); 1189 extern int ndma_daemon_session (struct ndm_session *sess, int port); 1190 extern int ndma_session_quantum (struct ndm_session *sess, 1191 int max_delay_secs); 1192 extern int ndma_session_initialize (struct ndm_session *sess); 1193 extern int ndma_session_commission (struct ndm_session *sess); 1194 extern int ndma_session_decommission (struct ndm_session *sess); 1195 extern int ndma_session_destroy (struct ndm_session *sess); 1196 1197 1198 1199 1200 /* ndma_comm_subr.c */ 1201 extern void ndmalogf (struct ndm_session *sess, char *tag, 1202 int level, char *fmt, ...); 1203 extern void ndmalogfv (struct ndm_session *sess, char *tag, 1204 int level, char *fmt, va_list ap); 1205 1206 1207 1208 1209 /* 1210 * Dispatch Version/Reqeust Tables (DVT, DRT) 1211 **************************************************************** 1212 */ 1213 1214 struct ndm_dispatch_request_table { 1215 uint16_t message; 1216 uint16_t flags; 1217 int (*dispatch_request) ( /* "dr" for short */ 1218 struct ndm_session *sess, 1219 struct ndmp_xa_buf *xa, 1220 struct ndmconn *ref_conn); 1221 }; 1222 1223 struct ndm_dispatch_version_table { 1224 int protocol_version; 1225 struct ndm_dispatch_request_table * dispatch_request_table; 1226 }; 1227 1228 #define NDM_DRT_FLAG_OK_NOT_CONNECTED 0x0001 1229 #define NDM_DRT_FLAG_OK_NOT_AUTHORIZED 0x0002 1230 1231 1232 /* ndma_comm_dispatch.c */ 1233 extern int ndma_dispatch_request (struct ndm_session *sess, 1234 struct ndmp_xa_buf *xa, struct ndmconn *ref_conn); 1235 extern int ndma_dispatch_raise_error (struct ndm_session *sess, 1236 struct ndmp_xa_buf *xa, struct ndmconn *ref_conn, 1237 ndmp9_error error, char *errstr); 1238 extern int ndma_dispatch_conn (struct ndm_session *sess, 1239 struct ndmconn *conn); 1240 extern void ndma_dispatch_ctrl_unexpected (struct ndmconn *conn, 1241 struct ndmp_msg_buf *nmb); 1242 extern int ndmta_local_mover_read (struct ndm_session *sess, 1243 uint64_t offset, uint64_t length); 1244 extern int ndma_call_no_tattle (struct ndmconn *conn, 1245 struct ndmp_xa_buf *xa); 1246 extern int ndma_call (struct ndmconn *conn, struct ndmp_xa_buf *xa); 1247 extern int ndma_send_to_control (struct ndm_session *sess, 1248 struct ndmp_xa_buf *xa, 1249 struct ndmconn *from_conn); 1250 extern int ndma_tattle (struct ndmconn *conn, 1251 struct ndmp_xa_buf *xa, int rc); 1252 extern struct ndm_dispatch_request_table * 1253 ndma_drt_lookup (struct ndm_dispatch_version_table *dvt, 1254 unsigned protocol_version, unsigned message); 1255 1256 #define NDMADR_RAISE(ERROR,ERRSTR) \ 1257 return ndma_dispatch_raise_error (sess, xa, ref_conn, ERROR, ERRSTR) 1258 1259 #define NDMADR_RAISE_ILLEGAL_ARGS(ERRSTR) \ 1260 NDMADR_RAISE(NDMP9_ILLEGAL_ARGS_ERR, ERRSTR) 1261 #define NDMADR_RAISE_ILLEGAL_STATE(ERRSTR) \ 1262 NDMADR_RAISE(NDMP9_ILLEGAL_STATE_ERR, ERRSTR) 1263 1264 1265 1266 1267 #define NDMADR_UNIMPLEMENTED_MESSAGE (-1) /* aka "TODO" */ 1268 #define NDMADR_UNSPECIFIED_MESSAGE (-123) /* no such per specs */ 1269 #define NDMADR_UNIMPLEMENTED_VERSION (-1234) /* implementation error */ 1270 1271 1272 1273 1274 /* 1275 * Operating System Specific 1276 **************************************************************** 1277 * Must be implemented in ndmos_xxx.c 1278 */ 1279 1280 /* from ndma_dispatch_request() in ndma_dispatch.c */ 1281 extern int ndmos_dispatch_request (struct ndm_session *sess, 1282 struct ndmp_xa_buf *xa, 1283 struct ndmconn *ref_conn); 1284 1285 /* from ndmadr_connect_client_auth() in ndma_dispatch.c */ 1286 struct ndm_auth_callbacks { 1287 int (*validate_password)(struct ndm_session *sess, char *name, char *pass); 1288 int (*validate_md5)(struct ndm_session *sess, char *name, char digest[16]); 1289 }; 1290 1291 extern void ndmos_auth_register_callbacks (struct ndm_session *sess, 1292 struct ndm_auth_callbacks *callbacks); 1293 extern void ndmos_auth_unregister_callbacks (struct ndm_session *sess); 1294 extern int ndmos_ok_name_password (struct ndm_session *sess, 1295 char *name, char *pass); 1296 extern int ndmos_get_md5_challenge (struct ndm_session *sess); 1297 extern int ndmos_ok_name_md5_digest (struct ndm_session *sess, 1298 char *name, char digest[16]); 1299 1300 /* from ndmadr_config_get_{host,server}_info() in ndma_dispatch.c */ 1301 extern void ndmos_sync_config_info (struct ndm_session *sess); 1302 1303 /* from ndma_image_stream.c and ndma_ctrl_conn.c and others */ 1304 extern void ndmos_condition_pipe_fd (struct ndm_session *sess, 1305 int fd); 1306 extern void ndmos_condition_listen_socket ( 1307 struct ndm_session *sess, int sock); 1308 extern void ndmos_condition_control_socket ( 1309 struct ndm_session *sess, int sock); 1310 extern void ndmos_condition_image_stream_socket ( 1311 struct ndm_session *sess, int sock); 1312 1313 #ifndef NDMOS_OPTION_NO_TAPE_AGENT 1314 1315 struct ndm_tape_simulator_callbacks { 1316 ndmp9_error (*tape_open)(struct ndm_session *sess, 1317 char *drive_name, int will_write); 1318 ndmp9_error (*tape_close)(struct ndm_session *sess); 1319 ndmp9_error (*tape_mtio)(struct ndm_session *sess, 1320 ndmp9_tape_mtio_op op, uint32_t count, uint32_t *resid); 1321 ndmp9_error (*tape_write)(struct ndm_session *sess, 1322 char *buf, uint32_t count, uint32_t *done_count); 1323 ndmp9_error (*tape_wfm)(struct ndm_session *sess); 1324 ndmp9_error (*tape_read)(struct ndm_session *sess, 1325 char *buf, uint32_t count, uint32_t *done_count); 1326 }; 1327 1328 extern void ndmos_tape_register_callbacks (struct ndm_session *sess, 1329 struct ndm_tape_simulator_callbacks *callbacks); 1330 extern void ndmos_tape_unregister_callbacks (struct ndm_session *sess); 1331 extern int ndmos_tape_initialize (struct ndm_session *sess); 1332 extern ndmp9_error ndmos_tape_open (struct ndm_session *sess, 1333 char *drive_name, int will_write); 1334 extern ndmp9_error ndmos_tape_close (struct ndm_session *sess); 1335 extern void ndmos_tape_sync_state (struct ndm_session *sess); 1336 extern ndmp9_error ndmos_tape_mtio (struct ndm_session *sess, 1337 ndmp9_tape_mtio_op op, 1338 uint32_t count, uint32_t *resid); 1339 extern ndmp9_error ndmos_tape_write (struct ndm_session *sess, 1340 char *buf, 1341 uint32_t count, uint32_t *done_count); 1342 extern ndmp9_error ndmos_tape_wfm (struct ndm_session *sess); 1343 extern ndmp9_error ndmos_tape_read (struct ndm_session *sess, 1344 char *buf, 1345 uint32_t count, uint32_t *done_count); 1346 extern ndmp9_error ndmos_tape_execute_cdb (struct ndm_session *sess, 1347 ndmp9_execute_cdb_request *request, 1348 ndmp9_execute_cdb_reply *reply); 1349 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */ 1350 1351 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT 1352 1353 struct ndm_robot_simulator_callbacks { 1354 ndmp9_error (*scsi_open)(struct ndm_session *sess, char *name); 1355 ndmp9_error (*scsi_close)(struct ndm_session *sess); 1356 ndmp9_error (*scsi_reset)(struct ndm_session *sess); 1357 ndmp9_error (*scsi_execute_cdb)(struct ndm_session *sess, 1358 ndmp9_execute_cdb_request *request, 1359 ndmp9_execute_cdb_reply *reply); 1360 }; 1361 1362 extern void ndmos_scsi_register_callbacks (struct ndm_session *sess, 1363 struct ndm_robot_simulator_callbacks *callbacks); 1364 extern void ndmos_scsi_unregister_callbacks (struct ndm_session *sess); 1365 extern int ndmos_scsi_initialize (struct ndm_session *sess); 1366 extern void ndmos_scsi_sync_state (struct ndm_session *sess); 1367 extern void ndmos_scsi_sync_config_info (struct ndm_session *sess); 1368 extern ndmp9_error ndmos_scsi_open (struct ndm_session *sess, char *name); 1369 extern ndmp9_error ndmos_scsi_close (struct ndm_session *sess); 1370 extern ndmp9_error ndmos_scsi_set_target (struct ndm_session *sess); 1371 extern ndmp9_error ndmos_scsi_reset_device (struct ndm_session *sess); 1372 extern ndmp9_error ndmos_scsi_reset_bus (struct ndm_session *sess); 1373 extern ndmp9_error ndmos_scsi_execute_cdb (struct ndm_session *sess, 1374 ndmp9_execute_cdb_request *request, 1375 ndmp9_execute_cdb_reply *reply); 1376 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */ 1377 1378 1379 /* ndma_noti_calls.c */ 1380 #ifndef NDMOS_OPTION_NO_DATA_AGENT 1381 extern int ndma_notify_data_halted (struct ndm_session *sess); 1382 extern int ndma_notify_data_read (struct ndm_session *sess, 1383 uint64_t offset, uint64_t length); 1384 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */ 1385 #ifndef NDMOS_OPTION_NO_TAPE_AGENT 1386 extern int ndma_notify_mover_halted (struct ndm_session *sess); 1387 extern int ndma_notify_mover_paused (struct ndm_session *sess); 1388 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */ 1389 #ifndef NDMOS_EFFECT_NO_SERVER_AGENTS 1390 extern void ndma_send_logmsg (struct ndm_session *sess, 1391 ndmp9_log_type ltype, struct ndmconn *from_conn, 1392 char *fmt, ...); 1393 1394 #ifdef __cplusplus 1395 } 1396 #endif 1397 1398 #endif /* !NDMOS_EFFECT_NO_SERVER_AGENTS */ 1399 1400 #endif /* BAREOS_NDMP_NDMAGENTS_H_ */ 1401