xref: /titanic_44/usr/src/cmd/ndmpd/ndmp/ndmpd.h (revision 8c4f9701439555b41fbfe7848508f53b52166007)
12654012fSReza Sabdar /*
2*8c4f9701SJanice Chang  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
32654012fSReza Sabdar  */
42654012fSReza Sabdar 
52654012fSReza Sabdar /*
62654012fSReza Sabdar  * BSD 3 Clause License
72654012fSReza Sabdar  *
82654012fSReza Sabdar  * Copyright (c) 2007, The Storage Networking Industry Association.
92654012fSReza Sabdar  *
102654012fSReza Sabdar  * Redistribution and use in source and binary forms, with or without
112654012fSReza Sabdar  * modification, are permitted provided that the following conditions
122654012fSReza Sabdar  * are met:
132654012fSReza Sabdar  * 	- Redistributions of source code must retain the above copyright
142654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer.
152654012fSReza Sabdar  *
162654012fSReza Sabdar  * 	- Redistributions in binary form must reproduce the above copyright
172654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer in
182654012fSReza Sabdar  *	  the documentation and/or other materials provided with the
192654012fSReza Sabdar  *	  distribution.
202654012fSReza Sabdar  *
212654012fSReza Sabdar  *	- Neither the name of The Storage Networking Industry Association (SNIA)
222654012fSReza Sabdar  *	  nor the names of its contributors may be used to endorse or promote
232654012fSReza Sabdar  *	  products derived from this software without specific prior written
242654012fSReza Sabdar  *	  permission.
252654012fSReza Sabdar  *
262654012fSReza Sabdar  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
272654012fSReza Sabdar  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
282654012fSReza Sabdar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
292654012fSReza Sabdar  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
302654012fSReza Sabdar  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
312654012fSReza Sabdar  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
322654012fSReza Sabdar  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
332654012fSReza Sabdar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
342654012fSReza Sabdar  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
352654012fSReza Sabdar  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
362654012fSReza Sabdar  * POSSIBILITY OF SUCH DAMAGE.
372654012fSReza Sabdar  */
382654012fSReza Sabdar /* Copyright (c) 2007, The Storage Networking Industry Association. */
392654012fSReza Sabdar /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
402654012fSReza Sabdar 
412654012fSReza Sabdar #ifndef _NDMPD_H
422654012fSReza Sabdar #define	_NDMPD_H
432654012fSReza Sabdar 
442654012fSReza Sabdar #include <sys/types.h>
452654012fSReza Sabdar #include <libzfs.h>
462654012fSReza Sabdar #include <ndmpd_door.h>
472654012fSReza Sabdar #include <libndmp.h>
482654012fSReza Sabdar #include "ndmpd_common.h"
492654012fSReza Sabdar #include "tlm_buffers.h"
502654012fSReza Sabdar #include <dirent.h>
512654012fSReza Sabdar #include "ndmpd_prop.h"
522654012fSReza Sabdar #include "traverse.h"
532654012fSReza Sabdar #include <pthread.h>
542654012fSReza Sabdar #include <libndmp.h>
552654012fSReza Sabdar #include <atomic.h>
562654012fSReza Sabdar 
572654012fSReza Sabdar #define	MAX_RECORD_SIZE (126*512)
582654012fSReza Sabdar #define	REMOTE_RECORD_SIZE    (60*KILOBYTE)
592654012fSReza Sabdar #define	SCSI_MAX_NAME 32
602654012fSReza Sabdar #define	MD5_CHALLENGE_SIZE	64
612654012fSReza Sabdar #define	MD5_PASS_LIMIT		32
622654012fSReza Sabdar 
632654012fSReza Sabdar /* Test unit ready */
642654012fSReza Sabdar #define	TUR_WAIT	3000000
652654012fSReza Sabdar #define	TUR_MAX_TRY	3
662654012fSReza Sabdar 
672654012fSReza Sabdar 
682654012fSReza Sabdar /* File handler classes */
692654012fSReza Sabdar #define	HC_CLIENT	1
702654012fSReza Sabdar #define	HC_MOVER	2
712654012fSReza Sabdar #define	HC_MODULE	4
722654012fSReza Sabdar #define	HC_ALL		0xffffffff
732654012fSReza Sabdar 
742654012fSReza Sabdar #define	IN_ADDR(x) \
752654012fSReza Sabdar 	(*(struct in_addr *)&x)
762654012fSReza Sabdar 
772654012fSReza Sabdar #define	FS_READONLY(fs)		(hasmntopt(fs, "ro")  ? 1 :  0)
782654012fSReza Sabdar 
792654012fSReza Sabdar typedef void *(*funct_t)(void *);	/* function pointer */
802654012fSReza Sabdar 
812654012fSReza Sabdar #define	HOSTNAMELEN	256
822654012fSReza Sabdar 
832654012fSReza Sabdar #define	VENDOR_NAME	"Sun Microsystems"
842654012fSReza Sabdar #define	PRODUCT_NAME	"Solaris 5.11"
852654012fSReza Sabdar 
862654012fSReza Sabdar /*
872654012fSReza Sabdar  * Calculate array length based on its size and size of
882654012fSReza Sabdar  * its elements.
892654012fSReza Sabdar  */
902654012fSReza Sabdar #define	ARRAY_LEN(a, t)	(sizeof (a) / sizeof (t))
912654012fSReza Sabdar /*
922654012fSReza Sabdar  * Default maximum permitted sequence number for the token-based backup.
932654012fSReza Sabdar  */
942654012fSReza Sabdar #define	NDMP_MAX_TOKSEQ	9
952654012fSReza Sabdar 
962654012fSReza Sabdar /*
972654012fSReza Sabdar  * Hard-limit for the sequence number in the token-based backup.
982654012fSReza Sabdar  * It's one less than the ASCII value of 'A'.  The 'A' letter
992654012fSReza Sabdar  * can be used as level in the lbr-type backups.
1002654012fSReza Sabdar  */
1012654012fSReza Sabdar #define	NDMP_TOKSEQ_HLIMIT	('A' - 1)
1022654012fSReza Sabdar 
1032654012fSReza Sabdar 
1042654012fSReza Sabdar /*
1052654012fSReza Sabdar  * Soft-limit for the sequence number in the token-based backup.
1062654012fSReza Sabdar  */
1072654012fSReza Sabdar #define	NDMP_TOKSEQ_SLIMIT	(NDMP_TOKSEQ_HLIMIT - 5)
1082654012fSReza Sabdar 
1092654012fSReza Sabdar 
1102654012fSReza Sabdar /*
1112654012fSReza Sabdar  * Root inode number of dump format in V2.
1122654012fSReza Sabdar  */
1132654012fSReza Sabdar #define	ROOT_INODE	2
1142654012fSReza Sabdar 
1152654012fSReza Sabdar /*
116*8c4f9701SJanice Chang  * NDMP backup image signature
1172654012fSReza Sabdar  */
1182654012fSReza Sabdar #define	NDMPUTF8MAGIC "NDMPUTF8MAGIC"
1192654012fSReza Sabdar 
1202654012fSReza Sabdar /*
1212654012fSReza Sabdar  * Supported BU types
1222654012fSReza Sabdar  */
1232654012fSReza Sabdar #define	NDMP_TAR_TYPE	"tar"
124*8c4f9701SJanice Chang #define	NDMP_DUMP_TYPE	"dump"
125*8c4f9701SJanice Chang #define	NDMP_ZFS_TYPE	"zfs"
1262654012fSReza Sabdar 
1272654012fSReza Sabdar /* All 1's binary maximum mover window */
1282654012fSReza Sabdar #define	MAX_WINDOW_SIZE	0xffffffffffffffffULL
1292654012fSReza Sabdar 
1302654012fSReza Sabdar #define	NDMP_FREE(cp)	{ free((char *)(cp)); (cp) = NULL; }
1312654012fSReza Sabdar 
1322654012fSReza Sabdar #define	NDMP_YORN(f)	((f) ? 'Y' : 'N')
1332654012fSReza Sabdar #define	NDMP_TORF(f)	((f) ? "TRUE" : "FALSE")
1342654012fSReza Sabdar #define	NDMP_SVAL(cp)	((cp) ? (cp) : "NULL")
1352654012fSReza Sabdar 
1362654012fSReza Sabdar #define	NDMP_SETENV(env, nm, val) \
1372654012fSReza Sabdar 	{ \
1382654012fSReza Sabdar 		env->name = nm; \
1392654012fSReza Sabdar 		env->value = val; \
1402654012fSReza Sabdar 		env++; \
1412654012fSReza Sabdar 	}
1422654012fSReza Sabdar 
1432654012fSReza Sabdar #define	NDMP_CL_ADDR_LEN	24
1442654012fSReza Sabdar #define	NDMP_TCP_ADDR_SIZE	32
1452654012fSReza Sabdar #define	NDMP_TAPE_DEV_NAME	256
1462654012fSReza Sabdar 
1472654012fSReza Sabdar typedef struct {
1482654012fSReza Sabdar 	char *bk_path;
1492654012fSReza Sabdar 	int bk_llevel; /* last backup level */
1502654012fSReza Sabdar 	time_t bk_ldate; /* last backup date */
1512654012fSReza Sabdar 	int bk_clevel;	/* current backup level */
1522654012fSReza Sabdar 	time_t bk_cdate; /* current backup date */
1532654012fSReza Sabdar 	int bk_map;
1542654012fSReza Sabdar 	int bk_dirino;
1552654012fSReza Sabdar 	char *bk_dmpnm;
1562654012fSReza Sabdar 	char **bk_exl; /* exlude list */
1572654012fSReza Sabdar 	char **bk_inc; /* include list */
1582654012fSReza Sabdar } ndmp_backup_params_t;
1592654012fSReza Sabdar 
1602654012fSReza Sabdar 
1612654012fSReza Sabdar typedef struct {
1622654012fSReza Sabdar 	ulong_t rs_nf;	/* number of files to restore */
1632654012fSReza Sabdar 	char *rs_path;
1642654012fSReza Sabdar 	char *rs_bkpath;
1652654012fSReza Sabdar 	int *rs_restored;
1662654012fSReza Sabdar 	int rs_bm;
1672654012fSReza Sabdar 	int rs_lastidx;
1682654012fSReza Sabdar } ndmp_restore_params_t;
1692654012fSReza Sabdar 
1702654012fSReza Sabdar /*
1712654012fSReza Sabdar  * Tar format archiving ops table
1722654012fSReza Sabdar  */
1732654012fSReza Sabdar extern tm_ops_t tm_tar_ops;
1742654012fSReza Sabdar 
1752654012fSReza Sabdar /*
1762654012fSReza Sabdar  * IS_LBR_BKTYPE shows if the backup type is one of these
1772654012fSReza Sabdar  * 'F' of 'f': 'Full' backup type.
1782654012fSReza Sabdar  * 'A' of 'a': 'Archive' backup type.
1792654012fSReza Sabdar  * 'I' of 'i': 'Incremental' backup type.
1802654012fSReza Sabdar  * 'D' of 'd': 'Differntial' backup type.
1812654012fSReza Sabdar  */
1822654012fSReza Sabdar #define	IS_LBR_BKTYPE(t)	(((t) && strchr("FAID", toupper(t))) ? 1 : 0)
1832654012fSReza Sabdar 
1842654012fSReza Sabdar 
1852654012fSReza Sabdar /*
1862654012fSReza Sabdar  * NLP flags.
1872654012fSReza Sabdar  */
1882654012fSReza Sabdar #define	NLPF_CHKPNTED_PATH	(1 << 0)
1892654012fSReza Sabdar #define	NLPF_FH			(1 << 1)
1902654012fSReza Sabdar #define	NLPF_DIRECT		(1 << 2)
1912654012fSReza Sabdar #define	NLPF_UPDATE		(1 << 3)
1922654012fSReza Sabdar #define	NLPF_DUMP		(1 << 4)
1932654012fSReza Sabdar #define	NLPF_TAR		(1 << 5)
1942654012fSReza Sabdar #define	NLPF_ABORTED		(1 << 6)
1952654012fSReza Sabdar #define	NLPF_TOKENBK		(1 << 8)
1962654012fSReza Sabdar #define	NLPF_LBRBK		(1 << 9)
1972654012fSReza Sabdar #define	NLPF_LEVELBK		(1 << 10)
1982654012fSReza Sabdar #define	NLPF_IGNCTIME		(1 << 11)
1992654012fSReza Sabdar #define	NLPF_INCLMTIME		(1 << 12)
2002654012fSReza Sabdar #define	NLPF_RECURSIVE		(1 << 13)
2012654012fSReza Sabdar 
2022654012fSReza Sabdar /*
2032654012fSReza Sabdar  * Macros on NLP flags.
2042654012fSReza Sabdar  */
2052654012fSReza Sabdar #define	NLP_ISSET(n, f)	(((n)->nlp_flags & (f)) != 0)
2062654012fSReza Sabdar #define	NLP_SET(n, f)	(n)->nlp_flags |= (f)
2072654012fSReza Sabdar #define	NLP_UNSET(n, f)	(n)->nlp_flags &= ~(f)
2082654012fSReza Sabdar 
2092654012fSReza Sabdar 
2102654012fSReza Sabdar #define	NLP_ISCHKPNTED(n)	NLP_ISSET(n, NLPF_CHKPNTED_PATH)
2112654012fSReza Sabdar #define	NLP_SHOULD_UPDATE(n)	NLP_ISSET(n, NLPF_UPDATE)
2122654012fSReza Sabdar #define	NLP_ISDUMP(n)		NLP_ISSET(n, NLPF_DUMP)
2132654012fSReza Sabdar #define	NLP_ISTAR(n)		NLP_ISSET(n, NLPF_TAR)
2142654012fSReza Sabdar #define	NLP_IGNCTIME(n)		NLP_ISSET(n, NLPF_IGNCTIME)
2152654012fSReza Sabdar #define	NLP_INCLMTIME(n)	NLP_ISSET(n, NLPF_INCLMTIME)
2162654012fSReza Sabdar 
2172654012fSReza Sabdar /*
2182654012fSReza Sabdar  * NDMP statistics
2192654012fSReza Sabdar  */
2202654012fSReza Sabdar #define	NS_INC(s)	(atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s))
2212654012fSReza Sabdar #define	NS_DEC(s)	(atomic_dec_32((volatile uint32_t *)&ndstat.ns_##s))
2222654012fSReza Sabdar #define	NS_ADD(s, d)	(atomic_add_64((volatile uint64_t *)&ndstat.ns_##s, \
2232654012fSReza Sabdar 	(uint64_t)d))
2242654012fSReza Sabdar #define	NS_UPD(s, t)	{ \
2252654012fSReza Sabdar 	atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s); \
2262654012fSReza Sabdar 	atomic_dec_32((volatile uint32_t *)&ndstat.ns_##t); \
2272654012fSReza Sabdar 	}
2282654012fSReza Sabdar 
2292654012fSReza Sabdar #define	NLP_READY	1
2302654012fSReza Sabdar 
2312654012fSReza Sabdar typedef struct ndmp_lbr_params {
2322654012fSReza Sabdar 	struct ndmpd_session *nlp_session;
2332654012fSReza Sabdar 	int nlp_flags;
2342654012fSReza Sabdar 
2352654012fSReza Sabdar 	ndmp_backup_params_t bk_params;
2362654012fSReza Sabdar 	ndmp_restore_params_t rs_params;
2372654012fSReza Sabdar #define	nlp_backup_path	bk_params.bk_path
2382654012fSReza Sabdar #define	nlp_llevel	bk_params.bk_llevel
2392654012fSReza Sabdar #define	nlp_ldate	bk_params.bk_ldate
2402654012fSReza Sabdar #define	nlp_clevel	bk_params.bk_clevel
2412654012fSReza Sabdar #define	nlp_tokseq	nlp_clevel
2422654012fSReza Sabdar #define	nlp_tokdate	nlp_ldate
2432654012fSReza Sabdar #define	nlp_cdate	bk_params.bk_cdate
2442654012fSReza Sabdar #define	nlp_bkmap	bk_params.bk_map
2452654012fSReza Sabdar #define	nlp_bkdirino	bk_params.bk_dirino
2462654012fSReza Sabdar #define	nlp_dmpnm	bk_params.bk_dmpnm
2472654012fSReza Sabdar #define	nlp_exl		bk_params.bk_exl
2482654012fSReza Sabdar #define	nlp_inc		bk_params.bk_inc
2492654012fSReza Sabdar 
2502654012fSReza Sabdar #define	nlp_nfiles	rs_params.rs_nf
2512654012fSReza Sabdar #define	nlp_restore_path	rs_params.rs_path
2522654012fSReza Sabdar #define	nlp_restore_bk_path	rs_params.rs_bkpath
2532654012fSReza Sabdar #define	nlp_restored	rs_params.rs_restored
2542654012fSReza Sabdar #define	nlp_rsbm	rs_params.rs_bm
2552654012fSReza Sabdar #define	nlp_lastidx	rs_params.rs_lastidx
2562654012fSReza Sabdar 
2572654012fSReza Sabdar 	ndmpd_module_params_t *nlp_params;
2582654012fSReza Sabdar 	tlm_job_stats_t *nlp_jstat;
2592654012fSReza Sabdar 	lbr_fhlog_call_backs_t *nlp_logcallbacks;
2602654012fSReza Sabdar 	tlm_commands_t nlp_cmds;
2612654012fSReza Sabdar 	struct {
2622654012fSReza Sabdar 		/*
2632654012fSReza Sabdar 		 * nw: shows the number of threads waiting for a request
2642654012fSReza Sabdar 		 * to be processed.
2652654012fSReza Sabdar 		 * rv: if error occurred when processing a request.
2662654012fSReza Sabdar 		 */
2672654012fSReza Sabdar 		int ev_nw;
2682654012fSReza Sabdar 		int ev_rv;
2692654012fSReza Sabdar 	} nlp_event;
2702654012fSReza Sabdar 	cond_t	nlp_cv;
2712654012fSReza Sabdar 	int	nlp_flag;
2722654012fSReza Sabdar #define	nlp_nw	nlp_event.ev_nw
2732654012fSReza Sabdar #define	nlp_rv	nlp_event.ev_rv
2742654012fSReza Sabdar 	u_longlong_t nlp_bytes_total;
2752654012fSReza Sabdar } ndmp_lbr_params_t;
2762654012fSReza Sabdar 
2772654012fSReza Sabdar 
2782654012fSReza Sabdar typedef struct mem_ndmp_name_v3 {
2792654012fSReza Sabdar 	char *nm3_opath;
2802654012fSReza Sabdar 	char *nm3_dpath;
2812654012fSReza Sabdar 	char *nm3_newnm;
2822654012fSReza Sabdar 	u_longlong_t nm3_node;
2832654012fSReza Sabdar 	u_longlong_t nm3_fh_info;
2842654012fSReza Sabdar 	ndmp_error nm3_err;
2852654012fSReza Sabdar } mem_ndmp_name_v3_t;
2862654012fSReza Sabdar 
2872654012fSReza Sabdar typedef struct ndmpd_file_handler {
2882654012fSReza Sabdar 	int fh_fd;
2892654012fSReza Sabdar 	ulong_t fh_mode;
2902654012fSReza Sabdar 	ulong_t fh_class;
2912654012fSReza Sabdar 	void *fh_cookie;
2922654012fSReza Sabdar 	ndmpd_file_handler_func_t *fh_func;
2932654012fSReza Sabdar 	struct ndmpd_file_handler *fh_next;
2942654012fSReza Sabdar } ndmpd_file_handler_t;
2952654012fSReza Sabdar 
2962654012fSReza Sabdar typedef struct ndmpd_session_scsi_desc {
2972654012fSReza Sabdar 	int sd_is_open;
2982654012fSReza Sabdar 	int sd_devid;
2992654012fSReza Sabdar 	boolean_t sd_valid_target_set;
3002654012fSReza Sabdar 	int sd_sid;
3012654012fSReza Sabdar 	int sd_lun;
3022654012fSReza Sabdar 	char sd_adapter_name[SCSI_MAX_NAME];
3032654012fSReza Sabdar } ndmpd_session_scsi_desc_t;
3042654012fSReza Sabdar 
3052654012fSReza Sabdar typedef struct ndmpd_session_tape_desc {
3062654012fSReza Sabdar 	int td_fd;			/* tape device file descriptor */
3072654012fSReza Sabdar 	ulong_t td_record_count;	/* number of records written */
3082654012fSReza Sabdar 	ndmp_tape_open_mode td_mode;	/* tape device open mode */
3092654012fSReza Sabdar 	u_longlong_t td_pos;	/* current position on the current tape */
3102654012fSReza Sabdar 	int td_sid;
3112654012fSReza Sabdar 	int td_lun;
3122654012fSReza Sabdar 	char td_adapter_name[SCSI_MAX_NAME];
3132654012fSReza Sabdar 	ulong_t td_eom_seen:1,
3142654012fSReza Sabdar 		td_io_err:1,
3152654012fSReza Sabdar 		td_write:1;
3162654012fSReza Sabdar } ndmpd_session_tape_desc_t;
3172654012fSReza Sabdar 
3182654012fSReza Sabdar typedef struct ndmpd_session_mover_desc {
3192654012fSReza Sabdar 	ndmp_mover_state md_state;	/* current state */
3202654012fSReza Sabdar 	ndmp_mover_mode md_mode;	/* current mode */
3212654012fSReza Sabdar 	ndmp_mover_pause_reason md_pause_reason;	/* current reason */
3222654012fSReza Sabdar 	ndmp_mover_halt_reason md_halt_reason;	/* current reason */
3232654012fSReza Sabdar 	u_longlong_t md_data_written;	/* total written to tape */
3242654012fSReza Sabdar 	u_longlong_t md_seek_position;	/* current seek position */
3252654012fSReza Sabdar 	u_longlong_t md_bytes_left_to_read; /* #bytes to end of seek window */
3262654012fSReza Sabdar 	u_longlong_t md_window_offset;	/* valid data window begin */
3272654012fSReza Sabdar 	u_longlong_t md_window_length;	/* valid data window length */
3282654012fSReza Sabdar 	u_longlong_t md_position;	/* current data stream pos */
3292654012fSReza Sabdar 	boolean_t md_pre_cond;		/* used for precondition checks */
3302654012fSReza Sabdar 	ulong_t md_record_size;	/* tape I/O record size */
3312654012fSReza Sabdar 	ulong_t md_record_num;	/* current record num */
3322654012fSReza Sabdar 	int md_listen_sock;		/* data conn listen socket */
3332654012fSReza Sabdar 	int md_sock;		/* data conn socket */
3342654012fSReza Sabdar 	ulong_t md_r_index;		/* buffer read  index */
3352654012fSReza Sabdar 	ulong_t md_w_index;		/* buffer write index */
3362654012fSReza Sabdar 	char *md_buf;		/* data buffer */
3372654012fSReza Sabdar 	/*
3382654012fSReza Sabdar 	 * V2 fields.
3392654012fSReza Sabdar 	 */
3402654012fSReza Sabdar 	ulong_t md_discard_length;	/* bytes to discard */
3412654012fSReza Sabdar 
3422654012fSReza Sabdar 	/*
3432654012fSReza Sabdar 	 * V3 fields.
3442654012fSReza Sabdar 	 */
3452654012fSReza Sabdar 	ndmp_addr_v3 md_data_addr;
3462654012fSReza Sabdar 	/*
3472654012fSReza Sabdar 	 * V4 fields.
3482654012fSReza Sabdar 	 */
3492654012fSReza Sabdar 	ndmp_addr_v4 md_data_addr_v4;
3502654012fSReza Sabdar } ndmpd_session_mover_desc_t;
3512654012fSReza Sabdar 
3522654012fSReza Sabdar 
3532654012fSReza Sabdar typedef struct ndmpd_session_data_module {
3542654012fSReza Sabdar 	void *dm_module_cookie;	/* sent as abort_func param */
3552654012fSReza Sabdar 	module_start_func_t *dm_start_func;	/* start function */
3562654012fSReza Sabdar 	module_abort_func_t *dm_abort_func;	/* abort function */
3572654012fSReza Sabdar 	ndmpd_module_stats dm_stats;	/* statistics buffer */
3582654012fSReza Sabdar } ndmpd_session_data_module_t;
3592654012fSReza Sabdar 
3602654012fSReza Sabdar typedef struct ndmpd_session_data_desc {
3612654012fSReza Sabdar 	/*
3622654012fSReza Sabdar 	 * Common fields.
3632654012fSReza Sabdar 	 */
3642654012fSReza Sabdar 	ndmp_data_operation dd_operation;	/* current operation */
3652654012fSReza Sabdar 	boolean_t dd_abort;		/* abort operation flag */
3662654012fSReza Sabdar 	boolean_t dd_io_ready;		/* mover sock read for I/O */
3672654012fSReza Sabdar 	ndmp_pval *dd_env;	/* environment from backup or recover request */
3682654012fSReza Sabdar 	ulong_t dd_env_len;		/* environment length */
3692654012fSReza Sabdar 	ulong_t dd_nlist_len;	/* recover file list length */
3702654012fSReza Sabdar 	int dd_sock;		/* listen and data socket */
3712654012fSReza Sabdar 	u_longlong_t dd_read_offset;	/* data read seek offset */
3722654012fSReza Sabdar 	u_longlong_t dd_read_length;	/* data read length */
3732654012fSReza Sabdar 	u_longlong_t dd_data_size;	/* data size to be backed up */
3742654012fSReza Sabdar 	ndmpd_session_data_module_t dd_module;
3752654012fSReza Sabdar 
3762654012fSReza Sabdar 	ndmp_data_state dd_state;	/* current state */
3772654012fSReza Sabdar 	ndmp_data_halt_reason dd_halt_reason;		/* current reason */
3782654012fSReza Sabdar 	/*
3792654012fSReza Sabdar 	 * V2 fields.
3802654012fSReza Sabdar 	 */
3812654012fSReza Sabdar 	ndmp_name *dd_nlist;	/* recover file list */
3822654012fSReza Sabdar 	ndmp_mover_addr dd_mover;	/* mover address */
3832654012fSReza Sabdar 	/*
3842654012fSReza Sabdar 	 * V3 fields.
3852654012fSReza Sabdar 	 */
3862654012fSReza Sabdar 	mem_ndmp_name_v3_t *dd_nlist_v3;
3872654012fSReza Sabdar 	ndmp_addr_v3 dd_data_addr;
3882654012fSReza Sabdar 	int dd_listen_sock;	/* socket for listening for remote */
3892654012fSReza Sabdar 				/* mover connections */
3902654012fSReza Sabdar 	u_longlong_t dd_bytes_left_to_read;
3912654012fSReza Sabdar 	u_longlong_t dd_position;
3922654012fSReza Sabdar 	u_longlong_t dd_discard_length;
3932654012fSReza Sabdar 	/*
3942654012fSReza Sabdar 	 * V4 fields.
3952654012fSReza Sabdar 	 */
3962654012fSReza Sabdar 	ndmp_addr_v4 dd_data_addr_v4;
3972654012fSReza Sabdar } ndmpd_session_data_desc_t;
3982654012fSReza Sabdar 
3992654012fSReza Sabdar typedef struct ndmpd_session_file_history {
4002654012fSReza Sabdar 	ndmp_fh_unix_path *fh_path_entries;
4012654012fSReza Sabdar 	ndmp_fh_unix_dir *fh_dir_entries;
4022654012fSReza Sabdar 	ndmp_fh_unix_node *fh_node_entries;
4032654012fSReza Sabdar 	char *fh_path_name_buf;
4042654012fSReza Sabdar 	char *fh_dir_name_buf;
4052654012fSReza Sabdar 	ulong_t fh_path_index;
4062654012fSReza Sabdar 	ulong_t fh_dir_index;
4072654012fSReza Sabdar 	ulong_t fh_node_index;
4082654012fSReza Sabdar 	ulong_t fh_path_name_buf_index;
4092654012fSReza Sabdar 	ulong_t fh_dir_name_buf_index;
4102654012fSReza Sabdar } ndmpd_session_file_history_t;
4112654012fSReza Sabdar 
4122654012fSReza Sabdar typedef struct ndmpd_session_file_history_v3 {
4132654012fSReza Sabdar 	ndmp_file_v3 *fh_files;
4142654012fSReza Sabdar 	ndmp_dir_v3 *fh_dirs;
4152654012fSReza Sabdar 	ndmp_node_v3 *fh_nodes;
4162654012fSReza Sabdar 	ndmp_file_name_v3 *fh_file_names;
4172654012fSReza Sabdar 	ndmp_file_name_v3 *fh_dir_names;
4182654012fSReza Sabdar 	ndmp_file_stat_v3 *fh_file_stats;
4192654012fSReza Sabdar 	ndmp_file_stat_v3 *fh_node_stats;
4202654012fSReza Sabdar 	char *fh_file_name_buf;
4212654012fSReza Sabdar 	char *fh_dir_name_buf;
4222654012fSReza Sabdar 	ulong_t fh_file_index;
4232654012fSReza Sabdar 	ulong_t fh_dir_index;
4242654012fSReza Sabdar 	ulong_t fh_node_index;
4252654012fSReza Sabdar 	ulong_t fh_file_name_buf_index;
4262654012fSReza Sabdar 	ulong_t fh_dir_name_buf_index;
4272654012fSReza Sabdar } ndmpd_session_file_history_v3_t;
4282654012fSReza Sabdar 
429*8c4f9701SJanice Chang /*
430*8c4f9701SJanice Chang  * zfs-based backup (zfs send/recv)
431*8c4f9701SJanice Chang  */
432*8c4f9701SJanice Chang 
433*8c4f9701SJanice Chang typedef enum {
434*8c4f9701SJanice Chang 	NDMPD_ZFS_MAJOR_0,
435*8c4f9701SJanice Chang } ndmpd_zfs_major_t;
436*8c4f9701SJanice Chang 
437*8c4f9701SJanice Chang typedef enum {
438*8c4f9701SJanice Chang 	NDMPD_ZFS_MINOR_0,
439*8c4f9701SJanice Chang } ndmpd_zfs_minor_t;
440*8c4f9701SJanice Chang 
441*8c4f9701SJanice Chang typedef enum {
442*8c4f9701SJanice Chang 	NDMPD_ZFS_PROP_MAJOR_0,
443*8c4f9701SJanice Chang } ndmpd_zfs_prop_major_t;
444*8c4f9701SJanice Chang 
445*8c4f9701SJanice Chang typedef enum {
446*8c4f9701SJanice Chang 	NDMPD_ZFS_PROP_MINOR_0,
447*8c4f9701SJanice Chang } ndmpd_zfs_prop_minor_t;
448*8c4f9701SJanice Chang 
449*8c4f9701SJanice Chang #define	NDMPD_ZFS_MAJOR_VERSION NDMPD_ZFS_MAJOR_0
450*8c4f9701SJanice Chang #define	NDMPD_ZFS_MINOR_VERSION NDMPD_ZFS_MINOR_0
451*8c4f9701SJanice Chang #define	NDMPD_ZFS_PROP_MAJOR_VERSION NDMPD_ZFS_PROP_MAJOR_0
452*8c4f9701SJanice Chang #define	NDMPD_ZFS_PROP_MINOR_VERSION NDMPD_ZFS_PROP_MINOR_0
453*8c4f9701SJanice Chang 
454*8c4f9701SJanice Chang #pragma pack(1)
455*8c4f9701SJanice Chang typedef struct {
456*8c4f9701SJanice Chang 	char nzh_magic[14]; /* NDMPUTF8MAGIC\0 */
457*8c4f9701SJanice Chang 	uint32_t nzh_major; /* major version */
458*8c4f9701SJanice Chang 	uint32_t nzh_minor; /* minor version */
459*8c4f9701SJanice Chang 	uint32_t nzh_hdrlen; /* length of hdr in bytes including magic */
460*8c4f9701SJanice Chang 	/* future extensions */
461*8c4f9701SJanice Chang } ndmpd_zfs_header_t;
462*8c4f9701SJanice Chang #pragma pack()
463*8c4f9701SJanice Chang 
464*8c4f9701SJanice Chang #define	PIPE_TAPE 0
465*8c4f9701SJanice Chang #define	PIPE_ZFS 1
466*8c4f9701SJanice Chang 
467*8c4f9701SJanice Chang #define	NDMPD_ZFS_DMP_NAME_MAX 32
468*8c4f9701SJanice Chang 
469*8c4f9701SJanice Chang typedef struct ndmpd_zfs_args {
470*8c4f9701SJanice Chang 	zfs_type_t nz_type;			/* type of ZFS dataset */
471*8c4f9701SJanice Chang 	char nz_dataset[ZFS_MAXNAMELEN];	/* dataset name */
472*8c4f9701SJanice Chang 	char nz_snapname[ZFS_MAXNAMELEN];	/* snapname (following '@') */
473*8c4f9701SJanice Chang 	char nz_fromsnap[ZFS_MAXNAMELEN];	/* snap of L-1 bkup */
474*8c4f9701SJanice Chang 	char nz_snapprop[ZFS_MAXPROPLEN];	/* contents of snap incr prop */
475*8c4f9701SJanice Chang 	boolean_t nz_ndmpd_snap;		/* ndmpd-generated snap? */
476*8c4f9701SJanice Chang 
477*8c4f9701SJanice Chang 	pthread_t nz_sendrecv_thread;		/* thread for send/recv */
478*8c4f9701SJanice Chang 	pthread_t nz_tape_thread;		/* thread for tape r/w */
479*8c4f9701SJanice Chang 	int32_t nz_pipe_fd[2];			/* pipe for above 2 threads */
480*8c4f9701SJanice Chang 	int32_t nz_bufsize;			/* tape r/w buf size */
481*8c4f9701SJanice Chang 	int64_t nz_window_len;			/* DMA window length */
482*8c4f9701SJanice Chang 
483*8c4f9701SJanice Chang 	int nz_level;				/* val of LEVEL env var */
484*8c4f9701SJanice Chang 	char nz_zfs_mode;			/* val of ZFS_MODE env var */
485*8c4f9701SJanice Chang 	boolean_t nz_zfs_force;			/* val of ZFS_FORCE env var */
486*8c4f9701SJanice Chang 	boolean_t nz_update;			/* val of UPDATE env var */
487*8c4f9701SJanice Chang 	char nz_dmp_name[NDMPD_ZFS_DMP_NAME_MAX]; /* val of DMP_NAME env var */
488*8c4f9701SJanice Chang 
489*8c4f9701SJanice Chang 	ndmpd_module_params_t nz_params;
490*8c4f9701SJanice Chang 	ndmp_lbr_params_t *nz_nlp;
491*8c4f9701SJanice Chang 	libzfs_handle_t *nz_zlibh;		/* session-specific lzfs hdl */
492*8c4f9701SJanice Chang 	ndmp_context_t nz_nctx;			/* used by plugin */
493*8c4f9701SJanice Chang 
494*8c4f9701SJanice Chang 	ndmpd_zfs_header_t nz_tape_header;	/* tape hdr for "zfs" backup */
495*8c4f9701SJanice Chang } ndmpd_zfs_args_t;
496*8c4f9701SJanice Chang 
497*8c4f9701SJanice Chang #define	ndmpd_zfs_params (&(ndmpd_zfs_args)->nz_params)
498*8c4f9701SJanice Chang 
4992654012fSReza Sabdar typedef struct ndmpd_session {
5002654012fSReza Sabdar 	ndmp_connection_t *ns_connection;	/* NDMP connection to client */
5012654012fSReza Sabdar 	boolean_t ns_eof;		/* connection EOF flag */
5022654012fSReza Sabdar 	ushort_t ns_protocol_version;	/* connection protocol version */
5032654012fSReza Sabdar 	ndmpd_session_scsi_desc_t ns_scsi;
5042654012fSReza Sabdar 	ndmpd_session_tape_desc_t ns_tape;
5052654012fSReza Sabdar 	ndmpd_session_mover_desc_t ns_mover;
5062654012fSReza Sabdar 	ndmpd_session_data_desc_t ns_data;
5072654012fSReza Sabdar 	ndmpd_session_file_history_t ns_fh;
5082654012fSReza Sabdar 	ndmpd_file_handler_t *ns_file_handler_list; /* for I/O multiplexing */
5092654012fSReza Sabdar 	int ns_nref;
5102654012fSReza Sabdar 	ndmp_lbr_params_t *ns_ndmp_lbr_params;
511*8c4f9701SJanice Chang 	struct ndmpd_zfs_args ns_ndmpd_zfs_args;
512*8c4f9701SJanice Chang 	ndmpd_backup_type_t ns_butype;
5132654012fSReza Sabdar 	mutex_t ns_lock;
5142654012fSReza Sabdar 
5152654012fSReza Sabdar 	/*
5162654012fSReza Sabdar 	 * NDMP V3
5172654012fSReza Sabdar 	 * Tape, SCSI, mover, data and file handlers will
5182654012fSReza Sabdar 	 * be shared between V2 and V3.
5192654012fSReza Sabdar 	 */
5202654012fSReza Sabdar 	ndmpd_session_file_history_v3_t ns_fh_v3;
5212654012fSReza Sabdar 	unsigned char ns_challenge[MD5_CHALLENGE_SIZE];  /* For MD5 */
5222654012fSReza Sabdar 
5232654012fSReza Sabdar 	/*
5242654012fSReza Sabdar 	 * NDMP V4 related data
5252654012fSReza Sabdar 	 */
5262654012fSReza Sabdar 	boolean_t ns_set_ext_list;
5272654012fSReza Sabdar 
5282654012fSReza Sabdar 	/* handling of hardlink, hardlink queue head */
5292654012fSReza Sabdar 	struct hardlink_q *hardlink_q;
5302654012fSReza Sabdar } ndmpd_session_t;
5312654012fSReza Sabdar 
5322654012fSReza Sabdar 
5332654012fSReza Sabdar /*
5342654012fSReza Sabdar  * NDMP request handler functions.
5352654012fSReza Sabdar  */
5362654012fSReza Sabdar 
5372654012fSReza Sabdar /* Config */
5382654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_host_info_v2;
5392654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_butype_attr_v2;
5402654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_mover_type_v2;
5412654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v2;
5422654012fSReza Sabdar 
5432654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_host_info_v3;
5442654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v3;
5452654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_connection_type_v3;
5462654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v3;
5472654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_fs_info_v3;
5482654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_tape_info_v3;
5492654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_scsi_info_v3;
5502654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_server_info_v3;
5512654012fSReza Sabdar 
5522654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v4;
5532654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_get_ext_list_v4;
5542654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_config_set_ext_list_v4;
5552654012fSReza Sabdar 
5562654012fSReza Sabdar 
5572654012fSReza Sabdar /* Scsi */
5582654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_open_v2;
5592654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_close_v2;
5602654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_get_state_v2;
5612654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_set_target_v2;
5622654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_reset_device_v2;
5632654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_reset_bus_v2;
5642654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_execute_cdb_v2;
5652654012fSReza Sabdar 
5662654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_open_v3;
5672654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_scsi_set_target_v3;
5682654012fSReza Sabdar 
5692654012fSReza Sabdar 
5702654012fSReza Sabdar /* Tape */
5712654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_open_v2;
5722654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_close_v2;
5732654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_get_state_v2;
5742654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_mtio_v2;
5752654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_write_v2;
5762654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_read_v2;
5772654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_execute_cdb_v2;
5782654012fSReza Sabdar 
5792654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_open_v3;
5802654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_get_state_v3;
5812654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_write_v3;
5822654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_read_v3;
5832654012fSReza Sabdar 
5842654012fSReza Sabdar 
5852654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_tape_close_v4;
5862654012fSReza Sabdar /* Data */
5872654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_get_state_v2;
5882654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_start_backup_v2;
5892654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_start_recover_v2;
5902654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_get_env_v2;
5912654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_stop_v2;
5922654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_abort_v2;
5932654012fSReza Sabdar 
5942654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_get_state_v3;
5952654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_connect_v3;
5962654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_listen_v3;
5972654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_stop_v3;
5982654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_abort_v3;
5992654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_start_recover_v3;
6002654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_start_backup_v3;
6012654012fSReza Sabdar 
6022654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_get_env_v4;
6032654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_get_state_v4;
6042654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_connect_v4;
6052654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_listen_v4;
6062654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_data_start_recover_filehist_v4;
6072654012fSReza Sabdar 
6082654012fSReza Sabdar 
6092654012fSReza Sabdar /* Connect */
6102654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_connect_open_v2;
6112654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_connect_client_auth_v2;
6122654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_connect_server_auth_v2;
6132654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_connect_close_v2;
6142654012fSReza Sabdar 
6152654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_connect_client_auth_v3;
6162654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_connect_close_v3;
6172654012fSReza Sabdar 
6182654012fSReza Sabdar 
6192654012fSReza Sabdar /* Mover */
6202654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_get_state_v2;
6212654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_listen_v2;
6222654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_continue_v2;
6232654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_abort_v2;
6242654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_stop_v2;
6252654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_set_window_v2;
6262654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_read_v2;
6272654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_close_v2;
6282654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v2;
6292654012fSReza Sabdar 
6302654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_get_state_v3;
6312654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_listen_v3;
6322654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_continue_v3;
6332654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_abort_v3;
6342654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_set_window_v3;
6352654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_read_v3;
6362654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v3;
6372654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_connect_v3;
6382654012fSReza Sabdar 
6392654012fSReza Sabdar 
6402654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_get_state_v4;
6412654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_listen_v4;
6422654012fSReza Sabdar ndmp_msg_handler_func_t ndmpd_mover_connect_v4;
6432654012fSReza Sabdar 
6442654012fSReza Sabdar 
6452654012fSReza Sabdar /*
6462654012fSReza Sabdar  * Backup/recover module API functions.
6472654012fSReza Sabdar  */
6482654012fSReza Sabdar ndmpd_get_env_func_t ndmpd_api_get_env;
6492654012fSReza Sabdar ndmpd_add_env_func_t ndmpd_api_add_env;
6502654012fSReza Sabdar ndmpd_add_env_func_t ndmpd_api_set_env;
6512654012fSReza Sabdar ndmpd_get_name_func_t ndmpd_api_get_name;
6522654012fSReza Sabdar ndmpd_dispatch_func_t ndmpd_api_dispatch;
6532654012fSReza Sabdar ndmpd_done_func_t ndmpd_api_done_v2;
6542654012fSReza Sabdar 
6552654012fSReza Sabdar 
6562654012fSReza Sabdar ndmpd_write_func_t ndmpd_api_write_v2;
6572654012fSReza Sabdar ndmpd_file_history_path_func_t ndmpd_api_file_history_path_v2;
6582654012fSReza Sabdar ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v2;
6592654012fSReza Sabdar ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v2;
6602654012fSReza Sabdar ndmpd_read_func_t ndmpd_api_read_v2;
6612654012fSReza Sabdar ndmpd_seek_func_t ndmpd_api_seek_v2;
6622654012fSReza Sabdar ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v2;
6632654012fSReza Sabdar ndmpd_add_file_handler_func_t ndmpd_api_add_file_handler;
6642654012fSReza Sabdar ndmpd_remove_file_handler_func_t ndmpd_api_remove_file_handler;
6652654012fSReza Sabdar 
6662654012fSReza Sabdar 
6672654012fSReza Sabdar /*
6682654012fSReza Sabdar  * NDMP V3
6692654012fSReza Sabdar  */
6702654012fSReza Sabdar ndmpd_done_func_t ndmpd_api_done_v3;
6712654012fSReza Sabdar ndmpd_write_func_t ndmpd_api_write_v3;
6722654012fSReza Sabdar ndmpd_read_func_t ndmpd_api_read_v3;
6732654012fSReza Sabdar ndmpd_seek_func_t ndmpd_api_seek_v3;
6742654012fSReza Sabdar ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v3;
6752654012fSReza Sabdar ndmpd_get_name_func_t ndmpd_api_get_name_v3;
6762654012fSReza Sabdar ndmpd_file_history_path_func_t ndmpd_api_file_history_file_v3;
6772654012fSReza Sabdar ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v3;
6782654012fSReza Sabdar ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v3;
6792654012fSReza Sabdar 
6802654012fSReza Sabdar /*
6812654012fSReza Sabdar  * NDMP V4
6822654012fSReza Sabdar  */
6832654012fSReza Sabdar ndmpd_log_func_v3_t ndmpd_api_log_v4;
6842654012fSReza Sabdar ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v4;
6852654012fSReza Sabdar 
6862654012fSReza Sabdar #ifndef NO_NDMP_API_LOG_PROTOTYPES
6872654012fSReza Sabdar ndmpd_log_func_t ndmpd_api_log_v2;
6882654012fSReza Sabdar ndmpd_log_func_v3_t ndmpd_api_log_v3;
6892654012fSReza Sabdar #endif /* NO_NDMP_API_LOG_PROTOTYPES */
6902654012fSReza Sabdar 
6912654012fSReza Sabdar typedef void ndmpd_func_t(ndmp_connection_t *, void *);
6922654012fSReza Sabdar 
6932654012fSReza Sabdar /*
6942654012fSReza Sabdar  * pthread call arg parameters
6952654012fSReza Sabdar  */
6962654012fSReza Sabdar typedef struct {
6972654012fSReza Sabdar 	int nw_sock;
6982654012fSReza Sabdar 	long nw_ipaddr;
6992654012fSReza Sabdar 	ndmp_con_handler_func_t nw_con_handler_func;
7002654012fSReza Sabdar } ndmpd_worker_arg_t;
7012654012fSReza Sabdar 
7022654012fSReza Sabdar typedef struct {
7032654012fSReza Sabdar 	char *br_jname;
7042654012fSReza Sabdar 	ndmp_lbr_params_t *br_nlp;
7052654012fSReza Sabdar 	tlm_commands_t *br_cmds;
7062654012fSReza Sabdar 	pthread_barrier_t br_barrier;
7072654012fSReza Sabdar } backup_reader_arg_t;
7082654012fSReza Sabdar 
7092654012fSReza Sabdar typedef struct {
7102654012fSReza Sabdar 	ndmpd_session_t *tr_session;
7112654012fSReza Sabdar 	ndmpd_module_params_t *tr_mod_params;
7122654012fSReza Sabdar 	tlm_commands_t *tr_cmds;
7132654012fSReza Sabdar } ndmp_tar_reader_arg_t;
7142654012fSReza Sabdar 
715416eec61SReza Sabdar typedef struct {
716416eec61SReza Sabdar 	ndmpd_session_t *bs_session;
717416eec61SReza Sabdar 	char *bs_jname;
718416eec61SReza Sabdar 	char *bs_path;
719416eec61SReza Sabdar } ndmp_bkup_size_arg_t;
720416eec61SReza Sabdar 
7212654012fSReza Sabdar /*
7222654012fSReza Sabdar  * Variables from ndmpd_comm.c
7232654012fSReza Sabdar  */
7242654012fSReza Sabdar extern int ndmp_ver;
7252654012fSReza Sabdar extern int ndmp_full_restore_path;
7262654012fSReza Sabdar extern int ndmp_dar_support;
7272654012fSReza Sabdar extern int ndmp_port;
7282654012fSReza Sabdar extern ndmp_stat_t ndstat;
7292654012fSReza Sabdar 
7302654012fSReza Sabdar extern void ndmpd_main(void);
7312654012fSReza Sabdar extern void connection_handler(ndmp_connection_t *);
7322654012fSReza Sabdar extern void ndmpd_audit_backup(ndmp_connection_t *conn, char *path,
7332654012fSReza Sabdar     int dest, char *local_path, int result);
7342654012fSReza Sabdar extern void ndmpd_audit_restore(ndmp_connection_t *conn,
7352654012fSReza Sabdar     char *path, int dest, char *local_path, int result);
7362654012fSReza Sabdar extern void ndmpd_audit_connect(ndmp_connection_t *conn,
7372654012fSReza Sabdar     int result);
7382654012fSReza Sabdar extern void ndmpd_audit_disconnect(ndmp_connection_t *conn);
7392654012fSReza Sabdar 
7402654012fSReza Sabdar /* Variables from ndmpd_main.c */
7412654012fSReza Sabdar extern	libzfs_handle_t	*zlibh;
7422654012fSReza Sabdar extern	mutex_t	zlib_mtx;
7432654012fSReza Sabdar 
7442654012fSReza Sabdar /*
7452654012fSReza Sabdar  * Utility from ndmpd_connect.c.
7462654012fSReza Sabdar  */
7472654012fSReza Sabdar extern int ndmp_connect_list_add(ndmp_connection_t *, int *);
7482654012fSReza Sabdar extern int ndmp_connect_list_del(ndmp_connection_t *);
7492654012fSReza Sabdar extern int ndmpd_connect_kill_id(int);
7502654012fSReza Sabdar extern void ndmp_connect_list_get(ndmp_door_ctx_t *);
7512654012fSReza Sabdar extern void ndmpd_get_devs(ndmp_door_ctx_t *);
7522654012fSReza Sabdar 
7532654012fSReza Sabdar /*
7542654012fSReza Sabdar  * Utility functions form ndmpd_data.c.
7552654012fSReza Sabdar  */
7562654012fSReza Sabdar extern void ndmpd_data_cleanup(ndmpd_session_t *);
7572654012fSReza Sabdar extern int ndmpd_data_init(ndmpd_session_t *);
7582654012fSReza Sabdar extern char *ndmp_data_get_mover_mode(ndmpd_session_t *);
7592654012fSReza Sabdar extern void ndmpd_data_error(ndmpd_session_t *, ndmp_data_halt_reason);
7602654012fSReza Sabdar 
7612654012fSReza Sabdar 
7622654012fSReza Sabdar /*
7632654012fSReza Sabdar  * Utility functions from ndmpd_mover.c.
7642654012fSReza Sabdar  */
7652654012fSReza Sabdar extern int ndmpd_mover_init(ndmpd_session_t *);
7662654012fSReza Sabdar extern void ndmpd_mover_cleanup(ndmpd_session_t *);
7672654012fSReza Sabdar extern ndmp_error ndmpd_mover_connect(ndmpd_session_t *,
7682654012fSReza Sabdar     ndmp_mover_mode);
7692654012fSReza Sabdar extern void ndmpd_mover_error(ndmpd_session_t *,
7702654012fSReza Sabdar     ndmp_mover_halt_reason);
7712654012fSReza Sabdar extern int ndmpd_mover_seek(ndmpd_session_t *,
7722654012fSReza Sabdar     u_longlong_t,
7732654012fSReza Sabdar     u_longlong_t);
7742654012fSReza Sabdar extern int ndmpd_local_write(ndmpd_session_t *,
7752654012fSReza Sabdar     char *,
7762654012fSReza Sabdar     ulong_t);
7772654012fSReza Sabdar extern int ndmpd_remote_write(ndmpd_session_t *,
7782654012fSReza Sabdar     char *,
7792654012fSReza Sabdar     ulong_t);
7802654012fSReza Sabdar extern int ndmpd_local_read(ndmpd_session_t *,
7812654012fSReza Sabdar     char *,
7822654012fSReza Sabdar     ulong_t);
7832654012fSReza Sabdar extern int ndmpd_remote_read(ndmpd_session_t *,
7842654012fSReza Sabdar     char *,
7852654012fSReza Sabdar     ulong_t);
7862654012fSReza Sabdar 
7872654012fSReza Sabdar extern void ndmpd_mover_shut_down(ndmpd_session_t *);
7882654012fSReza Sabdar extern void ndmpd_mover_error(ndmpd_session_t *,
7892654012fSReza Sabdar     ndmp_mover_halt_reason);
7902654012fSReza Sabdar extern int ndmpd_local_write_v3(ndmpd_session_t *,
7912654012fSReza Sabdar     char *,
7922654012fSReza Sabdar     ulong_t);
7932654012fSReza Sabdar extern int ndmpd_local_read_v3(ndmpd_session_t *,
7942654012fSReza Sabdar     char *,
7952654012fSReza Sabdar     ulong_t);
7962654012fSReza Sabdar extern int ndmpd_remote_read_v3(ndmpd_session_t *,
7972654012fSReza Sabdar     char *,
7982654012fSReza Sabdar     ulong_t);
7992654012fSReza Sabdar extern int ndmpd_mover_wait_v3(ndmpd_session_t *);
8002654012fSReza Sabdar extern void ndmpd_write_eom(int);
8012654012fSReza Sabdar 
8022654012fSReza Sabdar 
8032654012fSReza Sabdar /*
8042654012fSReza Sabdar  * Utility functions from ndmpd_file_history.c
8052654012fSReza Sabdar  */
8062654012fSReza Sabdar extern void ndmpd_file_history_init(ndmpd_session_t *);
8072654012fSReza Sabdar extern void ndmpd_file_history_cleanup(ndmpd_session_t *,
8082654012fSReza Sabdar     boolean_t);
8092654012fSReza Sabdar extern int ndmpd_file_history_path(lbr_fhlog_call_backs_t *,
8102654012fSReza Sabdar     char *,
8112654012fSReza Sabdar     struct stat64 *,
8122654012fSReza Sabdar     u_longlong_t);
8132654012fSReza Sabdar extern int ndmpd_file_history_dir(lbr_fhlog_call_backs_t *,
8142654012fSReza Sabdar     char *,
8152654012fSReza Sabdar     struct stat64 *);
8162654012fSReza Sabdar extern int ndmpd_file_history_node(lbr_fhlog_call_backs_t *,
8172654012fSReza Sabdar     char *,
8182654012fSReza Sabdar     char *,
8192654012fSReza Sabdar     struct stat64 *,
8202654012fSReza Sabdar     u_longlong_t);
8212654012fSReza Sabdar extern int
8222654012fSReza Sabdar ndmpd_path_restored(lbr_fhlog_call_backs_t *,
8232654012fSReza Sabdar     char *,
8242654012fSReza Sabdar     struct stat64 *,
8252654012fSReza Sabdar     u_longlong_t);
8262654012fSReza Sabdar extern int ndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t *,
8272654012fSReza Sabdar     char *,
8282654012fSReza Sabdar     struct stat64 *,
8292654012fSReza Sabdar     u_longlong_t);
8302654012fSReza Sabdar extern int ndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t *,
8312654012fSReza Sabdar     char *,
8322654012fSReza Sabdar     struct stat64 *);
8332654012fSReza Sabdar extern int ndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t *,
8342654012fSReza Sabdar     char *,
8352654012fSReza Sabdar     char *,
8362654012fSReza Sabdar     struct stat64 *,
8372654012fSReza Sabdar     u_longlong_t);
8382654012fSReza Sabdar extern int ndmpd_path_restored_v3(lbr_fhlog_call_backs_t *,
8392654012fSReza Sabdar     char *,
8402654012fSReza Sabdar     struct stat64 *,
8412654012fSReza Sabdar     u_longlong_t);
8422654012fSReza Sabdar 
8432654012fSReza Sabdar extern int ndmp_send_recovery_stat_v3(ndmpd_module_params_t *,
8442654012fSReza Sabdar     ndmp_lbr_params_t *,
8452654012fSReza Sabdar     int,
8462654012fSReza Sabdar     int);
8472654012fSReza Sabdar 
8482654012fSReza Sabdar 
8492654012fSReza Sabdar /*
8502654012fSReza Sabdar  * Utility functions from ndmpd_dtime.c
8512654012fSReza Sabdar  */
8522654012fSReza Sabdar extern int ndmpd_put_dumptime(char *, int, time_t);
8532654012fSReza Sabdar extern int ndmpd_get_dumptime(char *, int *, time_t *);
8542654012fSReza Sabdar extern int ndmpd_append_dumptime(char *, char *, int, time_t);
8552654012fSReza Sabdar 
8562654012fSReza Sabdar 
8572654012fSReza Sabdar /*
8582654012fSReza Sabdar  * Global variables from ndmpd_tar3.c
8592654012fSReza Sabdar  */
8602654012fSReza Sabdar extern char **ndmp_excl_list;
8612654012fSReza Sabdar 
8622654012fSReza Sabdar 
8632654012fSReza Sabdar /*
8642654012fSReza Sabdar  * Global variables from ndmpd_util.c
8652654012fSReza Sabdar  */
8662654012fSReza Sabdar extern int ndmp_force_bk_dirs;
8672654012fSReza Sabdar extern int ndmp_rbs;
8682654012fSReza Sabdar extern int ndmp_sbs;
8692654012fSReza Sabdar extern boolean_t ndmp_dump_path_node;
8702654012fSReza Sabdar extern boolean_t ndmp_tar_path_node;
8712654012fSReza Sabdar extern boolean_t ndmp_ignore_ctime;
8722654012fSReza Sabdar extern boolean_t ndmp_include_lmtime;
8732654012fSReza Sabdar 
8742654012fSReza Sabdar 
8752654012fSReza Sabdar /*
8762654012fSReza Sabdar  * Utility functions from ndmpd_util.c.
8772654012fSReza Sabdar  */
8782654012fSReza Sabdar extern int ndmpd_select(ndmpd_session_t *,
8792654012fSReza Sabdar     boolean_t,
8802654012fSReza Sabdar     ulong_t);
8812654012fSReza Sabdar 
8822654012fSReza Sabdar extern ndmp_error ndmpd_save_env(ndmpd_session_t *,
8832654012fSReza Sabdar     ndmp_pval *,
8842654012fSReza Sabdar     ulong_t);
8852654012fSReza Sabdar 
8862654012fSReza Sabdar extern void ndmpd_free_env(ndmpd_session_t *);
8872654012fSReza Sabdar extern ndmp_error ndmpd_save_nlist_v2(ndmpd_session_t *,
8882654012fSReza Sabdar     ndmp_name *,
8892654012fSReza Sabdar     ulong_t);
8902654012fSReza Sabdar 
8912654012fSReza Sabdar extern void ndmpd_free_nlist(ndmpd_session_t *);
8922654012fSReza Sabdar extern int ndmpd_add_file_handler(ndmpd_session_t *,
8932654012fSReza Sabdar     void *,
8942654012fSReza Sabdar     int,
8952654012fSReza Sabdar     ulong_t,
8962654012fSReza Sabdar     ulong_t,
8972654012fSReza Sabdar     ndmpd_file_handler_func_t *);
8982654012fSReza Sabdar 
8992654012fSReza Sabdar extern int ndmpd_remove_file_handler(ndmpd_session_t *,
9002654012fSReza Sabdar     int);
9012654012fSReza Sabdar 
9022654012fSReza Sabdar extern void ndmp_send_reply(ndmp_connection_t *,
9032654012fSReza Sabdar     void *,
9042654012fSReza Sabdar     char *);
9052654012fSReza Sabdar 
9062654012fSReza Sabdar extern int ndmp_mtioctl(int, int, int);
9072654012fSReza Sabdar 
9082654012fSReza Sabdar extern u_longlong_t quad_to_long_long(ndmp_u_quad);
9092654012fSReza Sabdar extern ndmp_u_quad long_long_to_quad(u_longlong_t);
9102654012fSReza Sabdar 
9112654012fSReza Sabdar extern void ndmp_set_socket_nodelay(int);
9122654012fSReza Sabdar extern void ndmp_set_socket_snd_buf(int, int);
9132654012fSReza Sabdar extern void ndmp_set_socket_rcv_buf(int, int);
9142654012fSReza Sabdar 
9152654012fSReza Sabdar extern long ndmp_buffer_get_size(ndmpd_session_t *);
9162654012fSReza Sabdar extern int ndmp_lbr_init(ndmpd_session_t *);
9172654012fSReza Sabdar extern void ndmp_lbr_cleanup(ndmpd_session_t *);
9182654012fSReza Sabdar 
9192654012fSReza Sabdar extern void nlp_ref_nw(ndmpd_session_t *);
9202654012fSReza Sabdar extern void nlp_unref_nw(ndmpd_session_t *);
9212654012fSReza Sabdar extern void nlp_wait_nw(ndmpd_session_t *);
9222654012fSReza Sabdar extern void nlp_event_nw(ndmpd_session_t *);
9232654012fSReza Sabdar extern int nlp_event_rv_get(ndmpd_session_t *);
9242654012fSReza Sabdar extern void nlp_event_rv_set(ndmpd_session_t *, int);
9252654012fSReza Sabdar extern boolean_t is_buffer_erroneous(tlm_buffer_t *);
9262654012fSReza Sabdar extern void ndmp_execute_cdb(ndmpd_session_t *,
9272654012fSReza Sabdar     char *,
9282654012fSReza Sabdar     int,
9292654012fSReza Sabdar     int,
9302654012fSReza Sabdar     ndmp_execute_cdb_request *);
9312654012fSReza Sabdar 
9322654012fSReza Sabdar extern scsi_adapter_t *scsi_get_adapter(int);
9332654012fSReza Sabdar extern boolean_t is_tape_unit_ready(char *, int);
9342654012fSReza Sabdar 
9352654012fSReza Sabdar extern int ndmp_open_list_add(ndmp_connection_t *, char *, int, int, int);
9362654012fSReza Sabdar extern int ndmp_open_list_del(char *, int, int);
9372654012fSReza Sabdar extern void ndmp_open_list_release(ndmp_connection_t *);
9382654012fSReza Sabdar 
9392654012fSReza Sabdar extern void ndmp_stop_buffer_worker(ndmpd_session_t *);
9402654012fSReza Sabdar extern void ndmp_stop_reader_thread(ndmpd_session_t *);
9412654012fSReza Sabdar extern void ndmp_stop_writer_thread(ndmpd_session_t *);
9422654012fSReza Sabdar extern void ndmp_free_reader_writer_ipc(ndmpd_session_t *);
9432654012fSReza Sabdar extern void ndmp_waitfor_op(ndmpd_session_t *);
9442654012fSReza Sabdar 
9452654012fSReza Sabdar extern char *cctime(time_t *);
9462654012fSReza Sabdar extern char *ndmp_new_job_name(char *);
9472654012fSReza Sabdar extern char *ndmpd_mk_temp(char *);
9482654012fSReza Sabdar extern char *ndmpd_make_bk_dir_path(char *, char *);
9492654012fSReza Sabdar extern boolean_t ndmp_is_chkpnt_root(char *);
9502654012fSReza Sabdar extern char **ndmpd_make_exc_list(void);
9512654012fSReza Sabdar extern void ndmp_sort_nlist_v3(ndmpd_session_t *);
9522654012fSReza Sabdar extern int ndmp_get_bk_dir_ino(ndmp_lbr_params_t *);
9532654012fSReza Sabdar extern int ndmp_write_utf8magic(tlm_cmd_t *);
9542654012fSReza Sabdar extern int ndmp_tar_writer(ndmpd_session_t *,
9552654012fSReza Sabdar     ndmpd_module_params_t *,
9562654012fSReza Sabdar     tlm_commands_t *);
9572654012fSReza Sabdar extern void ndmp_wait_for_reader(tlm_commands_t *);
9582654012fSReza Sabdar extern ndmp_error ndmpd_save_nlist_v3(ndmpd_session_t *,
9592654012fSReza Sabdar     ndmp_name_v3 *,
9602654012fSReza Sabdar     ulong_t);
9612654012fSReza Sabdar extern void ndmpd_free_nlist_v3(ndmpd_session_t *);
9622654012fSReza Sabdar extern int ndmp_create_socket(ulong_t *, ushort_t *);
9632654012fSReza Sabdar extern int ndmp_connect_sock_v3(ulong_t, ushort_t);
9642654012fSReza Sabdar extern void ndmp_copy_addr_v3(ndmp_addr_v3 *, ndmp_addr_v3 *);
9652654012fSReza Sabdar extern void ndmp_copy_addr_v4(ndmp_addr_v4 *, ndmp_addr_v4 *);
9662654012fSReza Sabdar extern char *ndmp_addr2str_v3(ndmp_addr_type);
9672654012fSReza Sabdar extern boolean_t ndmp_valid_v3addr_type(ndmp_addr_type);
9682654012fSReza Sabdar extern boolean_t ndmp_check_utf8magic(tlm_cmd_t *);
9692654012fSReza Sabdar extern int ndmp_get_cur_bk_time(ndmp_lbr_params_t *,
9702654012fSReza Sabdar     time_t *, char *);
9712654012fSReza Sabdar extern char *ndmp_get_relative_path(char *, char *);
9722654012fSReza Sabdar 
9732654012fSReza Sabdar extern boolean_t ndmp_fhinode;
9742654012fSReza Sabdar extern void ndmp_load_params(void);
9752654012fSReza Sabdar extern void randomize(unsigned char *, int);
9762654012fSReza Sabdar 
9772654012fSReza Sabdar 
9782654012fSReza Sabdar /*
9792654012fSReza Sabdar  * Utility functions from ndmpd_tar3.c.
9802654012fSReza Sabdar  */
9812654012fSReza Sabdar extern ndmp_error ndmp_restore_get_params_v3(ndmpd_session_t *,
9822654012fSReza Sabdar     ndmpd_module_params_t *);
9832654012fSReza Sabdar extern ndmp_error ndmp_backup_get_params_v3(ndmpd_session_t *,
9842654012fSReza Sabdar     ndmpd_module_params_t *);
9852654012fSReza Sabdar 
9862654012fSReza Sabdar /*
9872654012fSReza Sabdar  * door init and fini function from ndmpd_door_serv.c
9882654012fSReza Sabdar  */
9892654012fSReza Sabdar extern int ndmp_door_init(void);
9902654012fSReza Sabdar extern void ndmp_door_fini(void);
9912654012fSReza Sabdar extern boolean_t ndmp_door_check(void);
9922654012fSReza Sabdar 
9932654012fSReza Sabdar extern int ndmp_get_max_tok_seq(void);
9942654012fSReza Sabdar extern boolean_t set_debug_level(boolean_t);
9952654012fSReza Sabdar extern boolean_t get_debug_level(void);
9962654012fSReza Sabdar 
9972654012fSReza Sabdar typedef struct ndmp_chkpnt_vol {
9982654012fSReza Sabdar 	char cv_vol_name[64];
9992654012fSReza Sabdar 	unsigned int cv_count;
10002654012fSReza Sabdar 	void *cv_next;
10012654012fSReza Sabdar } ndmp_chkpnt_vol_t;
10022654012fSReza Sabdar 
10032654012fSReza Sabdar extern int get_zfsvolname(char *, int, char *);
10042654012fSReza Sabdar extern int ndmp_start_check_point(char *, char *);
10052654012fSReza Sabdar extern int ndmp_release_check_point(char *, char *);
10062654012fSReza Sabdar extern int ndmpd_mark_inodes_v2(ndmpd_session_t *, ndmp_lbr_params_t *);
10072654012fSReza Sabdar extern void ndmpd_abort_marking_v2(ndmpd_session_t *);
10082654012fSReza Sabdar extern int ndmpd_mark_inodes_v3(ndmpd_session_t *, ndmp_lbr_params_t *);
10092654012fSReza Sabdar extern ndmp_lbr_params_t *ndmp_get_nlp(void *);
10102654012fSReza Sabdar 
10112654012fSReza Sabdar module_start_func_t ndmpd_tar_backup_starter;
10122654012fSReza Sabdar module_abort_func_t ndmpd_tar_backup_abort;
10132654012fSReza Sabdar 
10142654012fSReza Sabdar module_start_func_t ndmpd_tar_restore_starter;
10152654012fSReza Sabdar module_abort_func_t ndmpd_tar_restore_abort;
10162654012fSReza Sabdar 
10172654012fSReza Sabdar module_start_func_t ndmpd_tar_backup_starter_v3;
10182654012fSReza Sabdar module_abort_func_t ndmpd_tar_backup_abort_v3;
10192654012fSReza Sabdar 
10202654012fSReza Sabdar module_start_func_t ndmpd_tar_restore_starter_v3;
10212654012fSReza Sabdar module_abort_func_t ndmpd_tar_restore_abort_v3;
10222654012fSReza Sabdar 
10232654012fSReza Sabdar extern int ndmp_backup_extract_params(ndmpd_session_t *,
10242654012fSReza Sabdar     ndmpd_module_params_t *);
10252654012fSReza Sabdar extern int ndmp_restore_extract_params(ndmpd_session_t *,
10262654012fSReza Sabdar     ndmpd_module_params_t *);
10272654012fSReza Sabdar extern int ndmp_tar_reader(ndmp_tar_reader_arg_t *);
10282654012fSReza Sabdar 
10292654012fSReza Sabdar extern int tape_open(char *, int);
10302654012fSReza Sabdar 
10312654012fSReza Sabdar extern void ndmp_session_ref(ndmpd_session_t *);
10322654012fSReza Sabdar extern void ndmp_session_unref(ndmpd_session_t *);
10332654012fSReza Sabdar 
10342654012fSReza Sabdar void ndmpd_get_file_entry_type(int, ndmp_file_type *);
10352654012fSReza Sabdar 
10362654012fSReza Sabdar extern int tcp_accept(int, unsigned int *);
10372654012fSReza Sabdar extern int tcp_get_peer(int, unsigned int *, int *);
10382654012fSReza Sabdar 
10392654012fSReza Sabdar extern char *gethostaddr(void);
10402654012fSReza Sabdar extern int tlm_init(void);
10412654012fSReza Sabdar 
1042*8c4f9701SJanice Chang extern int chkpnt_backup_successful(char *, char *, boolean_t, int *);
1043*8c4f9701SJanice Chang extern int chkpnt_backup_prepare(char *, char *, boolean_t);
10442654012fSReza Sabdar 
10452654012fSReza Sabdar extern boolean_t fs_is_chkpntvol(char *);
10462654012fSReza Sabdar extern boolean_t fs_is_chkpnt_enabled(char *);
10472654012fSReza Sabdar extern boolean_t fs_is_rdonly(char *);
10482654012fSReza Sabdar extern boolean_t fs_volexist(char *);
10492654012fSReza Sabdar extern boolean_t fs_is_valid_logvol(char *);
10502654012fSReza Sabdar extern boolean_t rootfs_dot_or_dotdot(char *);
10512654012fSReza Sabdar extern int dp_readdir(DIR *, unsigned long *, char *,
10522654012fSReza Sabdar     int *, unsigned long *);
10532654012fSReza Sabdar 
10542654012fSReza Sabdar extern void scsi_find_sid_lun();
10552654012fSReza Sabdar extern char *sasd_slink_name();
10562654012fSReza Sabdar extern int scsi_dev_exists(char *, int, int);
10572654012fSReza Sabdar extern int scsi_get_devtype(char *, int, int);
10582654012fSReza Sabdar extern struct open_list *ndmp_open_list_find(char *, int, int);
10592654012fSReza Sabdar extern int filecopy(char *, char *);
10602654012fSReza Sabdar 
10612654012fSReza Sabdar extern void ndmp_stop_local_reader();
10622654012fSReza Sabdar extern void ndmp_stop_remote_reader();
10632654012fSReza Sabdar 
10642654012fSReza Sabdar extern boolean_t match(char *, char *);
10652654012fSReza Sabdar extern char *trim_whitespace(char *);
106684bf06e9SReza Sabdar extern int fs_getstat(char *, struct fs_fhandle *, struct stat64 *);
10672654012fSReza Sabdar extern int fs_readdir(struct fs_fhandle *, char *, long *,
106884bf06e9SReza Sabdar     char *, int *, struct fs_fhandle *, struct stat64 *);
10692654012fSReza Sabdar extern int iscreated(ndmp_lbr_params_t *nlp, char *name, tlm_acls_t *tacl,
10702654012fSReza Sabdar     time_t t);
10712654012fSReza Sabdar 
10722654012fSReza Sabdar extern int sasd_dev_count(void);
10732654012fSReza Sabdar extern struct scsi_link *sasd_dev_slink(int);
10742654012fSReza Sabdar extern struct sasd_drive *sasd_drive(int);
10752654012fSReza Sabdar extern void *ndmp_malloc(size_t size);
10762654012fSReza Sabdar 
10772654012fSReza Sabdar extern ndmp_plugin_t *ndmp_pl;
1078*8c4f9701SJanice Chang 
1079*8c4f9701SJanice Chang #define	NDMP_APILOG(s, t, m, ...) \
1080*8c4f9701SJanice Chang { \
1081*8c4f9701SJanice Chang 	if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV4) \
1082*8c4f9701SJanice Chang 		(void) ndmpd_api_log_v4(s, t, m, __VA_ARGS__); \
1083*8c4f9701SJanice Chang 	else if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV3) \
1084*8c4f9701SJanice Chang 		(void) ndmpd_api_log_v3(s, t, m, __VA_ARGS__); \
1085*8c4f9701SJanice Chang 	else \
1086*8c4f9701SJanice Chang 		(void) ndmpd_api_log_v2(s, __VA_ARGS__); \
1087*8c4f9701SJanice Chang }
1088*8c4f9701SJanice Chang 
1089*8c4f9701SJanice Chang /*
1090*8c4f9701SJanice Chang  * Backup path utility functions
1091*8c4f9701SJanice Chang  */
1092*8c4f9701SJanice Chang extern char *get_backup_path_v3(ndmpd_module_params_t *);
1093*8c4f9701SJanice Chang extern char *get_backup_path_v2(ndmpd_module_params_t *);
1094*8c4f9701SJanice Chang 
1095*8c4f9701SJanice Chang /*
1096*8c4f9701SJanice Chang  * Functions for zfs-based backup
1097*8c4f9701SJanice Chang  */
1098*8c4f9701SJanice Chang 
1099*8c4f9701SJanice Chang module_start_func_t ndmpd_zfs_backup_starter;
1100*8c4f9701SJanice Chang module_start_func_t ndmpd_zfs_restore_starter;
1101*8c4f9701SJanice Chang module_abort_func_t ndmpd_zfs_abort;
1102*8c4f9701SJanice Chang 
1103*8c4f9701SJanice Chang int ndmpd_zfs_init(ndmpd_session_t *);
1104*8c4f9701SJanice Chang void ndmpd_zfs_fini(ndmpd_zfs_args_t *);
1105*8c4f9701SJanice Chang 
1106*8c4f9701SJanice Chang boolean_t ndmpd_zfs_backup_parms_valid(ndmpd_zfs_args_t *);
1107*8c4f9701SJanice Chang boolean_t ndmpd_zfs_restore_parms_valid(ndmpd_zfs_args_t *);
1108*8c4f9701SJanice Chang 
1109*8c4f9701SJanice Chang int ndmpd_zfs_pre_backup(ndmpd_zfs_args_t *);
1110*8c4f9701SJanice Chang int ndmpd_zfs_pre_restore(ndmpd_zfs_args_t *);
1111*8c4f9701SJanice Chang int ndmpd_zfs_post_backup(ndmpd_zfs_args_t *);
1112*8c4f9701SJanice Chang int ndmpd_zfs_post_restore(ndmpd_zfs_args_t *);
1113*8c4f9701SJanice Chang 
1114*8c4f9701SJanice Chang void ndmpd_zfs_dma_log(ndmpd_zfs_args_t *, ndmp_log_type, char *, ...);
1115*8c4f9701SJanice Chang 
11162654012fSReza Sabdar #endif /* _NDMPD_H */
1117