xref: /illumos-gate/usr/src/cmd/ndmpd/ndmp/ndmpd.h (revision 9ee94b97c8654689d6a034daec08757fda75d21a)
1 /*
2  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
3  */
4 
5 /*
6  * BSD 3 Clause License
7  *
8  * Copyright (c) 2007, The Storage Networking Industry Association.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 	- Redistributions of source code must retain the above copyright
14  *	  notice, this list of conditions and the following disclaimer.
15  *
16  * 	- Redistributions in binary form must reproduce the above copyright
17  *	  notice, this list of conditions and the following disclaimer in
18  *	  the documentation and/or other materials provided with the
19  *	  distribution.
20  *
21  *	- Neither the name of The Storage Networking Industry Association (SNIA)
22  *	  nor the names of its contributors may be used to endorse or promote
23  *	  products derived from this software without specific prior written
24  *	  permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 /* Copyright (c) 2007, The Storage Networking Industry Association. */
39 /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
40 /* Copyright 2014 Nexenta Systems, Inc.  All rights reserved.  */
41 
42 #ifndef _NDMPD_H
43 #define	_NDMPD_H
44 
45 #include <sys/types.h>
46 #include <libzfs.h>
47 #include <ndmpd_door.h>
48 #include <libndmp.h>
49 #include "ndmpd_common.h"
50 #include "tlm_buffers.h"
51 #include <dirent.h>
52 #include "ndmpd_prop.h"
53 #include "traverse.h"
54 #include <pthread.h>
55 #include <libndmp.h>
56 #include <atomic.h>
57 
58 #define	MAX_RECORD_SIZE (126*512)
59 #define	REMOTE_RECORD_SIZE    (60*KILOBYTE)
60 #define	SCSI_MAX_NAME 32
61 #define	MD5_CHALLENGE_SIZE	64
62 #define	MD5_PASS_LIMIT		32
63 
64 /* Test unit ready */
65 #define	TUR_WAIT	3000000
66 #define	TUR_MAX_TRY	3
67 
68 
69 /* File handler classes */
70 #define	HC_CLIENT	1
71 #define	HC_MOVER	2
72 #define	HC_MODULE	4
73 #define	HC_ALL		0xffffffff
74 
75 #define	IN_ADDR(x) \
76 	(*(struct in_addr *)&x)
77 
78 #define	FS_READONLY(fs)		(hasmntopt(fs, "ro")  ? 1 :  0)
79 
80 typedef void *(*funct_t)(void *);	/* function pointer */
81 
82 #define	HOSTNAMELEN	256
83 
84 #define	VENDOR_NAME	"Sun Microsystems"
85 #define	PRODUCT_NAME	"Solaris 5.11"
86 
87 /*
88  * Calculate array length based on its size and size of
89  * its elements.
90  */
91 #define	ARRAY_LEN(a, t)	(sizeof (a) / sizeof (t))
92 /*
93  * Default maximum permitted sequence number for the token-based backup.
94  */
95 #define	NDMP_MAX_TOKSEQ	9
96 
97 /*
98  * Hard-limit for the sequence number in the token-based backup.
99  * It's one less than the ASCII value of 'A'.  The 'A' letter
100  * can be used as level in the lbr-type backups.
101  */
102 #define	NDMP_TOKSEQ_HLIMIT	('A' - 1)
103 
104 
105 /*
106  * Soft-limit for the sequence number in the token-based backup.
107  */
108 #define	NDMP_TOKSEQ_SLIMIT	(NDMP_TOKSEQ_HLIMIT - 5)
109 
110 
111 /*
112  * Root inode number of dump format in V2.
113  */
114 #define	ROOT_INODE	2
115 
116 /*
117  * NDMP backup image signature
118  */
119 #define	NDMPUTF8MAGIC "NDMPUTF8MAGIC"
120 
121 /*
122  * Supported BU types
123  */
124 #define	NDMP_TAR_TYPE	"tar"
125 #define	NDMP_DUMP_TYPE	"dump"
126 #define	NDMP_ZFS_TYPE	"zfs"
127 
128 /* All 1's binary maximum mover window */
129 #define	MAX_WINDOW_SIZE	0xffffffffffffffffULL
130 
131 #define	NDMP_FREE(cp)	{ free((char *)(cp)); (cp) = NULL; }
132 
133 #define	NDMP_YORN(f)	((f) ? 'Y' : 'N')
134 #define	NDMP_TORF(f)	((f) ? "TRUE" : "FALSE")
135 #define	NDMP_SVAL(cp)	((cp) ? (cp) : "NULL")
136 
137 #define	NDMP_SETENV(env, nm, val) \
138 	{ \
139 		env->name = nm; \
140 		env->value = val; \
141 		env++; \
142 	}
143 
144 #define	NDMP_CL_ADDR_LEN	24
145 #define	NDMP_TCP_ADDR_SIZE	32
146 #define	NDMP_TAPE_DEV_NAME	256
147 
148 typedef struct {
149 	char *bk_path;
150 	int bk_llevel; /* last backup level */
151 	time_t bk_ldate; /* last backup date */
152 	int bk_clevel;	/* current backup level */
153 	time_t bk_cdate; /* current backup date */
154 	int bk_map;
155 	int bk_dirino;
156 	char *bk_dmpnm;
157 	char **bk_exl; /* exlude list */
158 	char **bk_inc; /* include list */
159 } ndmp_backup_params_t;
160 
161 
162 typedef struct {
163 	ulong_t rs_nf;	/* number of files to restore */
164 	char *rs_path;
165 	char *rs_bkpath;
166 	int *rs_restored;
167 	int rs_bm;
168 	int rs_lastidx;
169 } ndmp_restore_params_t;
170 
171 /*
172  * Tar format archiving ops table
173  */
174 extern tm_ops_t tm_tar_ops;
175 
176 /*
177  * IS_LBR_BKTYPE shows if the backup type is one of these
178  * 'F' of 'f': 'Full' backup type.
179  * 'A' of 'a': 'Archive' backup type.
180  * 'I' of 'i': 'Incremental' backup type.
181  * 'D' of 'd': 'Differntial' backup type.
182  */
183 #define	IS_LBR_BKTYPE(t)	(((t) && strchr("FAID", toupper(t))) ? 1 : 0)
184 
185 
186 /*
187  * NLP flags.
188  */
189 #define	NLPF_CHKPNTED_PATH	(1 << 0)
190 #define	NLPF_FH			(1 << 1)
191 #define	NLPF_DIRECT		(1 << 2)
192 #define	NLPF_UPDATE		(1 << 3)
193 #define	NLPF_DUMP		(1 << 4)
194 #define	NLPF_TAR		(1 << 5)
195 #define	NLPF_ABORTED		(1 << 6)
196 #define	NLPF_TOKENBK		(1 << 8)
197 #define	NLPF_LBRBK		(1 << 9)
198 #define	NLPF_LEVELBK		(1 << 10)
199 #define	NLPF_IGNCTIME		(1 << 11)
200 #define	NLPF_INCLMTIME		(1 << 12)
201 #define	NLPF_RECURSIVE		(1 << 13)
202 
203 /*
204  * Macros on NLP flags.
205  */
206 #define	NLP_ISSET(n, f)	(((n)->nlp_flags & (f)) != 0)
207 #define	NLP_SET(n, f)	(n)->nlp_flags |= (f)
208 #define	NLP_UNSET(n, f)	(n)->nlp_flags &= ~(f)
209 
210 
211 #define	NLP_ISCHKPNTED(n)	NLP_ISSET(n, NLPF_CHKPNTED_PATH)
212 #define	NLP_SHOULD_UPDATE(n)	NLP_ISSET(n, NLPF_UPDATE)
213 #define	NLP_ISDUMP(n)		NLP_ISSET(n, NLPF_DUMP)
214 #define	NLP_ISTAR(n)		NLP_ISSET(n, NLPF_TAR)
215 #define	NLP_IGNCTIME(n)		NLP_ISSET(n, NLPF_IGNCTIME)
216 #define	NLP_INCLMTIME(n)	NLP_ISSET(n, NLPF_INCLMTIME)
217 
218 /*
219  * NDMP statistics
220  */
221 #define	NS_INC(s)	(atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s))
222 #define	NS_DEC(s)	(atomic_dec_32((volatile uint32_t *)&ndstat.ns_##s))
223 #define	NS_ADD(s, d)	(atomic_add_64((volatile uint64_t *)&ndstat.ns_##s, \
224 	(uint64_t)d))
225 #define	NS_UPD(s, t)	{ \
226 	atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s); \
227 	atomic_dec_32((volatile uint32_t *)&ndstat.ns_##t); \
228 	}
229 
230 #define	NLP_READY	1
231 
232 typedef struct ndmp_lbr_params {
233 	struct ndmpd_session *nlp_session;
234 	int nlp_flags;
235 
236 	ndmp_backup_params_t bk_params;
237 	ndmp_restore_params_t rs_params;
238 #define	nlp_backup_path	bk_params.bk_path
239 #define	nlp_llevel	bk_params.bk_llevel
240 #define	nlp_ldate	bk_params.bk_ldate
241 #define	nlp_clevel	bk_params.bk_clevel
242 #define	nlp_tokseq	nlp_clevel
243 #define	nlp_tokdate	nlp_ldate
244 #define	nlp_cdate	bk_params.bk_cdate
245 #define	nlp_bkmap	bk_params.bk_map
246 #define	nlp_bkdirino	bk_params.bk_dirino
247 #define	nlp_dmpnm	bk_params.bk_dmpnm
248 #define	nlp_exl		bk_params.bk_exl
249 #define	nlp_inc		bk_params.bk_inc
250 
251 #define	nlp_nfiles	rs_params.rs_nf
252 #define	nlp_restore_path	rs_params.rs_path
253 #define	nlp_restore_bk_path	rs_params.rs_bkpath
254 #define	nlp_restored	rs_params.rs_restored
255 #define	nlp_rsbm	rs_params.rs_bm
256 #define	nlp_lastidx	rs_params.rs_lastidx
257 
258 	ndmpd_module_params_t *nlp_params;
259 	tlm_job_stats_t *nlp_jstat;
260 	lbr_fhlog_call_backs_t *nlp_logcallbacks;
261 	tlm_commands_t nlp_cmds;
262 	struct {
263 		/*
264 		 * nw: shows the number of threads waiting for a request
265 		 * to be processed.
266 		 * rv: if error occurred when processing a request.
267 		 */
268 		int ev_nw;
269 		int ev_rv;
270 	} nlp_event;
271 	cond_t	nlp_cv;
272 	int	nlp_flag;
273 #define	nlp_nw	nlp_event.ev_nw
274 #define	nlp_rv	nlp_event.ev_rv
275 	u_longlong_t nlp_bytes_total;
276 } ndmp_lbr_params_t;
277 
278 
279 typedef struct mem_ndmp_name_v3 {
280 	char *nm3_opath;
281 	char *nm3_dpath;
282 	char *nm3_newnm;
283 	u_longlong_t nm3_node;
284 	u_longlong_t nm3_fh_info;
285 	ndmp_error nm3_err;
286 } mem_ndmp_name_v3_t;
287 
288 typedef struct ndmpd_file_handler {
289 	int fh_fd;
290 	ulong_t fh_mode;
291 	ulong_t fh_class;
292 	void *fh_cookie;
293 	ndmpd_file_handler_func_t *fh_func;
294 	struct ndmpd_file_handler *fh_next;
295 } ndmpd_file_handler_t;
296 
297 typedef struct ndmpd_session_scsi_desc {
298 	int sd_is_open;
299 	int sd_devid;
300 	boolean_t sd_valid_target_set;
301 	int sd_sid;
302 	int sd_lun;
303 	char sd_adapter_name[SCSI_MAX_NAME];
304 } ndmpd_session_scsi_desc_t;
305 
306 typedef struct ndmpd_session_tape_desc {
307 	int td_fd;			/* tape device file descriptor */
308 	ulong_t td_record_count;	/* number of records written */
309 	ndmp_tape_open_mode td_mode;	/* tape device open mode */
310 	u_longlong_t td_pos;	/* current position on the current tape */
311 	int td_sid;
312 	int td_lun;
313 	char td_adapter_name[SCSI_MAX_NAME];
314 } ndmpd_session_tape_desc_t;
315 
316 typedef struct ndmpd_session_mover_desc {
317 	ndmp_mover_state md_state;	/* current state */
318 	ndmp_mover_mode md_mode;	/* current mode */
319 	ndmp_mover_pause_reason md_pause_reason;	/* current reason */
320 	ndmp_mover_halt_reason md_halt_reason;	/* current reason */
321 	u_longlong_t md_data_written;	/* total written to tape */
322 	u_longlong_t md_seek_position;	/* current seek position */
323 	u_longlong_t md_bytes_left_to_read; /* #bytes to end of seek window */
324 	u_longlong_t md_window_offset;	/* valid data window begin */
325 	u_longlong_t md_window_length;	/* valid data window length */
326 	u_longlong_t md_position;	/* current data stream pos */
327 	boolean_t md_pre_cond;		/* used for precondition checks */
328 	ulong_t md_record_size;	/* tape I/O record size */
329 	ulong_t md_record_num;	/* current record num */
330 	int md_listen_sock;		/* data conn listen socket */
331 	int md_sock;		/* data conn socket */
332 	ulong_t md_r_index;		/* buffer read  index */
333 	ulong_t md_w_index;		/* buffer write index */
334 	char *md_buf;		/* data buffer */
335 	/*
336 	 * V2 fields.
337 	 */
338 	ulong_t md_discard_length;	/* bytes to discard */
339 
340 	/*
341 	 * V3 fields.
342 	 */
343 	ndmp_addr_v3 md_data_addr;
344 	/*
345 	 * V4 fields.
346 	 */
347 	ndmp_addr_v4 md_data_addr_v4;
348 } ndmpd_session_mover_desc_t;
349 
350 
351 typedef struct ndmpd_session_data_module {
352 	void *dm_module_cookie;	/* sent as abort_func param */
353 	module_start_func_t *dm_start_func;	/* start function */
354 	module_abort_func_t *dm_abort_func;	/* abort function */
355 	ndmpd_module_stats dm_stats;	/* statistics buffer */
356 } ndmpd_session_data_module_t;
357 
358 typedef struct ndmpd_session_data_desc {
359 	/*
360 	 * Common fields.
361 	 */
362 	ndmp_data_operation dd_operation;	/* current operation */
363 	boolean_t dd_abort;		/* abort operation flag */
364 	boolean_t dd_io_ready;		/* mover sock read for I/O */
365 	ndmp_pval *dd_env;	/* environment from backup or recover request */
366 	ulong_t dd_env_len;		/* environment length */
367 	ulong_t dd_nlist_len;	/* recover file list length */
368 	int dd_sock;		/* listen and data socket */
369 	u_longlong_t dd_read_offset;	/* data read seek offset */
370 	u_longlong_t dd_read_length;	/* data read length */
371 	u_longlong_t dd_data_size;	/* data size to be backed up */
372 	ndmpd_session_data_module_t dd_module;
373 
374 	ndmp_data_state dd_state;	/* current state */
375 	ndmp_data_halt_reason dd_halt_reason;		/* current reason */
376 	/*
377 	 * V2 fields.
378 	 */
379 	ndmp_name *dd_nlist;	/* recover file list */
380 	ndmp_mover_addr dd_mover;	/* mover address */
381 	/*
382 	 * V3 fields.
383 	 */
384 	mem_ndmp_name_v3_t *dd_nlist_v3;
385 	ndmp_addr_v3 dd_data_addr;
386 	int dd_listen_sock;	/* socket for listening for remote */
387 				/* mover connections */
388 	u_longlong_t dd_bytes_left_to_read;
389 	u_longlong_t dd_position;
390 	u_longlong_t dd_discard_length;
391 	/*
392 	 * V4 fields.
393 	 */
394 	ndmp_addr_v4 dd_data_addr_v4;
395 } ndmpd_session_data_desc_t;
396 
397 typedef struct ndmpd_session_file_history {
398 	ndmp_fh_unix_path *fh_path_entries;
399 	ndmp_fh_unix_dir *fh_dir_entries;
400 	ndmp_fh_unix_node *fh_node_entries;
401 	char *fh_path_name_buf;
402 	char *fh_dir_name_buf;
403 	ulong_t fh_path_index;
404 	ulong_t fh_dir_index;
405 	ulong_t fh_node_index;
406 	ulong_t fh_path_name_buf_index;
407 	ulong_t fh_dir_name_buf_index;
408 } ndmpd_session_file_history_t;
409 
410 typedef struct ndmpd_session_file_history_v3 {
411 	ndmp_file_v3 *fh_files;
412 	ndmp_dir_v3 *fh_dirs;
413 	ndmp_node_v3 *fh_nodes;
414 	ndmp_file_name_v3 *fh_file_names;
415 	ndmp_file_name_v3 *fh_dir_names;
416 	ndmp_file_stat_v3 *fh_file_stats;
417 	ndmp_file_stat_v3 *fh_node_stats;
418 	char *fh_file_name_buf;
419 	char *fh_dir_name_buf;
420 	ulong_t fh_file_index;
421 	ulong_t fh_dir_index;
422 	ulong_t fh_node_index;
423 	ulong_t fh_file_name_buf_index;
424 	ulong_t fh_dir_name_buf_index;
425 } ndmpd_session_file_history_v3_t;
426 
427 /*
428  * zfs-based backup (zfs send/recv)
429  */
430 
431 typedef enum {
432 	NDMPD_ZFS_MAJOR_0,
433 } ndmpd_zfs_major_t;
434 
435 typedef enum {
436 	NDMPD_ZFS_MINOR_0,
437 } ndmpd_zfs_minor_t;
438 
439 typedef enum {
440 	NDMPD_ZFS_PROP_MAJOR_0,
441 } ndmpd_zfs_prop_major_t;
442 
443 typedef enum {
444 	NDMPD_ZFS_PROP_MINOR_0,
445 } ndmpd_zfs_prop_minor_t;
446 
447 #define	NDMPD_ZFS_MAJOR_VERSION NDMPD_ZFS_MAJOR_0
448 #define	NDMPD_ZFS_MINOR_VERSION NDMPD_ZFS_MINOR_0
449 #define	NDMPD_ZFS_PROP_MAJOR_VERSION NDMPD_ZFS_PROP_MAJOR_0
450 #define	NDMPD_ZFS_PROP_MINOR_VERSION NDMPD_ZFS_PROP_MINOR_0
451 
452 #pragma pack(1)
453 typedef struct {
454 	char nzh_magic[14]; /* NDMPUTF8MAGIC\0 */
455 	uint32_t nzh_major; /* major version */
456 	uint32_t nzh_minor; /* minor version */
457 	uint32_t nzh_hdrlen; /* length of hdr in bytes including magic */
458 	/* future extensions */
459 } ndmpd_zfs_header_t;
460 #pragma pack()
461 
462 #define	PIPE_TAPE 0
463 #define	PIPE_ZFS 1
464 
465 #define	NDMPD_ZFS_DMP_NAME_MAX 32
466 
467 typedef struct ndmpd_zfs_args {
468 	zfs_type_t nz_type;			/* type of ZFS dataset */
469 	char nz_dataset[ZFS_MAXNAMELEN];	/* dataset name */
470 	char nz_snapname[ZFS_MAXNAMELEN];	/* snapname (following '@') */
471 	char nz_fromsnap[ZFS_MAXNAMELEN];	/* snap of L-1 bkup */
472 	char nz_snapprop[ZFS_MAXPROPLEN];	/* contents of snap incr prop */
473 	boolean_t nz_ndmpd_snap;		/* ndmpd-generated snap? */
474 
475 	pthread_t nz_sendrecv_thread;		/* thread for send/recv */
476 	pthread_t nz_tape_thread;		/* thread for tape r/w */
477 	int32_t nz_pipe_fd[2];			/* pipe for above 2 threads */
478 	int32_t nz_bufsize;			/* tape r/w buf size */
479 	int64_t nz_window_len;			/* DMA window length */
480 
481 	int nz_level;				/* val of LEVEL env var */
482 	char nz_zfs_mode;			/* val of ZFS_MODE env var */
483 	boolean_t nz_zfs_force;			/* val of ZFS_FORCE env var */
484 	boolean_t nz_update;			/* val of UPDATE env var */
485 	char nz_dmp_name[NDMPD_ZFS_DMP_NAME_MAX]; /* val of DMP_NAME env var */
486 	u_longlong_t nz_zfs_backup_size;	/* used for restore only */
487 
488 	ndmpd_module_params_t nz_params;
489 	ndmp_lbr_params_t *nz_nlp;
490 	libzfs_handle_t *nz_zlibh;		/* session-specific lzfs hdl */
491 	ndmp_context_t nz_nctx;			/* used by plugin */
492 
493 	ndmpd_zfs_header_t nz_tape_header;	/* tape hdr for "zfs" backup */
494 } ndmpd_zfs_args_t;
495 
496 #define	ndmpd_zfs_params (&(ndmpd_zfs_args)->nz_params)
497 
498 typedef struct ndmpd_session {
499 	ndmp_connection_t *ns_connection;	/* NDMP connection to client */
500 	boolean_t ns_eof;		/* connection EOF flag */
501 	ushort_t ns_protocol_version;	/* connection protocol version */
502 	ndmpd_session_scsi_desc_t ns_scsi;
503 	ndmpd_session_tape_desc_t ns_tape;
504 	ndmpd_session_mover_desc_t ns_mover;
505 	ndmpd_session_data_desc_t ns_data;
506 	ndmpd_session_file_history_t ns_fh;
507 	ndmpd_file_handler_t *ns_file_handler_list; /* for I/O multiplexing */
508 	int ns_nref;
509 	ndmp_lbr_params_t *ns_ndmp_lbr_params;
510 	struct ndmpd_zfs_args ns_ndmpd_zfs_args;
511 	ndmpd_backup_type_t ns_butype;
512 	mutex_t ns_lock;
513 
514 	/*
515 	 * NDMP V3
516 	 * Tape, SCSI, mover, data and file handlers will
517 	 * be shared between V2 and V3.
518 	 */
519 	ndmpd_session_file_history_v3_t ns_fh_v3;
520 	unsigned char ns_challenge[MD5_CHALLENGE_SIZE];  /* For MD5 */
521 
522 	/*
523 	 * NDMP V4 related data
524 	 */
525 	boolean_t ns_set_ext_list;
526 
527 	/* handling of hardlink, hardlink queue head */
528 	struct hardlink_q *hardlink_q;
529 } ndmpd_session_t;
530 
531 
532 /*
533  * NDMP request handler functions.
534  */
535 
536 /* Config */
537 ndmp_msg_handler_func_t ndmpd_config_get_host_info_v2;
538 ndmp_msg_handler_func_t ndmpd_config_get_butype_attr_v2;
539 ndmp_msg_handler_func_t ndmpd_config_get_mover_type_v2;
540 ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v2;
541 
542 ndmp_msg_handler_func_t ndmpd_config_get_host_info_v3;
543 ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v3;
544 ndmp_msg_handler_func_t ndmpd_config_get_connection_type_v3;
545 ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v3;
546 ndmp_msg_handler_func_t ndmpd_config_get_fs_info_v3;
547 ndmp_msg_handler_func_t ndmpd_config_get_tape_info_v3;
548 ndmp_msg_handler_func_t ndmpd_config_get_scsi_info_v3;
549 ndmp_msg_handler_func_t ndmpd_config_get_server_info_v3;
550 
551 ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v4;
552 ndmp_msg_handler_func_t ndmpd_config_get_ext_list_v4;
553 ndmp_msg_handler_func_t ndmpd_config_set_ext_list_v4;
554 
555 
556 /* Scsi */
557 ndmp_msg_handler_func_t ndmpd_scsi_open_v2;
558 ndmp_msg_handler_func_t ndmpd_scsi_close_v2;
559 ndmp_msg_handler_func_t ndmpd_scsi_get_state_v2;
560 ndmp_msg_handler_func_t ndmpd_scsi_set_target_v2;
561 ndmp_msg_handler_func_t ndmpd_scsi_reset_device_v2;
562 ndmp_msg_handler_func_t ndmpd_scsi_reset_bus_v2;
563 ndmp_msg_handler_func_t ndmpd_scsi_execute_cdb_v2;
564 
565 ndmp_msg_handler_func_t ndmpd_scsi_open_v3;
566 ndmp_msg_handler_func_t ndmpd_scsi_set_target_v3;
567 
568 
569 /* Tape */
570 ndmp_msg_handler_func_t ndmpd_tape_open_v2;
571 ndmp_msg_handler_func_t ndmpd_tape_close_v2;
572 ndmp_msg_handler_func_t ndmpd_tape_get_state_v2;
573 ndmp_msg_handler_func_t ndmpd_tape_mtio_v2;
574 ndmp_msg_handler_func_t ndmpd_tape_write_v2;
575 ndmp_msg_handler_func_t ndmpd_tape_read_v2;
576 ndmp_msg_handler_func_t ndmpd_tape_execute_cdb_v2;
577 
578 ndmp_msg_handler_func_t ndmpd_tape_open_v3;
579 ndmp_msg_handler_func_t ndmpd_tape_get_state_v3;
580 ndmp_msg_handler_func_t ndmpd_tape_write_v3;
581 ndmp_msg_handler_func_t ndmpd_tape_read_v3;
582 
583 
584 ndmp_msg_handler_func_t ndmpd_tape_close_v4;
585 /* Data */
586 ndmp_msg_handler_func_t ndmpd_data_get_state_v2;
587 ndmp_msg_handler_func_t ndmpd_data_start_backup_v2;
588 ndmp_msg_handler_func_t ndmpd_data_start_recover_v2;
589 ndmp_msg_handler_func_t ndmpd_data_get_env_v2;
590 ndmp_msg_handler_func_t ndmpd_data_stop_v2;
591 ndmp_msg_handler_func_t ndmpd_data_abort_v2;
592 
593 ndmp_msg_handler_func_t ndmpd_data_get_state_v3;
594 ndmp_msg_handler_func_t ndmpd_data_connect_v3;
595 ndmp_msg_handler_func_t ndmpd_data_listen_v3;
596 ndmp_msg_handler_func_t ndmpd_data_stop_v3;
597 ndmp_msg_handler_func_t ndmpd_data_abort_v3;
598 ndmp_msg_handler_func_t ndmpd_data_start_recover_v3;
599 ndmp_msg_handler_func_t ndmpd_data_start_backup_v3;
600 
601 ndmp_msg_handler_func_t ndmpd_data_get_env_v4;
602 ndmp_msg_handler_func_t ndmpd_data_get_state_v4;
603 ndmp_msg_handler_func_t ndmpd_data_connect_v4;
604 ndmp_msg_handler_func_t ndmpd_data_listen_v4;
605 ndmp_msg_handler_func_t ndmpd_data_start_recover_filehist_v4;
606 
607 
608 /* Connect */
609 ndmp_msg_handler_func_t ndmpd_connect_open_v2;
610 ndmp_msg_handler_func_t ndmpd_connect_client_auth_v2;
611 ndmp_msg_handler_func_t ndmpd_connect_server_auth_v2;
612 ndmp_msg_handler_func_t ndmpd_connect_close_v2;
613 
614 ndmp_msg_handler_func_t ndmpd_connect_client_auth_v3;
615 ndmp_msg_handler_func_t ndmpd_connect_close_v3;
616 
617 
618 /* Mover */
619 ndmp_msg_handler_func_t ndmpd_mover_get_state_v2;
620 ndmp_msg_handler_func_t ndmpd_mover_listen_v2;
621 ndmp_msg_handler_func_t ndmpd_mover_continue_v2;
622 ndmp_msg_handler_func_t ndmpd_mover_abort_v2;
623 ndmp_msg_handler_func_t ndmpd_mover_stop_v2;
624 ndmp_msg_handler_func_t ndmpd_mover_set_window_v2;
625 ndmp_msg_handler_func_t ndmpd_mover_read_v2;
626 ndmp_msg_handler_func_t ndmpd_mover_close_v2;
627 ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v2;
628 
629 ndmp_msg_handler_func_t ndmpd_mover_get_state_v3;
630 ndmp_msg_handler_func_t ndmpd_mover_listen_v3;
631 ndmp_msg_handler_func_t ndmpd_mover_continue_v3;
632 ndmp_msg_handler_func_t ndmpd_mover_abort_v3;
633 ndmp_msg_handler_func_t ndmpd_mover_set_window_v3;
634 ndmp_msg_handler_func_t ndmpd_mover_read_v3;
635 ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v3;
636 ndmp_msg_handler_func_t ndmpd_mover_connect_v3;
637 
638 
639 ndmp_msg_handler_func_t ndmpd_mover_get_state_v4;
640 ndmp_msg_handler_func_t ndmpd_mover_listen_v4;
641 ndmp_msg_handler_func_t ndmpd_mover_connect_v4;
642 
643 
644 /*
645  * Backup/recover module API functions.
646  */
647 ndmpd_get_env_func_t ndmpd_api_get_env;
648 ndmpd_add_env_func_t ndmpd_api_add_env;
649 ndmpd_add_env_func_t ndmpd_api_set_env;
650 ndmpd_get_name_func_t ndmpd_api_get_name;
651 ndmpd_dispatch_func_t ndmpd_api_dispatch;
652 ndmpd_done_func_t ndmpd_api_done_v2;
653 
654 
655 ndmpd_write_func_t ndmpd_api_write_v2;
656 ndmpd_file_history_path_func_t ndmpd_api_file_history_path_v2;
657 ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v2;
658 ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v2;
659 ndmpd_read_func_t ndmpd_api_read_v2;
660 ndmpd_seek_func_t ndmpd_api_seek_v2;
661 ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v2;
662 ndmpd_add_file_handler_func_t ndmpd_api_add_file_handler;
663 ndmpd_remove_file_handler_func_t ndmpd_api_remove_file_handler;
664 
665 
666 /*
667  * NDMP V3
668  */
669 ndmpd_done_func_t ndmpd_api_done_v3;
670 ndmpd_write_func_t ndmpd_api_write_v3;
671 ndmpd_read_func_t ndmpd_api_read_v3;
672 ndmpd_seek_func_t ndmpd_api_seek_v3;
673 ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v3;
674 ndmpd_get_name_func_t ndmpd_api_get_name_v3;
675 ndmpd_file_history_path_func_t ndmpd_api_file_history_file_v3;
676 ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v3;
677 ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v3;
678 
679 /*
680  * NDMP V4
681  */
682 ndmpd_log_func_v3_t ndmpd_api_log_v4;
683 ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v4;
684 
685 #ifndef NO_NDMP_API_LOG_PROTOTYPES
686 ndmpd_log_func_t ndmpd_api_log_v2;
687 ndmpd_log_func_v3_t ndmpd_api_log_v3;
688 #endif /* NO_NDMP_API_LOG_PROTOTYPES */
689 
690 typedef void ndmpd_func_t(ndmp_connection_t *, void *);
691 
692 /*
693  * pthread call arg parameters
694  */
695 typedef struct {
696 	int nw_sock;
697 	long nw_ipaddr;
698 	ndmp_con_handler_func_t nw_con_handler_func;
699 } ndmpd_worker_arg_t;
700 
701 typedef struct {
702 	char *br_jname;
703 	ndmp_lbr_params_t *br_nlp;
704 	tlm_commands_t *br_cmds;
705 	pthread_barrier_t br_barrier;
706 } backup_reader_arg_t;
707 
708 typedef struct {
709 	ndmpd_session_t *tr_session;
710 	ndmpd_module_params_t *tr_mod_params;
711 	tlm_commands_t *tr_cmds;
712 } ndmp_tar_reader_arg_t;
713 
714 typedef struct {
715 	ndmpd_session_t *bs_session;
716 	char *bs_jname;
717 	char *bs_path;
718 } ndmp_bkup_size_arg_t;
719 
720 /*
721  * Variables from ndmpd_comm.c
722  */
723 extern int ndmp_ver;
724 extern int ndmp_full_restore_path;
725 extern int ndmp_dar_support;
726 extern int ndmp_port;
727 extern ndmp_stat_t ndstat;
728 
729 extern void ndmpd_main(void);
730 extern void connection_handler(ndmp_connection_t *);
731 extern void ndmpd_audit_backup(ndmp_connection_t *conn, char *path,
732     int dest, char *local_path, int result);
733 extern void ndmpd_audit_restore(ndmp_connection_t *conn,
734     char *path, int dest, char *local_path, int result);
735 extern void ndmpd_audit_connect(ndmp_connection_t *conn,
736     int result);
737 extern void ndmpd_audit_disconnect(ndmp_connection_t *conn);
738 
739 /* Variables from ndmpd_main.c */
740 extern	libzfs_handle_t	*zlibh;
741 extern	mutex_t	zlib_mtx;
742 
743 /*
744  * Utility from ndmpd_connect.c.
745  */
746 extern int ndmp_connect_list_add(ndmp_connection_t *, int *);
747 extern int ndmp_connect_list_del(ndmp_connection_t *);
748 extern int ndmpd_connect_kill_id(int);
749 extern void ndmp_connect_list_get(ndmp_door_ctx_t *);
750 extern void ndmpd_get_devs(ndmp_door_ctx_t *);
751 
752 /*
753  * Utility functions form ndmpd_data.c.
754  */
755 extern void ndmpd_data_cleanup(ndmpd_session_t *);
756 extern int ndmpd_data_init(ndmpd_session_t *);
757 extern char *ndmp_data_get_mover_mode(ndmpd_session_t *);
758 extern void ndmpd_data_error(ndmpd_session_t *, ndmp_data_halt_reason);
759 
760 
761 /*
762  * Utility functions from ndmpd_mover.c.
763  */
764 extern int ndmpd_mover_init(ndmpd_session_t *);
765 extern void ndmpd_mover_cleanup(ndmpd_session_t *);
766 extern ndmp_error ndmpd_mover_connect(ndmpd_session_t *,
767     ndmp_mover_mode);
768 extern void ndmpd_mover_error(ndmpd_session_t *,
769     ndmp_mover_halt_reason);
770 extern int ndmpd_mover_seek(ndmpd_session_t *,
771     u_longlong_t,
772     u_longlong_t);
773 extern int ndmpd_local_write(ndmpd_session_t *,
774     char *,
775     ulong_t);
776 extern int ndmpd_remote_write(ndmpd_session_t *,
777     char *,
778     ulong_t);
779 extern int ndmpd_local_read(ndmpd_session_t *,
780     char *,
781     ulong_t);
782 extern int ndmpd_remote_read(ndmpd_session_t *,
783     char *,
784     ulong_t);
785 
786 extern void ndmpd_mover_shut_down(ndmpd_session_t *);
787 extern void ndmpd_mover_error(ndmpd_session_t *,
788     ndmp_mover_halt_reason);
789 extern int ndmpd_local_write_v3(ndmpd_session_t *,
790     char *,
791     ulong_t);
792 extern int ndmpd_local_read_v3(ndmpd_session_t *,
793     char *,
794     ulong_t);
795 extern int ndmpd_remote_read_v3(ndmpd_session_t *,
796     char *,
797     ulong_t);
798 extern int ndmpd_mover_wait_v3(ndmpd_session_t *);
799 
800 
801 /*
802  * Utility functions from ndmpd_file_history.c
803  */
804 extern void ndmpd_file_history_init(ndmpd_session_t *);
805 extern void ndmpd_file_history_cleanup(ndmpd_session_t *,
806     boolean_t);
807 extern int ndmpd_file_history_path(lbr_fhlog_call_backs_t *,
808     char *,
809     struct stat64 *,
810     u_longlong_t);
811 extern int ndmpd_file_history_dir(lbr_fhlog_call_backs_t *,
812     char *,
813     struct stat64 *);
814 extern int ndmpd_file_history_node(lbr_fhlog_call_backs_t *,
815     char *,
816     char *,
817     struct stat64 *,
818     u_longlong_t);
819 extern int
820 ndmpd_path_restored(lbr_fhlog_call_backs_t *,
821     char *,
822     struct stat64 *,
823     u_longlong_t);
824 extern int ndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t *,
825     char *,
826     struct stat64 *,
827     u_longlong_t);
828 extern int ndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t *,
829     char *,
830     struct stat64 *);
831 extern int ndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t *,
832     char *,
833     char *,
834     struct stat64 *,
835     u_longlong_t);
836 extern int ndmpd_path_restored_v3(lbr_fhlog_call_backs_t *,
837     char *,
838     struct stat64 *,
839     u_longlong_t);
840 
841 extern int ndmp_send_recovery_stat_v3(ndmpd_module_params_t *,
842     ndmp_lbr_params_t *,
843     int,
844     int);
845 
846 
847 /*
848  * Utility functions from ndmpd_dtime.c
849  */
850 extern int ndmpd_put_dumptime(char *, int, time_t);
851 extern int ndmpd_get_dumptime(char *, int *, time_t *);
852 extern int ndmpd_append_dumptime(char *, char *, int, time_t);
853 
854 
855 /*
856  * Global variables from ndmpd_tar3.c
857  */
858 extern char **ndmp_excl_list;
859 
860 
861 /*
862  * Global variables from ndmpd_util.c
863  */
864 extern int ndmp_force_bk_dirs;
865 extern int ndmp_rbs;
866 extern int ndmp_sbs;
867 extern boolean_t ndmp_dump_path_node;
868 extern boolean_t ndmp_tar_path_node;
869 extern boolean_t ndmp_ignore_ctime;
870 extern boolean_t ndmp_include_lmtime;
871 
872 
873 /*
874  * Utility functions from ndmpd_util.c.
875  */
876 extern int ndmpd_select(ndmpd_session_t *,
877     boolean_t,
878     ulong_t);
879 
880 extern ndmp_error ndmpd_save_env(ndmpd_session_t *,
881     ndmp_pval *,
882     ulong_t);
883 
884 extern void ndmpd_free_env(ndmpd_session_t *);
885 extern ndmp_error ndmpd_save_nlist_v2(ndmpd_session_t *,
886     ndmp_name *,
887     ulong_t);
888 
889 extern void ndmpd_free_nlist(ndmpd_session_t *);
890 extern int ndmpd_add_file_handler(ndmpd_session_t *,
891     void *,
892     int,
893     ulong_t,
894     ulong_t,
895     ndmpd_file_handler_func_t *);
896 
897 extern int ndmpd_remove_file_handler(ndmpd_session_t *,
898     int);
899 
900 extern void ndmp_send_reply(ndmp_connection_t *,
901     void *,
902     char *);
903 
904 extern int ndmp_mtioctl(int, int, int);
905 
906 extern u_longlong_t quad_to_long_long(ndmp_u_quad);
907 extern ndmp_u_quad long_long_to_quad(u_longlong_t);
908 
909 extern void ndmp_set_socket_nodelay(int);
910 extern void ndmp_set_socket_snd_buf(int, int);
911 extern void ndmp_set_socket_rcv_buf(int, int);
912 
913 extern long ndmp_buffer_get_size(ndmpd_session_t *);
914 extern int ndmp_lbr_init(ndmpd_session_t *);
915 extern void ndmp_lbr_cleanup(ndmpd_session_t *);
916 
917 extern void nlp_ref_nw(ndmpd_session_t *);
918 extern void nlp_unref_nw(ndmpd_session_t *);
919 extern void nlp_wait_nw(ndmpd_session_t *);
920 extern void nlp_event_nw(ndmpd_session_t *);
921 extern int nlp_event_rv_get(ndmpd_session_t *);
922 extern void nlp_event_rv_set(ndmpd_session_t *, int);
923 extern boolean_t is_buffer_erroneous(tlm_buffer_t *);
924 extern void ndmp_execute_cdb(ndmpd_session_t *,
925     char *,
926     int,
927     int,
928     ndmp_execute_cdb_request *);
929 
930 extern scsi_adapter_t *scsi_get_adapter(int);
931 extern boolean_t is_tape_unit_ready(char *, int);
932 
933 extern int ndmp_open_list_add(ndmp_connection_t *, char *, int, int, int);
934 extern int ndmp_open_list_del(char *, int, int);
935 extern void ndmp_open_list_release(ndmp_connection_t *);
936 
937 extern void ndmp_stop_buffer_worker(ndmpd_session_t *);
938 extern void ndmp_stop_reader_thread(ndmpd_session_t *);
939 extern void ndmp_stop_writer_thread(ndmpd_session_t *);
940 extern void ndmp_free_reader_writer_ipc(ndmpd_session_t *);
941 extern void ndmp_waitfor_op(ndmpd_session_t *);
942 
943 extern char *cctime(time_t *);
944 extern char *ndmp_new_job_name(char *);
945 extern char *ndmpd_mk_temp(char *);
946 extern char *ndmpd_make_bk_dir_path(char *, char *);
947 extern boolean_t ndmp_is_chkpnt_root(char *);
948 extern char **ndmpd_make_exc_list(void);
949 extern void ndmp_sort_nlist_v3(ndmpd_session_t *);
950 extern int ndmp_get_bk_dir_ino(ndmp_lbr_params_t *);
951 extern int ndmp_write_utf8magic(tlm_cmd_t *);
952 extern int ndmp_tar_writer(ndmpd_session_t *,
953     ndmpd_module_params_t *,
954     tlm_commands_t *);
955 extern void ndmp_wait_for_reader(tlm_commands_t *);
956 extern ndmp_error ndmpd_save_nlist_v3(ndmpd_session_t *,
957     ndmp_name_v3 *,
958     ulong_t);
959 extern void ndmpd_free_nlist_v3(ndmpd_session_t *);
960 extern int ndmp_create_socket(ulong_t *, ushort_t *);
961 extern int ndmp_connect_sock_v3(ulong_t, ushort_t);
962 extern void ndmp_copy_addr_v3(ndmp_addr_v3 *, ndmp_addr_v3 *);
963 extern void ndmp_copy_addr_v4(ndmp_addr_v4 *, ndmp_addr_v4 *);
964 extern char *ndmp_addr2str_v3(ndmp_addr_type);
965 extern boolean_t ndmp_valid_v3addr_type(ndmp_addr_type);
966 extern boolean_t ndmp_check_utf8magic(tlm_cmd_t *);
967 extern int ndmp_get_cur_bk_time(ndmp_lbr_params_t *,
968     time_t *, char *);
969 extern char *ndmp_get_relative_path(char *, char *);
970 
971 extern boolean_t ndmp_fhinode;
972 extern void ndmp_load_params(void);
973 extern void randomize(unsigned char *, int);
974 
975 
976 /*
977  * Utility functions from ndmpd_tar3.c.
978  */
979 extern ndmp_error ndmp_restore_get_params_v3(ndmpd_session_t *,
980     ndmpd_module_params_t *);
981 extern ndmp_error ndmp_backup_get_params_v3(ndmpd_session_t *,
982     ndmpd_module_params_t *);
983 
984 /*
985  * door init and fini function from ndmpd_door_serv.c
986  */
987 extern int ndmp_door_init(void);
988 extern void ndmp_door_fini(void);
989 extern boolean_t ndmp_door_check(void);
990 
991 extern int ndmp_get_max_tok_seq(void);
992 extern boolean_t set_debug_level(boolean_t);
993 extern boolean_t get_debug_level(void);
994 
995 extern int get_zfsvolname(char *, int, char *);
996 extern int ndmp_create_snapshot(char *, char *);
997 extern int ndmp_remove_snapshot(char *, char *);
998 extern int ndmpd_mark_inodes_v2(ndmpd_session_t *, ndmp_lbr_params_t *);
999 extern void ndmpd_abort_marking_v2(ndmpd_session_t *);
1000 extern int ndmpd_mark_inodes_v3(ndmpd_session_t *, ndmp_lbr_params_t *);
1001 extern ndmp_lbr_params_t *ndmp_get_nlp(void *);
1002 
1003 module_start_func_t ndmpd_tar_backup_starter;
1004 module_abort_func_t ndmpd_tar_backup_abort;
1005 
1006 module_start_func_t ndmpd_tar_restore_starter;
1007 module_abort_func_t ndmpd_tar_restore_abort;
1008 
1009 module_start_func_t ndmpd_tar_backup_starter_v3;
1010 module_abort_func_t ndmpd_tar_backup_abort_v3;
1011 
1012 module_start_func_t ndmpd_tar_restore_starter_v3;
1013 module_abort_func_t ndmpd_tar_restore_abort_v3;
1014 
1015 extern int ndmp_backup_extract_params(ndmpd_session_t *,
1016     ndmpd_module_params_t *);
1017 extern int ndmp_restore_extract_params(ndmpd_session_t *,
1018     ndmpd_module_params_t *);
1019 extern int ndmp_tar_reader(ndmp_tar_reader_arg_t *);
1020 
1021 extern int tape_open(char *, int);
1022 extern int tape_is_at_bot(ndmpd_session_t *);
1023 extern int tape_is_at_bof(ndmpd_session_t *);
1024 extern void fm_dance(ndmpd_session_t *);
1025 
1026 extern void ndmp_session_ref(ndmpd_session_t *);
1027 extern void ndmp_session_unref(ndmpd_session_t *);
1028 
1029 void ndmpd_get_file_entry_type(int, ndmp_file_type *);
1030 
1031 extern int tcp_accept(int, unsigned int *);
1032 extern int tcp_get_peer(int, unsigned int *, int *);
1033 
1034 extern char *gethostaddr(void);
1035 extern char *get_default_nic_addr(void);
1036 extern int tlm_init(void);
1037 
1038 extern int snapshot_create(char *, char *, boolean_t, boolean_t);
1039 extern int snapshot_destroy(char *, char *, boolean_t, boolean_t, int *);
1040 
1041 extern boolean_t fs_is_chkpntvol(char *);
1042 extern boolean_t fs_is_chkpnt_enabled(char *);
1043 extern boolean_t fs_is_rdonly(char *);
1044 extern boolean_t fs_volexist(char *);
1045 extern boolean_t fs_is_valid_logvol(char *);
1046 extern boolean_t rootfs_dot_or_dotdot(char *);
1047 extern int dp_readdir(DIR *, unsigned long *, char *,
1048     int *, unsigned long *);
1049 
1050 extern void scsi_find_sid_lun();
1051 extern char *sasd_slink_name();
1052 extern int scsi_dev_exists(char *, int, int);
1053 extern int scsi_get_devtype(char *, int, int);
1054 extern struct open_list *ndmp_open_list_find(char *, int, int);
1055 extern int filecopy(char *, char *);
1056 
1057 extern void ndmp_stop_local_reader();
1058 extern void ndmp_stop_remote_reader();
1059 
1060 extern boolean_t match(char *, char *);
1061 extern char *trim_whitespace(char *);
1062 extern int fs_getstat(char *, struct fs_fhandle *, struct stat64 *);
1063 extern int fs_readdir(struct fs_fhandle *, char *, long *,
1064     char *, int *, struct fs_fhandle *, struct stat64 *);
1065 extern int iscreated(ndmp_lbr_params_t *nlp, char *name, tlm_acls_t *tacl,
1066     time_t t);
1067 
1068 extern int sasd_dev_count(void);
1069 extern struct scsi_link *sasd_dev_slink(int);
1070 extern struct sasd_drive *sasd_drive(int);
1071 extern void *ndmp_malloc(size_t size);
1072 
1073 extern ndmp_plugin_t *ndmp_pl;
1074 
1075 #define	NDMP_APILOG(s, t, m, ...) \
1076 { \
1077 	if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV4) \
1078 		(void) ndmpd_api_log_v4(s, t, m, __VA_ARGS__); \
1079 	else if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV3) \
1080 		(void) ndmpd_api_log_v3(s, t, m, __VA_ARGS__); \
1081 	else \
1082 		(void) ndmpd_api_log_v2(s, __VA_ARGS__); \
1083 }
1084 
1085 /*
1086  * Backup path utility functions
1087  */
1088 extern char *get_backup_path_v3(ndmpd_module_params_t *);
1089 extern char *get_backup_path_v2(ndmpd_module_params_t *);
1090 
1091 /*
1092  * Functions for zfs-based backup
1093  */
1094 
1095 module_start_func_t ndmpd_zfs_backup_starter;
1096 module_start_func_t ndmpd_zfs_restore_starter;
1097 module_abort_func_t ndmpd_zfs_abort;
1098 
1099 int ndmpd_zfs_init(ndmpd_session_t *);
1100 void ndmpd_zfs_fini(ndmpd_zfs_args_t *);
1101 
1102 boolean_t ndmpd_zfs_backup_parms_valid(ndmpd_zfs_args_t *);
1103 boolean_t ndmpd_zfs_restore_parms_valid(ndmpd_zfs_args_t *);
1104 
1105 int ndmpd_zfs_pre_backup(ndmpd_zfs_args_t *);
1106 int ndmpd_zfs_pre_restore(ndmpd_zfs_args_t *);
1107 int ndmpd_zfs_post_backup(ndmpd_zfs_args_t *);
1108 int ndmpd_zfs_post_restore(ndmpd_zfs_args_t *);
1109 
1110 void ndmpd_zfs_dma_log(ndmpd_zfs_args_t *, ndmp_log_type, char *, ...);
1111 
1112 #endif /* _NDMPD_H */
1113