Imported Upstream version 3.1.0
[debian/amanda] / ndmp-src / ndmagents.h
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
98 #include "ndmlib.h"
99
100
101
102 /*
103  * VERSION AND RELEASE CONSTANTS -- KEEPER ONLY
104  ****************************************************************
105  *
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.
109  *
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.
116  *
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.
121  */
122 #define NDMJOBLIB_VERSION       1
123 #define NDMJOBLIB_RELEASE       2
124
125
126
127
128 struct ndm_session;             /* forward decl */
129
130
131
132
133 /*
134  * NDM_ENV_TABLE and NDM_NLIST_TABLE
135  ****************************************************************
136  * Used by DATA and CONTROL agents
137  */
138 #ifndef NDM_MAX_ENV
139 #define NDM_MAX_ENV             1024
140 #endif
141 struct ndm_env_table {
142         int                     n_env;
143         ndmp9_pval              env[NDM_MAX_ENV];
144 };
145
146 #ifndef NDM_MAX_NLIST
147 #define NDM_MAX_NLIST           10240
148 #endif
149 struct ndm_nlist_table {
150         int                     n_nlist;
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];
155 };
156
157
158
159
160 #ifndef NDMOS_OPTION_NO_CONTROL_AGENT
161 /*
162  * CONTROL AGENT
163  ****************************************************************
164  */
165
166 #include "smc.h"                /* SCSI Media Changer */
167
168
169 #ifndef NDM_MAX_MEDIA
170 #define NDM_MAX_MEDIA           40
171 #endif
172
173 struct ndm_media_table {
174         int                     n_media;
175         struct ndmmedia         media[NDM_MAX_MEDIA];
176 };
177
178
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')
186
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')
191
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')
201
202 /* daemon operations */
203 #define NDM_JOB_OP_DAEMON 'd'
204 #define NDM_JOB_OP_TEST_DAEMON 'D'
205
206 struct ndm_job_param {
207         int                     operation;      /* NDM_JOB_OP_... */
208         int                     time_limit;     /* command timeout, 0 is off */
209
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_... */
216
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) */
225
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 */
239
240         struct ndm_media_table  media_tab;      /* media to use, params */
241         struct ndm_media_table  result_media_tab; /* results after job */
242
243         unsigned long           n_file_entry;
244         unsigned long           n_dir_entry;
245         unsigned long           n_node_entry;
246         unsigned long long      root_node;
247 };
248
249 /* ndma_job.c */
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);
255
256
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)
263
264         /* DATA agent */
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;
274
275         /* Image stream */
276         ndmp9_addr              mover_addr;
277         ndmp9_mover_mode        mover_mode;
278
279         /* TAPE Agent */
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;
284
285         ndmp9_tape_open_mode    tape_mode;
286         ndmp9_tape_get_state_reply tape_state;
287
288         /* Media management, media_table inside of job */
289         int                     cur_media_ix;
290         NDM_FLAG_DECL(media_is_loaded)
291         NDM_FLAG_DECL(is_label_op)
292
293         /* ROBOT Agent */
294         struct smc_ctrl_block   smc_cb;
295         unsigned                drive_addr;
296
297         /* when testing */
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 */
301
302         char *                  test_phase;             /* name of sub-series test phase */
303         int                     test_step;              /* test sequence number */
304
305         int                     n_step_pass;            /* per phase test stats */
306         int                     n_step_fail;
307         int                     n_step_warn;
308         int                     n_step_tests;
309
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;
314
315 #ifdef NDMOS_MACRO_CONTROL_AGENT_ADDITIONS
316         NDMOS_MACRO_CONTROL_AGENT_ADDITIONS
317 #endif /* NDMOS_MACRO_CONTROL_AGENT_ADDITIONS */
318 };
319
320
321 /* ndma_control.c */
322 extern int      ndmca_control_agent (struct ndm_session *sess);
323
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,
339                         int max_delay_secs);
340
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);
344
345
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, ...);
364
365
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);
375
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);
381
382
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);
415
416
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,
433                         char labbuf[]);
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);
446
447
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);
466
467
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);
476
477
478
479 /* ndma_ctst_tape.c */
480 extern int      ndmca_op_test_tape (struct ndm_session *sess);
481
482 /* ndma_ctst_mover.c */
483 extern int      ndmca_op_test_mover (struct ndm_session *sess);
484
485 /* ndma_ctst_data.c */
486 extern int      ndmca_op_test_data (struct ndm_session *sess);
487
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,
500                         int rc);
501 extern int      ndmca_test_check_expect_illegal_state (struct ndmconn *conn,
502                         int rc);
503 extern int      ndmca_test_check_expect_illegal_args (struct ndmconn *conn,
504                         int rc);
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,
513                         char *series_name);
514 extern void     ndmca_test_open (struct ndm_session *sess,
515                                  char *test_name,
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);
520
521
522 extern void     ndmca_test_fill_data (char *buf, int bufsize,
523                         int recno, int fileno);
524
525 #endif /* !NDMOS_OPTION_NO_CONTROL_AGENT */
526
527
528
529
530 #ifndef NDMOS_OPTION_NO_DATA_AGENT
531 /*
532  * DATA AGENT
533  ****************************************************************
534  *
535  * NDMP Elements of Data Agent (backup)
536  *
537  *  +-----------+stderr
538  *  | bu_type   |--------formatter_err---------NDMP_LOG-------> to CONTROL
539  *  | formatter |
540  *  | process   |========formatter_data=+=====================> to image stream
541  *  +-----------+stdout                 |
542  *                                  +-------+
543  *                                  | snoop |--NDMP_FH_ADD_x--> to CONTROL
544  *                                  +-------+
545  *
546  ****************************************************************
547  *
548  * NDMP Elements of Data Agent (recover)
549  *
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
555  *                                | snoop  |
556  *                                +--------+
557  *
558  ****************************************************************
559  *
560  * NDMP Elements of Data Agent (recover filehist)
561  *
562  *                                +--------+
563  *                                | direct |==================< from image str
564  *                                |        |-NOTIFY_DATA_READ-> to CONTROL
565  *                                | snoop  |--NDMP_FH_ADD_x---> to CONTROL
566  *                                +--------+
567  *
568  ****************************************************************
569  */
570
571
572
573 #ifndef NDMDA_N_FMT_IMAGE_BUF
574 #define NDMDA_N_FMT_IMAGE_BUF   (8*1024)
575 #endif
576 #ifndef NDMDA_N_FHH_BUF
577 #define NDMDA_N_FHH_BUF         (8*1024)
578 #endif
579 #ifndef NDMDA_N_FMT_ERROR_BUF
580 #define NDMDA_N_FMT_ERROR_BUF   (8*1024)
581 #endif
582 #ifndef NDMDA_N_FMT_WRAP_BUF
583 #define NDMDA_N_FMT_WRAP_BUF    (4*1024)
584 #endif
585 #ifndef NDMDA_MAX_CMD
586 #define NDMDA_MAX_CMD           (4*1024)
587 #endif
588
589
590
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);
594
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);
600 #endif
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);
604
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);
610 #endif
611
612
613
614
615 struct ndm_data_recovery_interval {
616         ndmp9_u_quad    offset;
617         ndmp9_u_quad    length;
618 };
619
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,
625 };
626
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,
635 };
636
637 enum ndm_data_recovery_acquire_mode {
638         NDMDA_RECO_ACQUIRE_EVERYTHING = 1,
639         NDMDA_RECO_ACQUIRE_SEARCHING,
640         NDMDA_RECO_ACQUIRE_MATCHING,
641 };
642
643 enum ndm_data_recovery_disposition {
644         NDMDA_RECO_DISPOSITION_PASS = 1,
645         NDMDA_RECO_DISPOSITION_DISCARD,
646 };
647
648
649 struct ndm_data_agent {
650         int                     protocol_version;
651
652         char                    bu_type[32];
653         struct ndm_env_table    env_tab;
654         struct ndm_nlist_table  nlist_tab;
655
656         NDM_FLAG_DECL(enable_hist)
657         unsigned long long      pass_resid;
658
659         ndmp9_data_get_state_reply data_state;
660         int                     data_notify_pending;
661
662         struct ndmchan          formatter_image;        /* stdin/out */
663         struct ndmchan          formatter_error;        /* stderr */
664         struct ndmchan          formatter_wrap;         /* fd=3 */
665         int                     formatter_pid;
666
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];
670
671         struct ndmfhheap        fhh;
672         unsigned long           fhh_buf[NDMDA_N_FHH_BUF];
673
674 #ifdef NDMOS_MACRO_DATA_AGENT_ADDITIONS
675         NDMOS_MACRO_DATA_AGENT_ADDITIONS
676 #endif /* NDMOS_MACRO_DATA_AGENT_ADDITIONS */
677 };
678
679
680
681 /* ndma_data.c */
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);
686
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);
690
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);
699
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);
704
705 extern int              ndmda_wrap_in (struct ndm_session *sess,
706                                 char *wrap_line);
707
708 extern void             ndmda_send_logmsg (struct ndm_session *sess,
709                                 char *fmt, ...);
710
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);
715
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,
719                                 char *name);
720
721 extern int              ndmda_interpret_boolean_value (char *value_str,
722                                 int default_value);
723
724 extern void             ndmda_purge_environment (struct ndm_session *sess);
725
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);
732
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,
751                                                 char *why);
752
753 /* ndma_data_fh.c */
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,
762                                 char *name,
763                                 unsigned long long fileno);
764 extern void             ndmda_fh_add_node (struct ndm_session *sess,
765                                 ndmp9_file_stat *filestat);
766
767 extern int              ndmda_fh_prepare (struct ndm_session *sess,
768                                   int vers, int msg, int entry_size,
769                                   unsigned n_item,
770                                   unsigned total_size_of_items);
771 extern void             ndmda_fh_flush (struct ndm_session *sess);
772
773
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,
779                                 struct ndmchan *ch);
780 struct tar_digest_hdr;
781 extern void             ndmda_gtar_fh_add (struct ndm_session *sess,
782                                 struct tar_digest_hdr *tdh);
783
784
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,
792                                 char *word);
793
794 #endif /* !NDMOS_OPTION_NO_DATA_AGENT */
795
796
797
798
799 #ifndef NDMOS_OPTION_NO_TAPE_AGENT
800 /*
801  * TAPE AGENT
802  ****************************************************************
803  */
804
805 struct ndm_tape_agent {
806         int                     protocol_version;
807
808         /* TAPE */
809         ndmp9_tape_get_state_reply tape_state;
810
811         /* MOVER */
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;
817
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;
822
823         char                    tape_buffer[NDMOS_CONST_TAPE_REC_MAX];
824         unsigned long           tb_blockno;
825
826 #ifdef NDMOS_MACRO_TAPE_AGENT_ADDITIONS
827         NDMOS_MACRO_TAPE_AGENT_ADDITIONS
828 #endif /* NDMOS_MACRO_DATA_AGENT_ADDITIONS */
829 };
830
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)
834
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);
839
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);
858
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);
863
864 #endif /* !NDMOS_OPTION_NO_TAPE_AGENT */
865
866
867
868
869 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT
870 /*
871  * ROBOT AGENT
872  ****************************************************************
873  */
874
875 struct ndm_robot_agent {
876         int                     protocol_version;
877
878         ndmp9_scsi_get_state_reply scsi_state;
879
880 #ifdef NDMOS_MACRO_ROBOT_AGENT_ADDITIONS
881         NDMOS_MACRO_ROBOT_AGENT_ADDITIONS
882 #endif /* NDMOS_MACRO_ROBOT_AGENT_ADDITIONS */
883 };
884
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);
888
889 /* all semantic operations are done directly to the ndmos_scsi layer */
890 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
891
892
893
894
895 /*
896  * IMAGE STREAM
897  ****************************************************************
898  */
899
900 #ifndef NDM_N_IMAGE_STREAM_BUF
901 #define NDM_N_IMAGE_STREAM_BUF  (100*1024)
902 #endif
903
904 enum ndmis_connect_status {
905         NDMIS_CONN_IDLE = 0,
906         NDMIS_CONN_LISTEN,
907         NDMIS_CONN_ACCEPTED,
908         NDMIS_CONN_CONNECTED,
909         NDMIS_CONN_DISCONNECTED,
910         NDMIS_CONN_CLOSED,
911         NDMIS_CONN_BOTCHED,
912         NDMIS_CONN_REMOTE,
913         NDMIS_CONN_EXCLUDE,
914 };
915 typedef enum ndmis_connect_status       ndmis_connect_status;
916
917 struct ndmis_end_point {
918         char *                  name;
919         ndmis_connect_status    connect_status;
920         int                     transfer_mode;
921         ndmp9_addr_type         addr_type;
922 };
923
924 struct ndmis_remote {
925         ndmis_connect_status    connect_status;
926         int                     transfer_mode;
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;
932 };
933
934 struct ndm_image_stream {
935         struct ndmis_end_point  data_ep;
936         struct ndmis_end_point  tape_ep;
937
938         struct ndmis_remote     remote;
939
940         /* transfer stuff */
941         int                     transfer_mode;
942         struct ndmchan          chan;
943         char                    buf[NDM_N_IMAGE_STREAM_BUF];
944 };
945
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);
950
951 extern int              ndmis_quantum (struct ndm_session *sess);
952
953 extern ndmp9_error      ndmis_data_listen (struct ndm_session *sess,
954                           ndmp9_addr_type addr_type, ndmp9_addr *ret_addr,
955                           char *reason);
956 extern ndmp9_error      ndmis_tape_listen (struct ndm_session *sess,
957                           ndmp9_addr_type addr_type, ndmp9_addr *ret_addr,
958                           char *reason);
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);
963 extern int
964 ndmis_data_start (struct ndm_session *sess, int chan_mode);
965 extern int
966 ndmis_tape_start (struct ndm_session *sess, int chan_mode);
967 extern int
968 ndmis_data_close (struct ndm_session *sess);
969 extern int
970 ndmis_tape_close (struct ndm_session *sess);
971
972
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);
981
982 extern ndmp9_error      ndmis_audit_ep_listen (
983                           struct ndm_session *sess,
984                           ndmp9_addr_type addr_type,
985                           char *reason,
986                           struct ndmis_end_point *mine_ep,
987                           struct ndmis_end_point *peer_ep);
988
989 extern ndmp9_error      ndmis_audit_ep_connect (
990                           struct ndm_session *sess,
991                           ndmp9_addr_type addr_type,
992                           char *reason,
993                           struct ndmis_end_point *mine_ep,
994                           struct ndmis_end_point *peer_ep);
995
996 extern ndmp9_error      ndmis_ep_listen (
997                           struct ndm_session *sess,
998                           ndmp9_addr_type addr_type,
999                           ndmp9_addr *ret_addr,
1000                           char *reason,
1001                           struct ndmis_end_point *mine_ep,
1002                           struct ndmis_end_point *peer_ep);
1003
1004 extern ndmp9_error      ndmis_ep_connect (
1005                           struct ndm_session *sess,
1006                           ndmp9_addr *addr,
1007                           char *reason,
1008                           struct ndmis_end_point *mine_ep,
1009                           struct ndmis_end_point *peer_ep);
1010
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);
1015
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);
1022
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);
1027
1028
1029
1030 /*
1031  * PLUMBING
1032  ****************************************************************
1033  */
1034
1035 struct ndm_plumbing {
1036         struct ndmconn *        control;
1037         struct ndmconn *        data;
1038         struct ndmconn *        tape;
1039         struct ndmconn *        robot;
1040
1041         struct ndm_image_stream image_stream;
1042 };
1043
1044
1045
1046
1047 /*
1048  * SESSION
1049  ****************************************************************
1050  */
1051
1052 struct ndm_session_param {
1053         struct ndmlog           log;
1054         char *                  log_tag;
1055         int                     log_level;
1056         char *                  config_file_name;
1057 };
1058
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 */
1072
1073         struct ndm_plumbing     plumb;
1074
1075         struct ndm_session_param param;
1076
1077         /* scratch pad stuff */
1078         ndmp9_config_info       config_info;
1079         char                    md5_challenge[64]; /* CONNECT_AUTH MD5 */
1080
1081         NDM_FLAG_DECL(conn_open)
1082         NDM_FLAG_DECL(conn_authorized)
1083         NDM_FLAG_DECL(md5_challenge_valid)
1084
1085         int                     connect_status;
1086
1087 #ifdef NDMOS_MACRO_SESSION_ADDITIONS
1088         NDMOS_MACRO_SESSION_ADDITIONS
1089 #endif /* NDMOS_MACRO_SESSION_ADDITIONS */
1090 };
1091
1092
1093 /* ndma_session.c */
1094 extern int      ndma_client_session (struct ndm_session *sess);
1095 extern int      ndma_server_session (struct ndm_session *sess,
1096                         int control_sock);
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);
1104
1105
1106
1107
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);
1113
1114
1115
1116
1117 /*
1118  * Dispatch Version/Reqeust Tables (DVT, DRT)
1119  ****************************************************************
1120  */
1121
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);
1129 };
1130
1131 struct ndm_dispatch_version_table {
1132         int                                     protocol_version;
1133         struct ndm_dispatch_request_table *     dispatch_request_table;
1134 };
1135
1136 #define NDM_DRT_FLAG_OK_NOT_CONNECTED           0x0001
1137 #define NDM_DRT_FLAG_OK_NOT_AUTHORIZED          0x0002
1138
1139
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);
1164
1165 #define NDMADR_RAISE(ERROR,ERRSTR) \
1166            return ndma_dispatch_raise_error (sess, xa, ref_conn, ERROR, ERRSTR)
1167
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)
1172
1173
1174
1175
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 */
1179
1180
1181
1182
1183 /*
1184  * Operating System Specific
1185  ****************************************************************
1186  * Must be implemented in ndmos_xxx.c
1187  */
1188
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);
1193
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]);
1200
1201 /* from ndmadr_config_get_{host,server}_info() in ndma_dispatch.c */
1202 extern void             ndmos_sync_config_info (struct ndm_session *sess);
1203
1204 /* from ndma_image_stream.c and ndma_ctrl_conn.c and others */
1205 extern void             ndmos_condition_pipe_fd (struct ndm_session *sess,
1206                                 int fd);
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);
1213
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,
1224                                 char *buf,
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,
1228                                 char *buf,
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 */
1234
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 */
1248
1249
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,
1264                         char *fmt, ...);
1265 #endif /* !NDMOS_EFFECT_NO_SERVER_AGENTS */