2 * Copyright (c) 1998,1999,2000
3 * Traakan, Inc., Los Altos, CA
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice unmodified, this list of conditions, and the following
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.
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
35 ********************************************************************
37 * NDMP Elements of a backup/restore session
40 * | Job |----># CONTROL # +----------------+
41 * +-----+ # Agent #<---->|FILE/MEDIA INDEX|
42 * # # +----------------+
45 * +----------------+ | +---------------------+
46 * | control | connections |
48 * ############ ############ +-------+ #########
49 * # DATA # # TAPE # | | # ROBOT #
50 * # Agent # # Agent # | ROBOT |<-># Agent #
51 * +-----+ # +------+ # image # +------+ # |+-----+| # #
52 * |FILES|====|butype|============|mover |=====|DRIVE|| # #
53 * +-----+ # +------+ # stream # +------+ # |+-----+| # #
54 * ############ ############ +-------+ #########
57 ********************************************************************
59 * NDMAGENTS components overview
62 * "job" -> ndma_client_session() ndma_server_session()
66 * | +------------------------------------+ +-----------+
67 * | /->| SESSION QUANTUM |----->| disp conn |
68 * | | +------------------------------------+ \ +-----------+
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 | |
83 * formatter| |image_stream | |remo |
85 * +---------+<---ndmchan_poll()----/ +---------+
86 * | ndmchan |<---------------------------| ndmconn |
87 * +---------+ +---------+
88 * non-blocking I/O XDR wrapper
90 * -----> caller/callee
91 * --Q--> quantum (CPU scheduling)
92 * ====== image stream shared data structures
94 ********************************************************************
103 * VERSION AND RELEASE CONSTANTS -- KEEPER ONLY
104 ****************************************************************
106 * Revision constants for the source code. These may only be
107 * changed by the keeper of these sources. Contact ndmp-tech@ndmp.org
108 * for a pointer to the latest sources and the current keeper.
110 * The Version increases every time there is a significant
111 * design change. Significant means new functionality,
112 * reorganization of key data structures, etc. The Release
113 * increases every time the keeper releases an update to
114 * the current version, such as bug fixes or integration
115 * of new contributions.
117 * There are provisions for a free-form string for revisions
118 * of the O/S specific portions (NDMOS_CONST_NDMOS_REVISION)
119 * and for local revisions (NDMOS_CONST_NDMJOBLIB_REVISION)
120 * which reflect in-house change levels.
122 #define NDMJOBLIB_VERSION 1
123 #define NDMJOBLIB_RELEASE 2
128 struct ndm_session; /* forward decl */
134 * NDM_ENV_TABLE and NDM_NLIST_TABLE
135 ****************************************************************
136 * Used by DATA and CONTROL agents
139 #define NDM_MAX_ENV 1024
141 struct ndm_env_table {
143 ndmp9_pval env[NDM_MAX_ENV];
146 #ifndef NDM_MAX_NLIST
147 #define NDM_MAX_NLIST 10240
149 struct ndm_nlist_table {
151 ndmp9_name nlist[NDM_MAX_NLIST];
152 ndmp9_name nlist_new[NDM_MAX_NLIST];
153 ndmp9_error result_err[NDM_MAX_NLIST];
154 unsigned result_count[NDM_MAX_NLIST];
160 #ifndef NDMOS_OPTION_NO_CONTROL_AGENT
163 ****************************************************************
166 #include "smc.h" /* SCSI Media Changer */
169 #ifndef NDM_MAX_MEDIA
170 #define NDM_MAX_MEDIA 40
173 struct ndm_media_table {
175 struct ndmmedia media[NDM_MAX_MEDIA];
179 #define NDM_JOB_OP_BACKUP (0x100 | 'c')
180 #define NDM_JOB_OP_EXTRACT (0x100 | 'x')
181 #define NDM_JOB_OP_TOC (0x100 | 't')
182 #define NDM_JOB_OP_QUERY_AGENTS (0x100 | 'q')
183 #define NDM_JOB_OP_INIT_LABELS (0x100 | 'I')
184 #define NDM_JOB_OP_LIST_LABELS (0x100 | 'L')
185 #define NDM_JOB_OP_REMEDY_ROBOT (0x100 | 'Z')
187 /* test operations */
188 #define NDM_JOB_OP_TEST_TAPE (0x200 | 'T')
189 #define NDM_JOB_OP_TEST_MOVER (0x200 | 'M')
190 #define NDM_JOB_OP_TEST_DATA (0x200 | 'D')
192 /* tape handling operations */
193 #define NDM_JOB_OP_REWIND_TAPE (0x300 | 'r')
194 #define NDM_JOB_OP_EJECT_TAPE (0x300 | 'j')
195 #define NDM_JOB_OP_MOVE_TAPE (0x300 | 'm')
196 #define NDM_JOB_OP_LOAD_TAPE (0x300 | 'l')
197 #define NDM_JOB_OP_UNLOAD_TAPE (0x300 | 'u')
198 #define NDM_JOB_OP_IMPORT_TAPE (0x300 | 'i')
199 #define NDM_JOB_OP_EXPORT_TAPE (0x300 | 'e')
200 #define NDM_JOB_OP_INIT_ELEM_STATUS (0x300 | 'I')
202 /* daemon operations */
203 #define NDM_JOB_OP_DAEMON 'd'
204 #define NDM_JOB_OP_TEST_DAEMON 'D'
206 struct ndm_job_param {
207 int operation; /* NDM_JOB_OP_... */
208 int time_limit; /* command timeout, 0 is off */
210 struct ndmagent data_agent; /* DATA AGENT host/pw */
211 char * bu_type; /* e.g. "tar" */
212 struct ndm_env_table env_tab; /* for BACKUP+RECOVER ops */
213 struct ndm_nlist_table nlist_tab; /* for RECOVER ops */
214 struct ndm_env_table result_env_tab; /* after BACKUP */
215 struct ndmlog index_log; /* to log NDMP_FH_ADD_... */
217 struct ndmagent tape_agent; /* TAPE AGENT host/pw */
218 char * tape_device; /* eg "/dev/rmt0" */
219 unsigned tape_timeout; /* secs total to retry open */
220 unsigned record_size; /* in bytes, 10k typical */
221 unsigned long long last_w_offset; /* last window offset sent */
222 struct ndmscsi_target tape_target; /* unused for now */
223 char * tape_tcp; /* tcp direct */
224 NDM_FLAG_DECL(use_eject) /* eject upon close (unload) */
226 struct ndmagent robot_agent; /* ROBOT AGENT host/pw */
227 struct ndmscsi_target robot_target; /* SCSI coord of robot */
228 unsigned robot_timeout; /* secs total to retry move */
229 NDM_FLAG_DECL(have_robot) /* yes, we have robot, today */
230 NDM_FLAG_DECL(auto_remedy) /* if drive loaded, unload */
231 NDM_FLAG_DECL(remedy_all) /* OP_REMEDY, all drives */
232 NDM_FLAG_DECL(drive_addr_given)
233 NDM_FLAG_DECL(from_addr_given)
234 NDM_FLAG_DECL(to_addr_given)
235 unsigned drive_addr; /* 0->first, !0->elem addr */
236 unsigned from_addr; /* for MOVE and EXPORT */
237 unsigned to_addr; /* for MOVE and IMPORT */
238 /* use move for many I/E */
240 struct ndm_media_table media_tab; /* media to use, params */
241 struct ndm_media_table result_media_tab; /* results after job */
243 unsigned long n_file_entry;
244 unsigned long n_dir_entry;
245 unsigned long n_node_entry;
246 unsigned long long root_node;
250 extern int ndma_job_audit (struct ndm_job_param *job,
251 char *errbuf, int errskip);
252 extern int ndma_job_media_audit (struct ndm_job_param *job,
253 char *errbuf, int errskip);
254 extern void ndma_job_auto_adjust (struct ndm_job_param *job);
257 struct ndm_control_agent {
258 /* The JOB, see immediately above */
259 struct ndm_job_param job;
260 NDM_FLAG_DECL(swap_connect)
261 NDM_FLAG_DECL(has_tcp_addr)
262 NDM_FLAG_DECL(has_local_addr)
265 ndmp9_data_operation data_op;
266 ndmp9_data_get_state_reply data_state;
267 NDM_FLAG_DECL(pending_notify_data_read)
268 NDM_FLAG_DECL(pending_notify_data_halted)
269 ndmp9_notify_data_read_request last_notify_data_read;
270 ndmp9_addr data_addr;
271 int recover_log_file_count;
272 int recover_log_file_ok;
273 int recover_log_file_error;
276 ndmp9_addr mover_addr;
277 ndmp9_mover_mode mover_mode;
280 ndmp9_mover_get_state_reply mover_state;
281 NDM_FLAG_DECL(pending_notify_mover_paused)
282 NDM_FLAG_DECL(pending_notify_mover_halted)
283 ndmp9_notify_mover_paused_request last_notify_mover_paused;
285 ndmp9_tape_open_mode tape_mode;
286 ndmp9_tape_get_state_reply tape_state;
288 /* Media management, media_table inside of job */
290 NDM_FLAG_DECL(media_is_loaded)
291 NDM_FLAG_DECL(is_label_op)
294 struct smc_ctrl_block smc_cb;
298 char * active_test; /* name of test or 0 if no test */
299 char * active_test_failed; /* active test failed */
300 char * active_test_warned; /* active test warned */
302 char * test_phase; /* name of sub-series test phase */
303 int test_step; /* test sequence number */
305 int n_step_pass; /* per phase test stats */
310 int total_n_step_pass; /* total test stats */
311 int total_n_step_fail;
312 int total_n_step_warn;
313 int total_n_step_tests;
315 #ifdef NDMOS_MACRO_CONTROL_AGENT_ADDITIONS
316 NDMOS_MACRO_CONTROL_AGENT_ADDITIONS
317 #endif /* NDMOS_MACRO_CONTROL_AGENT_ADDITIONS */
322 extern int ndmca_control_agent (struct ndm_session *sess);
324 /* ndma_cops_backreco.c */
325 extern int ndmca_op_create_backup (struct ndm_session *sess);
326 extern int ndmca_op_recover_files (struct ndm_session *sess);
327 extern int ndmca_op_recover_fh (struct ndm_session *sess);
328 extern int ndmca_monitor_backup (struct ndm_session *sess);
329 extern int ndmca_monitor_get_post_backup_env (struct ndm_session *sess);
330 extern int ndmca_monitor_recover (struct ndm_session *sess);
331 extern int ndmca_backreco_startup (struct ndm_session *sess);
332 extern int ndmca_monitor_startup (struct ndm_session *sess);
333 extern int ndmca_monitor_shutdown (struct ndm_session *sess);
334 extern int ndmca_monitor_get_states (struct ndm_session *sess);
335 extern int ndmca_monitor_load_next (struct ndm_session *sess);
336 extern int ndmca_monitor_seek_tape (struct ndm_session *sess);
337 extern int ndmca_monitor_unload_last_tape (struct ndm_session *sess);
338 extern int ndmca_mon_wait_for_something (struct ndm_session *sess,
341 /* ndma_cops_labels.c */
342 extern int ndmca_op_init_labels (struct ndm_session *sess);
343 extern int ndmca_op_list_labels (struct ndm_session *sess);
346 /* ndma_cops_query.c */
347 extern int ndmca_op_query (struct ndm_session *sess);
348 extern int ndmca_opq_data (struct ndm_session *sess);
349 extern int ndmca_opq_tape (struct ndm_session *sess);
350 extern int ndmca_opq_robot (struct ndm_session *sess);
351 extern int ndmca_opq_host_info (struct ndm_session *sess,
352 struct ndmconn *conn);
353 extern int ndmca_opq_get_mover_type (struct ndm_session *sess,
354 struct ndmconn *conn);
355 extern int ndmca_opq_get_butype_attr (struct ndm_session *sess,
356 struct ndmconn *conn);
357 extern int ndmca_opq_get_fs_info (struct ndm_session *sess,
358 struct ndmconn *conn);
359 extern int ndmca_opq_get_tape_info (struct ndm_session *sess,
360 struct ndmconn *conn);
361 extern int ndmca_opq_get_scsi_info (struct ndm_session *sess,
362 struct ndmconn *conn);
363 extern void ndmalogqr (struct ndm_session *sess, char *fmt, ...);
366 /* ndma_cops_robot.c */
367 extern int ndmca_op_robot_remedy (struct ndm_session *sess);
368 extern int ndmca_op_robot_startup (struct ndm_session *sess,
369 int verify_media_flag);
370 extern int ndmca_op_init_elem_status (struct ndm_session *sess);
371 extern int ndmca_op_rewind_tape (struct ndm_session *sess);
372 extern int ndmca_op_eject_tape (struct ndm_session *sess);
373 extern int ndmca_op_mtio (struct ndm_session *sess,
374 ndmp9_tape_mtio_op mtio_op);
376 extern int ndmca_op_move_tape (struct ndm_session *sess);
377 extern int ndmca_op_import_tape (struct ndm_session *sess);
378 extern int ndmca_op_export_tape (struct ndm_session *sess);
379 extern int ndmca_op_load_tape (struct ndm_session *sess);
380 extern int ndmca_op_unload_tape (struct ndm_session *sess);
383 /* ndma_ctrl_calls.c */
384 extern int ndmca_data_get_state (struct ndm_session *sess);
385 extern int ndmca_data_connect (struct ndm_session *sess);
386 extern int ndmca_data_listen (struct ndm_session *sess);
387 extern int ndmca_data_start_backup (struct ndm_session *sess);
388 extern int ndmca_data_start_recover (struct ndm_session *sess);
389 extern int ndmca_data_start_recover_filehist (struct ndm_session *sess);
390 extern int ndmca_data_abort (struct ndm_session *sess);
391 extern int ndmca_data_get_env (struct ndm_session *sess);
392 extern int ndmca_data_stop (struct ndm_session *sess);
393 extern int ndmca_tape_open (struct ndm_session *sess);
394 extern int ndmca_tape_close (struct ndm_session *sess);
395 extern int ndmca_tape_get_state (struct ndm_session *sess);
396 extern int ndmca_tape_get_state_no_tattle (struct ndm_session *sess);
397 extern int ndmca_tape_mtio (struct ndm_session *sess,
398 ndmp9_tape_mtio_op op, u_long count, u_long *resid);
399 extern int ndmca_tape_write (struct ndm_session *sess,
400 char *buf, unsigned count);
401 extern int ndmca_tape_read (struct ndm_session *sess,
402 char *buf, unsigned count);
403 extern int ndmca_mover_get_state (struct ndm_session *sess);
404 extern int ndmca_mover_listen (struct ndm_session *sess);
405 extern int ndmca_mover_connect (struct ndm_session *sess);
406 extern int ndmca_mover_continue (struct ndm_session *sess);
407 extern int ndmca_mover_abort (struct ndm_session *sess);
408 extern int ndmca_mover_stop (struct ndm_session *sess);
409 extern int ndmca_mover_set_window (struct ndm_session *sess,
410 unsigned long long offset, unsigned long long length);
411 extern int ndmca_mover_read (struct ndm_session *sess,
412 unsigned long long offset, unsigned long long length);
413 extern int ndmca_mover_close (struct ndm_session *sess);
414 extern int ndmca_mover_set_record_size (struct ndm_session *sess);
417 /* ndma_ctrl_media.c */
418 extern int ndmca_media_load_first (struct ndm_session *sess);
419 extern int ndmca_media_load_next (struct ndm_session *sess);
420 extern int ndmca_media_unload_last (struct ndm_session *sess);
421 extern int ndmca_media_change (struct ndm_session *sess);
422 extern int ndmca_media_load_seek (struct ndm_session *sess,
423 unsigned long long pos);
424 extern int ndmca_media_load_current (struct ndm_session *sess);
425 extern int ndmca_media_unload_current (struct ndm_session *sess);
426 extern int ndmca_media_unload_best_effort (struct ndm_session *sess);
427 extern int ndmca_media_open_tape (struct ndm_session *sess);
428 extern int ndmca_media_close_tape (struct ndm_session *sess);
429 extern int ndmca_media_mtio_tape (struct ndm_session *sess,
430 ndmp9_tape_mtio_op op, u_long count, u_long *resid);
431 extern int ndmca_media_write_filemarks (struct ndm_session *sess);
432 extern int ndmca_media_read_label (struct ndm_session *sess,
434 extern int ndmca_media_write_label (struct ndm_session *sess,
435 int type, char labbuf[]);
436 extern int ndmca_media_check_label (struct ndm_session *sess,
437 int type, char labbuf[]);
438 extern int ndmca_media_verify (struct ndm_session *sess);
439 extern int ndmca_media_tattle (struct ndm_session *sess);
440 extern unsigned long long
441 ndmca_media_capture_tape_offset (struct ndm_session *sess);
442 extern int ndmca_media_capture_mover_window (struct ndm_session *sess);
443 extern int ndmca_media_calculate_windows (struct ndm_session *sess);
444 extern int ndmca_media_calculate_offsets (struct ndm_session *sess);
445 extern int ndmca_media_set_window_current (struct ndm_session *sess);
448 /* ndma_ctrl_robot.c */
449 extern int ndmca_robot_issue_scsi_req (struct smc_ctrl_block *smc);
450 extern int ndmca_robot_prep_target (struct ndm_session *sess);
451 extern int ndmca_robot_obtain_info (struct ndm_session *sess);
452 extern int ndmca_robot_init_elem_status (struct ndm_session *sess);
453 extern int ndmca_robot_startup (struct ndm_session *sess);
454 extern int ndmca_robot_move (struct ndm_session *sess,
455 int src_addr, int dst_addr);
456 extern int ndmca_robot_load (struct ndm_session *sess, int slot_addr);
457 extern int ndmca_robot_unload (struct ndm_session *sess, int slot_addr);
458 extern struct smc_element_descriptor *
459 ndmca_robot_find_element (struct ndm_session *sess,
460 int element_address);
461 extern int ndmca_robot_check_ready (struct ndm_session *sess);
462 extern int ndmca_robot_remedy_ready (struct ndm_session *sess);
463 extern int ndmca_robot_query (struct ndm_session *sess);
464 extern int ndmca_robot_verify_media (struct ndm_session *sess);
465 extern int ndmca_robot_synthesize_media (struct ndm_session *sess);
468 /* ndma_ctrl_conn.c */
469 extern int ndmca_connect_xxx_agent (struct ndm_session *sess,
470 struct ndmconn **connp, char *prefix,
471 struct ndmagent *agent);
472 extern int ndmca_connect_data_agent (struct ndm_session *sess);
473 extern int ndmca_connect_tape_agent (struct ndm_session *sess);
474 extern int ndmca_connect_robot_agent (struct ndm_session *sess);
475 extern int ndmca_connect_control_agent (struct ndm_session *sess);
479 /* ndma_ctst_tape.c */
480 extern int ndmca_op_test_tape (struct ndm_session *sess);
482 /* ndma_ctst_mover.c */
483 extern int ndmca_op_test_mover (struct ndm_session *sess);
485 /* ndma_ctst_data.c */
486 extern int ndmca_op_test_data (struct ndm_session *sess);
488 /* ndma_ctst_subr.c */
489 extern int ndmca_test_query_conn_types (struct ndm_session *sess,
490 struct ndmconn *ref_conn);
491 extern int ndmca_test_load_tape (struct ndm_session *sess);
492 extern int ndmca_test_unload_tape (struct ndm_session *sess);
493 extern int ndmca_test_call (struct ndmconn *conn,
494 struct ndmp_xa_buf *xa, ndmp9_error expect_err);
495 extern int ndmca_test_check_expect_errs (struct ndmconn *conn,
496 int rc, ndmp9_error expect_errs[]);
497 extern int ndmca_test_check_expect (struct ndmconn *conn,
498 int rc, ndmp9_error expect_err);
499 extern int ndmca_test_check_expect_no_err (struct ndmconn *conn,
501 extern int ndmca_test_check_expect_illegal_state (struct ndmconn *conn,
503 extern int ndmca_test_check_expect_illegal_args (struct ndmconn *conn,
505 extern void ndmca_test_phase (struct ndm_session *sess,
506 char *test_phase, char *desc);
507 extern void ndmca_test_log_step (struct ndm_session *sess,
508 int level, char *msg);
509 extern void ndmca_test_log_note (struct ndm_session *sess,
510 int level, char *msg);
511 extern void ndmca_test_done_phase (struct ndm_session *sess);
512 extern void ndmca_test_done_series (struct ndm_session *sess,
514 extern void ndmca_test_open (struct ndm_session *sess,
516 char *sub_test_name);
517 extern void ndmca_test_warn (struct ndm_session *sess, char *warn_msg);
518 extern void ndmca_test_fail (struct ndm_session *sess, char *fail_msg);
519 extern void ndmca_test_close (struct ndm_session *sess);
522 extern void ndmca_test_fill_data (char *buf, int bufsize,
523 int recno, int fileno);
525 #endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
530 #ifndef NDMOS_OPTION_NO_DATA_AGENT
533 ****************************************************************
535 * NDMP Elements of Data Agent (backup)
537 * +-----------+stderr
538 * | bu_type |--------formatter_err---------NDMP_LOG-------> to CONTROL
540 * | process |========formatter_data=+=====================> to image stream
541 * +-----------+stdout |
543 * | snoop |--NDMP_FH_ADD_x--> to CONTROL
546 ****************************************************************
548 * NDMP Elements of Data Agent (recover)
550 * +-----------+stderr
551 * | bu_type |--------formatter_err---------NDMP_LOG-------> to CONTROL
552 * | formatter | +--------+
553 * | process |<=======fmt_data=| direct |==================< from image str
554 * +-----------+stdin | |-NOTIFY_DATA_READ-> to CONTROL
558 ****************************************************************
560 * NDMP Elements of Data Agent (recover filehist)
563 * | direct |==================< from image str
564 * | |-NOTIFY_DATA_READ-> to CONTROL
565 * | snoop |--NDMP_FH_ADD_x---> to CONTROL
568 ****************************************************************
573 #ifndef NDMDA_N_FMT_IMAGE_BUF
574 #define NDMDA_N_FMT_IMAGE_BUF (8*1024)
576 #ifndef NDMDA_N_FHH_BUF
577 #define NDMDA_N_FHH_BUF (8*1024)
579 #ifndef NDMDA_N_FMT_ERROR_BUF
580 #define NDMDA_N_FMT_ERROR_BUF (8*1024)
582 #ifndef NDMDA_N_FMT_WRAP_BUF
583 #define NDMDA_N_FMT_WRAP_BUF (4*1024)
585 #ifndef NDMDA_MAX_CMD
586 #define NDMDA_MAX_CMD (4*1024)
591 #ifndef NDMOS_OPTION_NO_GTAR_BUTYPE
592 extern int ndmda_butype_gtar_config_get_attrs (struct ndm_session *sess,
593 u_long *attrs_p, int protocol_version);
595 extern int ndmda_butype_gtar_config_get_default_env (
596 struct ndm_session *sess,
597 ndmp9_pval **env_p, int *n_env_p,
598 int protocol_version);
599 extern int ndmda_butype_gtar_attach (struct ndm_session *sess);
601 #ifndef NDMOS_OPTION_NO_DUMP_BUTYPE
602 extern int ndmda_butype_dump_config_get_attrs (struct ndm_session *sess,
603 u_long *attrs_p, int protocol_version);
605 extern int ndmda_butype_dump_config_get_default_env (
606 struct ndm_session *sess,
607 ndmp9_pval **env_p, int *n_env_p,
608 int protocol_version);
609 extern int ndmda_butype_dump_attach (struct ndm_session *sess);
615 struct ndm_data_recovery_interval {
620 enum ndm_data_recovery_access_method {
621 NDMDA_RECO_ACCESS_SEQUENTIAL = 1,
622 NDMDA_RECO_ACCESS_DIRECT,
623 NDMDA_RECO_ACCESS_SEMI_DIRECT,
624 NDMDA_RECO_ACCESS_SEMI_DIRECT_PENDING,
627 enum ndm_data_recovery_state {
628 NDMDA_RECO_STATE_START = 1,
629 NDMDA_RECO_STATE_PASS_THRU,
630 NDMDA_RECO_STATE_CHOOSE_NLENT,
631 NDMDA_RECO_STATE_ACQUIRE,
632 NDMDA_RECO_STATE_DISPOSE,
633 NDMDA_RECO_STATE_FINISH_NLENT,
634 NDMDA_RECO_STATE_ALL_DONE,
637 enum ndm_data_recovery_acquire_mode {
638 NDMDA_RECO_ACQUIRE_EVERYTHING = 1,
639 NDMDA_RECO_ACQUIRE_SEARCHING,
640 NDMDA_RECO_ACQUIRE_MATCHING,
643 enum ndm_data_recovery_disposition {
644 NDMDA_RECO_DISPOSITION_PASS = 1,
645 NDMDA_RECO_DISPOSITION_DISCARD,
649 struct ndm_data_agent {
650 int protocol_version;
653 struct ndm_env_table env_tab;
654 struct ndm_nlist_table nlist_tab;
656 NDM_FLAG_DECL(enable_hist)
657 unsigned long long pass_resid;
659 ndmp9_data_get_state_reply data_state;
660 int data_notify_pending;
662 struct ndmchan formatter_image; /* stdin/out */
663 struct ndmchan formatter_error; /* stderr */
664 struct ndmchan formatter_wrap; /* fd=3 */
667 char fmt_image_buf[NDMDA_N_FMT_IMAGE_BUF];
668 char fmt_error_buf[NDMDA_N_FMT_ERROR_BUF];
669 char fmt_wrap_buf[NDMDA_N_FMT_WRAP_BUF];
671 struct ndmfhheap fhh;
672 unsigned long fhh_buf[NDMDA_N_FHH_BUF];
674 #ifdef NDMOS_MACRO_DATA_AGENT_ADDITIONS
675 NDMOS_MACRO_DATA_AGENT_ADDITIONS
676 #endif /* NDMOS_MACRO_DATA_AGENT_ADDITIONS */
682 extern int ndmda_initialize (struct ndm_session *sess);
683 extern int ndmda_commission (struct ndm_session *sess);
684 extern int ndmda_decommission (struct ndm_session *sess);
685 extern int ndmda_belay (struct ndm_session *sess);
687 extern ndmp9_error ndmda_data_start_backup (struct ndm_session *sess);
688 extern ndmp9_error ndmda_data_start_recover (struct ndm_session *sess);
689 extern ndmp9_error ndmda_data_start_recover_fh (struct ndm_session *sess);
691 extern void ndmda_sync_state (struct ndm_session *sess);
692 extern ndmp9_error ndmda_data_listen (struct ndm_session *sess);
693 extern ndmp9_error ndmda_data_connect (struct ndm_session *sess);
694 extern void ndmda_data_abort (struct ndm_session *sess);
695 extern void ndmda_sync_environment (struct ndm_session *sess);
696 extern void ndmda_data_halt (struct ndm_session *sess,
697 ndmp9_data_halt_reason reason);
698 extern void ndmda_data_stop (struct ndm_session *sess);
700 extern int ndmda_quantum (struct ndm_session *sess);
701 extern int ndmda_quantum_image (struct ndm_session *sess);
702 extern int ndmda_quantum_stderr (struct ndm_session *sess);
703 extern int ndmda_quantum_wrap (struct ndm_session *sess);
705 extern int ndmda_wrap_in (struct ndm_session *sess,
708 extern void ndmda_send_logmsg (struct ndm_session *sess,
711 extern void ndmda_send_notice (struct ndm_session *sess);
712 extern void ndmda_send_data_read (struct ndm_session *sess,
713 unsigned long long offset,
714 unsigned long long length);
716 extern int ndmda_copy_environment (struct ndm_session *sess,
717 ndmp9_pval *env, unsigned n_env);
718 extern struct ndmp9_pval *ndmda_find_env (struct ndm_session *sess,
721 extern int ndmda_interpret_boolean_value (char *value_str,
724 extern void ndmda_purge_environment (struct ndm_session *sess);
726 extern int ndmda_copy_nlist (struct ndm_session *sess,
727 ndmp9_name *nlist, unsigned n_nlist);
728 extern void ndmda_purge_nlist (struct ndm_session *sess);
729 extern int ndmda_count_invalid_fh_info (struct ndm_session *sess);
730 extern int ndmda_count_invalid_fh_info_pending
731 (struct ndm_session *sess);
733 /* in ndma_data_recover.c */
734 extern int ndmda_quantum_recover_common (struct ndm_session *sess);
735 extern int ndmda_reco_state_start (struct ndm_session *sess);
736 extern int ndmda_reco_pass_thru (struct ndm_session *sess);
737 extern int ndmda_reco_state_pass_thru (struct ndm_session *sess);
738 extern int ndmda_reco_state_choose_nlent (struct ndm_session *sess);
739 extern int ndmda_reco_state_acquire (struct ndm_session *sess);
740 extern int ndmda_reco_state_dispose (struct ndm_session *sess);
741 extern int ndmda_reco_state_finish_nlent (struct ndm_session *sess);
742 extern int ndmda_reco_state_all_done (struct ndm_session *sess);
743 extern int ndmda_reco_assess_channels (struct ndm_session *sess);
744 extern int ndmda_reco_assess_intervals (struct ndm_session *sess);
745 extern int ndmda_reco_align_to_wanted (struct ndm_session *sess);
746 extern int ndmda_reco_obtain_wanted (struct ndm_session *sess);
747 extern int ndmda_reco_send_data_read (struct ndm_session *sess,
748 unsigned long long offset,
749 unsigned long long length);
750 extern int ndmda_reco_internal_error (struct ndm_session *sess,
754 extern int ndmda_fh_initialize (struct ndm_session *sess);
755 extern int ndmda_fh_commission (struct ndm_session *sess);
756 extern int ndmda_fh_decommission (struct ndm_session *sess);
757 extern int ndmda_fh_belay (struct ndm_session *sess);
758 extern void ndmda_fh_add_file (struct ndm_session *sess,
759 ndmp9_file_stat *filestat, char *name);
760 extern void ndmda_fh_add_dir (struct ndm_session *sess,
761 unsigned long long dir_fileno,
763 unsigned long long fileno);
764 extern void ndmda_fh_add_node (struct ndm_session *sess,
765 ndmp9_file_stat *filestat);
767 extern int ndmda_fh_prepare (struct ndm_session *sess,
768 int vers, int msg, int entry_size,
770 unsigned total_size_of_items);
771 extern void ndmda_fh_flush (struct ndm_session *sess);
774 /* ndma_data_gtar.c */
775 extern ndmp9_error ndmda_gtar_start_backup (struct ndm_session *sess);
776 extern ndmp9_error ndmda_gtar_start_recover (struct ndm_session *sess);
777 extern ndmp9_error ndmda_gtar_start_recover_fh (struct ndm_session *sess);
778 extern int ndmda_gtar_snoop (struct ndm_session *sess,
780 struct tar_digest_hdr;
781 extern void ndmda_gtar_fh_add (struct ndm_session *sess,
782 struct tar_digest_hdr *tdh);
785 /* ndma_data_pfe.c (pipe-fork-exec) */
786 extern int ndmda_pipe_fork_exec (struct ndm_session *sess,
787 char *cmd, int is_backup);
788 extern int ndmda_add_to_cmd_with_escapes (char *cmd,
789 char *word, char *special);
790 extern int ndmda_add_to_cmd (char *cmd, char *word);
791 extern int ndmda_add_to_cmd_allow_file_wildcards (char *cmd,
794 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */
799 #ifndef NDMOS_OPTION_NO_TAPE_AGENT
802 ****************************************************************
805 struct ndm_tape_agent {
806 int protocol_version;
809 ndmp9_tape_get_state_reply tape_state;
812 ndmp9_mover_get_state_reply mover_state;
813 u_long mover_window_first_blockno;
814 unsigned long long mover_window_end;
815 unsigned long long mover_want_pos;
816 int mover_notify_pending;
818 int pending_change_after_drain;
819 ndmp9_mover_state pending_mover_state;
820 ndmp9_mover_halt_reason pending_mover_halt_reason;
821 ndmp9_mover_pause_reason pending_mover_pause_reason;
823 char tape_buffer[NDMOS_CONST_TAPE_REC_MAX];
824 unsigned long tb_blockno;
826 #ifdef NDMOS_MACRO_TAPE_AGENT_ADDITIONS
827 NDMOS_MACRO_TAPE_AGENT_ADDITIONS
828 #endif /* NDMOS_MACRO_DATA_AGENT_ADDITIONS */
831 #define NDMTA_TAPE_IS_WRITABLE(TA) \
832 ( (TA)->tape_state.open_mode == NDMP9_TAPE_RDWR_MODE \
833 || (TA)->tape_state.open_mode == NDMP9_TAPE_RAW_MODE)
835 extern int ndmta_initialize (struct ndm_session *sess);
836 extern int ndmta_commission (struct ndm_session *sess);
837 extern int ndmta_decommission (struct ndm_session *sess);
838 extern int ndmta_init_mover_state (struct ndm_session *sess);
840 extern void ndmta_mover_sync_state (struct ndm_session *sess);
841 ndmp9_error ndmta_mover_listen (struct ndm_session *sess,
842 ndmp9_mover_mode mover_mode);
843 ndmp9_error ndmta_mover_connect (struct ndm_session *sess,
844 ndmp9_mover_mode mover_mode);
845 extern void ndmta_mover_halt (struct ndm_session *sess,
846 ndmp9_mover_halt_reason reason);
847 extern void ndmta_mover_pause (struct ndm_session *sess,
848 ndmp9_mover_pause_reason reason);
849 extern void ndmta_mover_active (struct ndm_session *sess);
850 extern void ndmta_mover_start_active (struct ndm_session *sess);
851 extern void ndmta_mover_stop (struct ndm_session *sess);
852 extern void ndmta_mover_abort (struct ndm_session *sess);
853 extern void ndmta_mover_continue (struct ndm_session *sess);
854 extern void ndmta_mover_close (struct ndm_session *sess);
855 extern void ndmta_mover_read (struct ndm_session *sess,
856 unsigned long long offset,
857 unsigned long long length);
859 extern int ndmta_quantum (struct ndm_session *sess);
860 extern int ndmta_read_quantum (struct ndm_session *sess);
861 extern int ndmta_write_quantum (struct ndm_session *sess);
862 extern void ndmta_mover_send_notice (struct ndm_session *sess);
864 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
869 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT
872 ****************************************************************
875 struct ndm_robot_agent {
876 int protocol_version;
878 ndmp9_scsi_get_state_reply scsi_state;
880 #ifdef NDMOS_MACRO_ROBOT_AGENT_ADDITIONS
881 NDMOS_MACRO_ROBOT_AGENT_ADDITIONS
882 #endif /* NDMOS_MACRO_ROBOT_AGENT_ADDITIONS */
885 extern int ndmra_initialize (struct ndm_session *sess);
886 extern int ndmra_commission (struct ndm_session *sess);
887 extern int ndmra_decommission (struct ndm_session *sess);
889 /* all semantic operations are done directly to the ndmos_scsi layer */
890 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
897 ****************************************************************
900 #ifndef NDM_N_IMAGE_STREAM_BUF
901 #define NDM_N_IMAGE_STREAM_BUF (100*1024)
904 enum ndmis_connect_status {
908 NDMIS_CONN_CONNECTED,
909 NDMIS_CONN_DISCONNECTED,
915 typedef enum ndmis_connect_status ndmis_connect_status;
917 struct ndmis_end_point {
919 ndmis_connect_status connect_status;
921 ndmp9_addr_type addr_type;
924 struct ndmis_remote {
925 ndmis_connect_status connect_status;
927 ndmp9_addr local_addr;
928 ndmp9_addr peer_addr;
929 ndmp9_addr listen_addr;
930 struct ndmchan listen_chan;
931 struct ndmchan sanity_chan;
934 struct ndm_image_stream {
935 struct ndmis_end_point data_ep;
936 struct ndmis_end_point tape_ep;
938 struct ndmis_remote remote;
943 char buf[NDM_N_IMAGE_STREAM_BUF];
946 extern int ndmis_initialize (struct ndm_session *sess);
947 extern int ndmis_commission (struct ndm_session *sess);
948 extern int ndmis_decommission (struct ndm_session *sess);
949 extern int ndmis_belay (struct ndm_session *sess);
951 extern int ndmis_quantum (struct ndm_session *sess);
953 extern ndmp9_error ndmis_data_listen (struct ndm_session *sess,
954 ndmp9_addr_type addr_type, ndmp9_addr *ret_addr,
956 extern ndmp9_error ndmis_tape_listen (struct ndm_session *sess,
957 ndmp9_addr_type addr_type, ndmp9_addr *ret_addr,
959 extern ndmp9_error ndmis_data_connect (struct ndm_session *sess,
960 ndmp9_addr *addr, char *reason);
961 extern ndmp9_error ndmis_tape_connect (struct ndm_session *sess,
962 ndmp9_addr *addr, char *reason);
964 ndmis_data_start (struct ndm_session *sess, int chan_mode);
966 ndmis_tape_start (struct ndm_session *sess, int chan_mode);
968 ndmis_data_close (struct ndm_session *sess);
970 ndmis_tape_close (struct ndm_session *sess);
973 extern ndmp9_error ndmis_audit_data_listen (struct ndm_session *sess,
974 ndmp9_addr_type addr_type, char *reason);
975 extern ndmp9_error ndmis_audit_tape_listen (struct ndm_session *sess,
976 ndmp9_addr_type addr_type, char *reason);
977 extern ndmp9_error ndmis_audit_data_connect (struct ndm_session *sess,
978 ndmp9_addr_type addr_type, char *reason);
979 extern ndmp9_error ndmis_audit_tape_connect (struct ndm_session *sess,
980 ndmp9_addr_type addr_type, char *reason);
982 extern ndmp9_error ndmis_audit_ep_listen (
983 struct ndm_session *sess,
984 ndmp9_addr_type addr_type,
986 struct ndmis_end_point *mine_ep,
987 struct ndmis_end_point *peer_ep);
989 extern ndmp9_error ndmis_audit_ep_connect (
990 struct ndm_session *sess,
991 ndmp9_addr_type addr_type,
993 struct ndmis_end_point *mine_ep,
994 struct ndmis_end_point *peer_ep);
996 extern ndmp9_error ndmis_ep_listen (
997 struct ndm_session *sess,
998 ndmp9_addr_type addr_type,
999 ndmp9_addr *ret_addr,
1001 struct ndmis_end_point *mine_ep,
1002 struct ndmis_end_point *peer_ep);
1004 extern ndmp9_error ndmis_ep_connect (
1005 struct ndm_session *sess,
1008 struct ndmis_end_point *mine_ep,
1009 struct ndmis_end_point *peer_ep);
1011 extern int ndmis_ep_close (
1012 struct ndm_session *sess,
1013 struct ndmis_end_point *mine_ep,
1014 struct ndmis_end_point *peer_ep);
1016 extern int ndmis_tcp_listen (struct ndm_session *sess,
1017 struct ndmp9_addr *listen_addr);
1018 extern int ndmis_tcp_accept (struct ndm_session *sess);
1019 extern int ndmis_tcp_connect (struct ndm_session *sess,
1020 struct ndmp9_addr *connect_addr);
1021 extern int ndmis_tcp_close (struct ndm_session *sess);
1023 extern int ndmis_tcp_get_local_and_peer_addrs (
1024 struct ndm_session *sess);
1025 extern int ndmis_tcp_green_light (struct ndm_session *sess,
1026 int sock, ndmis_connect_status new_status);
1032 ****************************************************************
1035 struct ndm_plumbing {
1036 struct ndmconn * control;
1037 struct ndmconn * data;
1038 struct ndmconn * tape;
1039 struct ndmconn * robot;
1041 struct ndm_image_stream image_stream;
1049 ****************************************************************
1052 struct ndm_session_param {
1056 char * config_file_name;
1059 struct ndm_session {
1060 #ifndef NDMOS_OPTION_NO_CONTROL_AGENT
1061 struct ndm_control_agent control_acb;
1062 #endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
1063 #ifndef NDMOS_OPTION_NO_DATA_AGENT
1064 struct ndm_data_agent data_acb;
1065 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */
1066 #ifndef NDMOS_OPTION_NO_TAPE_AGENT
1067 struct ndm_tape_agent tape_acb;
1068 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
1069 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT
1070 struct ndm_robot_agent robot_acb;
1071 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
1073 struct ndm_plumbing plumb;
1075 struct ndm_session_param param;
1077 /* scratch pad stuff */
1078 ndmp9_config_info config_info;
1079 char md5_challenge[64]; /* CONNECT_AUTH MD5 */
1081 NDM_FLAG_DECL(conn_open)
1082 NDM_FLAG_DECL(conn_authorized)
1083 NDM_FLAG_DECL(md5_challenge_valid)
1087 #ifdef NDMOS_MACRO_SESSION_ADDITIONS
1088 NDMOS_MACRO_SESSION_ADDITIONS
1089 #endif /* NDMOS_MACRO_SESSION_ADDITIONS */
1093 /* ndma_session.c */
1094 extern int ndma_client_session (struct ndm_session *sess);
1095 extern int ndma_server_session (struct ndm_session *sess,
1097 extern int ndma_daemon_session (struct ndm_session *sess, int port, int is_test_daemon);
1098 extern int ndma_session_quantum (struct ndm_session *sess,
1099 int max_delay_secs);
1100 extern int ndma_session_initialize (struct ndm_session *sess);
1101 extern int ndma_session_commission (struct ndm_session *sess);
1102 extern int ndma_session_decommission (struct ndm_session *sess);
1103 extern gpointer exit_on_stdin_eof_thread(gpointer data G_GNUC_UNUSED);
1108 /* ndma_comm_subr.c */
1109 extern void ndmalogf (struct ndm_session *sess, char *tag,
1110 int level, char *fmt, ...);
1111 extern void ndmalogfv (struct ndm_session *sess, char *tag,
1112 int level, char *fmt, va_list ap);
1118 * Dispatch Version/Reqeust Tables (DVT, DRT)
1119 ****************************************************************
1122 struct ndm_dispatch_request_table {
1123 unsigned short message;
1124 unsigned short flags;
1125 int (*dispatch_request) ( /* "dr" for short */
1126 struct ndm_session *sess,
1127 struct ndmp_xa_buf *xa,
1128 struct ndmconn *ref_conn);
1131 struct ndm_dispatch_version_table {
1132 int protocol_version;
1133 struct ndm_dispatch_request_table * dispatch_request_table;
1136 #define NDM_DRT_FLAG_OK_NOT_CONNECTED 0x0001
1137 #define NDM_DRT_FLAG_OK_NOT_AUTHORIZED 0x0002
1140 /* ndma_comm_dispatch.c */
1141 extern int ndma_dispatch_request (struct ndm_session *sess,
1142 struct ndmp_xa_buf *xa, struct ndmconn *ref_conn);
1143 extern int ndma_dispatch_raise_error (struct ndm_session *sess,
1144 struct ndmp_xa_buf *xa, struct ndmconn *ref_conn,
1145 ndmp9_error error, char *errstr);
1146 extern int ndma_dispatch_conn (struct ndm_session *sess,
1147 struct ndmconn *conn);
1148 extern void ndma_dispatch_ctrl_unexpected (struct ndmconn *conn,
1149 struct ndmp_msg_buf *nmb);
1150 extern int ndmta_local_mover_read (struct ndm_session *sess,
1151 unsigned long long offset,
1152 unsigned long long length);
1153 extern int ndma_call_no_tattle (struct ndmconn *conn,
1154 struct ndmp_xa_buf *xa);
1155 extern int ndma_call (struct ndmconn *conn, struct ndmp_xa_buf *xa);
1156 extern int ndma_send_to_control (struct ndm_session *sess,
1157 struct ndmp_xa_buf *xa,
1158 struct ndmconn *from_conn);
1159 extern int ndma_tattle (struct ndmconn *conn,
1160 struct ndmp_xa_buf *xa, int rc);
1161 extern struct ndm_dispatch_request_table *
1162 ndma_drt_lookup (struct ndm_dispatch_version_table *dvt,
1163 unsigned protocol_version, unsigned message);
1165 #define NDMADR_RAISE(ERROR,ERRSTR) \
1166 return ndma_dispatch_raise_error (sess, xa, ref_conn, ERROR, ERRSTR)
1168 #define NDMADR_RAISE_ILLEGAL_ARGS(ERRSTR) \
1169 NDMADR_RAISE(NDMP9_ILLEGAL_ARGS_ERR, ERRSTR)
1170 #define NDMADR_RAISE_ILLEGAL_STATE(ERRSTR) \
1171 NDMADR_RAISE(NDMP9_ILLEGAL_STATE_ERR, ERRSTR)
1176 #define NDMADR_UNIMPLEMENTED_MESSAGE (-1) /* aka "TODO" */
1177 #define NDMADR_UNSPECIFIED_MESSAGE (-123) /* no such per specs */
1178 #define NDMADR_UNIMPLEMENTED_VERSION (-1234) /* implementation error */
1184 * Operating System Specific
1185 ****************************************************************
1186 * Must be implemented in ndmos_xxx.c
1189 /* from ndma_dispatch_request() in ndma_dispatch.c */
1190 extern int ndmos_dispatch_request (struct ndm_session *sess,
1191 struct ndmp_xa_buf *xa,
1192 struct ndmconn *ref_conn);
1194 /* from ndmadr_connect_client_auth() in ndma_dispatch.c */
1195 extern int ndmos_ok_name_password (struct ndm_session *sess,
1196 char *name, char *pass);
1197 extern int ndmos_get_md5_challenge (struct ndm_session *sess);
1198 extern int ndmos_ok_name_md5_digest (struct ndm_session *sess,
1199 char *name, char digest[16]);
1201 /* from ndmadr_config_get_{host,server}_info() in ndma_dispatch.c */
1202 extern void ndmos_sync_config_info (struct ndm_session *sess);
1204 /* from ndma_image_stream.c and ndma_ctrl_conn.c and others */
1205 extern void ndmos_condition_pipe_fd (struct ndm_session *sess,
1207 extern void ndmos_condition_listen_socket (
1208 struct ndm_session *sess, int sock);
1209 extern void ndmos_condition_control_socket (
1210 struct ndm_session *sess, int sock);
1211 extern void ndmos_condition_image_stream_socket (
1212 struct ndm_session *sess, int sock);
1214 #ifndef NDMOS_OPTION_NO_TAPE_AGENT
1215 extern int ndmos_tape_initialize (struct ndm_session *sess);
1216 extern ndmp9_error ndmos_tape_open (struct ndm_session *sess,
1217 char *drive_name, int will_write);
1218 extern ndmp9_error ndmos_tape_close (struct ndm_session *sess);
1219 extern void ndmos_tape_sync_state (struct ndm_session *sess);
1220 extern ndmp9_error ndmos_tape_mtio (struct ndm_session *sess,
1221 ndmp9_tape_mtio_op op,
1222 u_long count, u_long *resid);
1223 extern ndmp9_error ndmos_tape_write (struct ndm_session *sess,
1225 u_long count, u_long *done_count);
1226 extern ndmp9_error ndmos_tape_wfm (struct ndm_session *sess);
1227 extern ndmp9_error ndmos_tape_read (struct ndm_session *sess,
1229 u_long count, u_long *done_count);
1230 extern ndmp9_error ndmos_tape_execute_cdb (struct ndm_session *sess,
1231 ndmp9_execute_cdb_request *request,
1232 ndmp9_execute_cdb_reply *reply);
1233 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
1235 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT
1236 extern int ndmos_scsi_initialize (struct ndm_session *sess);
1237 extern void ndmos_scsi_sync_state (struct ndm_session *sess);
1238 extern void ndmos_scsi_sync_config_info (struct ndm_session *sess);
1239 ndmp9_error ndmos_scsi_open (struct ndm_session *sess, char *name);
1240 ndmp9_error ndmos_scsi_close (struct ndm_session *sess);
1241 ndmp9_error ndmos_scsi_set_target (struct ndm_session *sess);
1242 ndmp9_error ndmos_scsi_reset_device (struct ndm_session *sess);
1243 ndmp9_error ndmos_scsi_reset_bus (struct ndm_session *sess);
1244 ndmp9_error ndmos_scsi_execute_cdb (struct ndm_session *sess,
1245 ndmp9_execute_cdb_request *request,
1246 ndmp9_execute_cdb_reply *reply);
1247 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
1250 /* ndma_noti_calls.c */
1251 #ifndef NDMOS_OPTION_NO_DATA_AGENT
1252 extern int ndma_notify_data_halted (struct ndm_session *sess);
1253 extern int ndma_notify_data_read (struct ndm_session *sess,
1254 unsigned long long offset,
1255 unsigned long long length);
1256 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */
1257 #ifndef NDMOS_OPTION_NO_TAPE_AGENT
1258 extern int ndma_notify_mover_halted (struct ndm_session *sess);
1259 extern int ndma_notify_mover_paused (struct ndm_session *sess);
1260 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
1261 #ifndef NDMOS_EFFECT_NO_SERVER_AGENTS
1262 extern void ndma_send_logmsg (struct ndm_session *sess,
1263 ndmp9_log_type ltype, struct ndmconn *from_conn,
1265 #endif /* !NDMOS_EFFECT_NO_SERVER_AGENTS */