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