xref: /onnv-gate/usr/src/cmd/ndmpd/ndmp/ndmpd.h (revision 13023:7a57e737278a)
17917SReza.Sabdar@Sun.COM /*
212186SJanice.Chang@Sun.COM  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
37917SReza.Sabdar@Sun.COM  */
47917SReza.Sabdar@Sun.COM 
57917SReza.Sabdar@Sun.COM /*
67917SReza.Sabdar@Sun.COM  * BSD 3 Clause License
77917SReza.Sabdar@Sun.COM  *
87917SReza.Sabdar@Sun.COM  * Copyright (c) 2007, The Storage Networking Industry Association.
97917SReza.Sabdar@Sun.COM  *
107917SReza.Sabdar@Sun.COM  * Redistribution and use in source and binary forms, with or without
117917SReza.Sabdar@Sun.COM  * modification, are permitted provided that the following conditions
127917SReza.Sabdar@Sun.COM  * are met:
137917SReza.Sabdar@Sun.COM  * 	- Redistributions of source code must retain the above copyright
147917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer.
157917SReza.Sabdar@Sun.COM  *
167917SReza.Sabdar@Sun.COM  * 	- Redistributions in binary form must reproduce the above copyright
177917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer in
187917SReza.Sabdar@Sun.COM  *	  the documentation and/or other materials provided with the
197917SReza.Sabdar@Sun.COM  *	  distribution.
207917SReza.Sabdar@Sun.COM  *
217917SReza.Sabdar@Sun.COM  *	- Neither the name of The Storage Networking Industry Association (SNIA)
227917SReza.Sabdar@Sun.COM  *	  nor the names of its contributors may be used to endorse or promote
237917SReza.Sabdar@Sun.COM  *	  products derived from this software without specific prior written
247917SReza.Sabdar@Sun.COM  *	  permission.
257917SReza.Sabdar@Sun.COM  *
267917SReza.Sabdar@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
277917SReza.Sabdar@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
287917SReza.Sabdar@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
297917SReza.Sabdar@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
307917SReza.Sabdar@Sun.COM  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
317917SReza.Sabdar@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
327917SReza.Sabdar@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
337917SReza.Sabdar@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
347917SReza.Sabdar@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
357917SReza.Sabdar@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
367917SReza.Sabdar@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
377917SReza.Sabdar@Sun.COM  */
387917SReza.Sabdar@Sun.COM /* Copyright (c) 2007, The Storage Networking Industry Association. */
397917SReza.Sabdar@Sun.COM /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
407917SReza.Sabdar@Sun.COM 
417917SReza.Sabdar@Sun.COM #ifndef _NDMPD_H
427917SReza.Sabdar@Sun.COM #define	_NDMPD_H
437917SReza.Sabdar@Sun.COM 
447917SReza.Sabdar@Sun.COM #include <sys/types.h>
457917SReza.Sabdar@Sun.COM #include <libzfs.h>
467917SReza.Sabdar@Sun.COM #include <ndmpd_door.h>
477917SReza.Sabdar@Sun.COM #include <libndmp.h>
487917SReza.Sabdar@Sun.COM #include "ndmpd_common.h"
497917SReza.Sabdar@Sun.COM #include "tlm_buffers.h"
507917SReza.Sabdar@Sun.COM #include <dirent.h>
517917SReza.Sabdar@Sun.COM #include "ndmpd_prop.h"
527917SReza.Sabdar@Sun.COM #include "traverse.h"
537917SReza.Sabdar@Sun.COM #include <pthread.h>
547917SReza.Sabdar@Sun.COM #include <libndmp.h>
557917SReza.Sabdar@Sun.COM #include <atomic.h>
567917SReza.Sabdar@Sun.COM 
577917SReza.Sabdar@Sun.COM #define	MAX_RECORD_SIZE (126*512)
587917SReza.Sabdar@Sun.COM #define	REMOTE_RECORD_SIZE    (60*KILOBYTE)
597917SReza.Sabdar@Sun.COM #define	SCSI_MAX_NAME 32
607917SReza.Sabdar@Sun.COM #define	MD5_CHALLENGE_SIZE	64
617917SReza.Sabdar@Sun.COM #define	MD5_PASS_LIMIT		32
627917SReza.Sabdar@Sun.COM 
637917SReza.Sabdar@Sun.COM /* Test unit ready */
647917SReza.Sabdar@Sun.COM #define	TUR_WAIT	3000000
657917SReza.Sabdar@Sun.COM #define	TUR_MAX_TRY	3
667917SReza.Sabdar@Sun.COM 
677917SReza.Sabdar@Sun.COM 
687917SReza.Sabdar@Sun.COM /* File handler classes */
697917SReza.Sabdar@Sun.COM #define	HC_CLIENT	1
707917SReza.Sabdar@Sun.COM #define	HC_MOVER	2
717917SReza.Sabdar@Sun.COM #define	HC_MODULE	4
727917SReza.Sabdar@Sun.COM #define	HC_ALL		0xffffffff
737917SReza.Sabdar@Sun.COM 
747917SReza.Sabdar@Sun.COM #define	IN_ADDR(x) \
757917SReza.Sabdar@Sun.COM 	(*(struct in_addr *)&x)
767917SReza.Sabdar@Sun.COM 
777917SReza.Sabdar@Sun.COM #define	FS_READONLY(fs)		(hasmntopt(fs, "ro")  ? 1 :  0)
787917SReza.Sabdar@Sun.COM 
797917SReza.Sabdar@Sun.COM typedef void *(*funct_t)(void *);	/* function pointer */
807917SReza.Sabdar@Sun.COM 
817917SReza.Sabdar@Sun.COM #define	HOSTNAMELEN	256
827917SReza.Sabdar@Sun.COM 
837917SReza.Sabdar@Sun.COM #define	VENDOR_NAME	"Sun Microsystems"
847917SReza.Sabdar@Sun.COM #define	PRODUCT_NAME	"Solaris 5.11"
857917SReza.Sabdar@Sun.COM 
867917SReza.Sabdar@Sun.COM /*
877917SReza.Sabdar@Sun.COM  * Calculate array length based on its size and size of
887917SReza.Sabdar@Sun.COM  * its elements.
897917SReza.Sabdar@Sun.COM  */
907917SReza.Sabdar@Sun.COM #define	ARRAY_LEN(a, t)	(sizeof (a) / sizeof (t))
917917SReza.Sabdar@Sun.COM /*
927917SReza.Sabdar@Sun.COM  * Default maximum permitted sequence number for the token-based backup.
937917SReza.Sabdar@Sun.COM  */
947917SReza.Sabdar@Sun.COM #define	NDMP_MAX_TOKSEQ	9
957917SReza.Sabdar@Sun.COM 
967917SReza.Sabdar@Sun.COM /*
977917SReza.Sabdar@Sun.COM  * Hard-limit for the sequence number in the token-based backup.
987917SReza.Sabdar@Sun.COM  * It's one less than the ASCII value of 'A'.  The 'A' letter
997917SReza.Sabdar@Sun.COM  * can be used as level in the lbr-type backups.
1007917SReza.Sabdar@Sun.COM  */
1017917SReza.Sabdar@Sun.COM #define	NDMP_TOKSEQ_HLIMIT	('A' - 1)
1027917SReza.Sabdar@Sun.COM 
1037917SReza.Sabdar@Sun.COM 
1047917SReza.Sabdar@Sun.COM /*
1057917SReza.Sabdar@Sun.COM  * Soft-limit for the sequence number in the token-based backup.
1067917SReza.Sabdar@Sun.COM  */
1077917SReza.Sabdar@Sun.COM #define	NDMP_TOKSEQ_SLIMIT	(NDMP_TOKSEQ_HLIMIT - 5)
1087917SReza.Sabdar@Sun.COM 
1097917SReza.Sabdar@Sun.COM 
1107917SReza.Sabdar@Sun.COM /*
1117917SReza.Sabdar@Sun.COM  * Root inode number of dump format in V2.
1127917SReza.Sabdar@Sun.COM  */
1137917SReza.Sabdar@Sun.COM #define	ROOT_INODE	2
1147917SReza.Sabdar@Sun.COM 
1157917SReza.Sabdar@Sun.COM /*
11612186SJanice.Chang@Sun.COM  * NDMP backup image signature
1177917SReza.Sabdar@Sun.COM  */
1187917SReza.Sabdar@Sun.COM #define	NDMPUTF8MAGIC "NDMPUTF8MAGIC"
1197917SReza.Sabdar@Sun.COM 
1207917SReza.Sabdar@Sun.COM /*
1217917SReza.Sabdar@Sun.COM  * Supported BU types
1227917SReza.Sabdar@Sun.COM  */
12312186SJanice.Chang@Sun.COM #define	NDMP_TAR_TYPE	"tar"
1247917SReza.Sabdar@Sun.COM #define	NDMP_DUMP_TYPE	"dump"
12512186SJanice.Chang@Sun.COM #define	NDMP_ZFS_TYPE	"zfs"
1267917SReza.Sabdar@Sun.COM 
1277917SReza.Sabdar@Sun.COM /* All 1's binary maximum mover window */
1287917SReza.Sabdar@Sun.COM #define	MAX_WINDOW_SIZE	0xffffffffffffffffULL
1297917SReza.Sabdar@Sun.COM 
1307917SReza.Sabdar@Sun.COM #define	NDMP_FREE(cp)	{ free((char *)(cp)); (cp) = NULL; }
1317917SReza.Sabdar@Sun.COM 
1327917SReza.Sabdar@Sun.COM #define	NDMP_YORN(f)	((f) ? 'Y' : 'N')
1337917SReza.Sabdar@Sun.COM #define	NDMP_TORF(f)	((f) ? "TRUE" : "FALSE")
1347917SReza.Sabdar@Sun.COM #define	NDMP_SVAL(cp)	((cp) ? (cp) : "NULL")
1357917SReza.Sabdar@Sun.COM 
1367917SReza.Sabdar@Sun.COM #define	NDMP_SETENV(env, nm, val) \
1377917SReza.Sabdar@Sun.COM 	{ \
1387917SReza.Sabdar@Sun.COM 		env->name = nm; \
1397917SReza.Sabdar@Sun.COM 		env->value = val; \
1407917SReza.Sabdar@Sun.COM 		env++; \
1417917SReza.Sabdar@Sun.COM 	}
1427917SReza.Sabdar@Sun.COM 
1437917SReza.Sabdar@Sun.COM #define	NDMP_CL_ADDR_LEN	24
1447917SReza.Sabdar@Sun.COM #define	NDMP_TCP_ADDR_SIZE	32
1457917SReza.Sabdar@Sun.COM #define	NDMP_TAPE_DEV_NAME	256
1467917SReza.Sabdar@Sun.COM 
1477917SReza.Sabdar@Sun.COM typedef struct {
1487917SReza.Sabdar@Sun.COM 	char *bk_path;
1497917SReza.Sabdar@Sun.COM 	int bk_llevel; /* last backup level */
1507917SReza.Sabdar@Sun.COM 	time_t bk_ldate; /* last backup date */
1517917SReza.Sabdar@Sun.COM 	int bk_clevel;	/* current backup level */
1527917SReza.Sabdar@Sun.COM 	time_t bk_cdate; /* current backup date */
1537917SReza.Sabdar@Sun.COM 	int bk_map;
1547917SReza.Sabdar@Sun.COM 	int bk_dirino;
1557917SReza.Sabdar@Sun.COM 	char *bk_dmpnm;
1567917SReza.Sabdar@Sun.COM 	char **bk_exl; /* exlude list */
1577917SReza.Sabdar@Sun.COM 	char **bk_inc; /* include list */
1587917SReza.Sabdar@Sun.COM } ndmp_backup_params_t;
1597917SReza.Sabdar@Sun.COM 
1607917SReza.Sabdar@Sun.COM 
1617917SReza.Sabdar@Sun.COM typedef struct {
1627917SReza.Sabdar@Sun.COM 	ulong_t rs_nf;	/* number of files to restore */
1637917SReza.Sabdar@Sun.COM 	char *rs_path;
1647917SReza.Sabdar@Sun.COM 	char *rs_bkpath;
1657917SReza.Sabdar@Sun.COM 	int *rs_restored;
1667917SReza.Sabdar@Sun.COM 	int rs_bm;
1677917SReza.Sabdar@Sun.COM 	int rs_lastidx;
1687917SReza.Sabdar@Sun.COM } ndmp_restore_params_t;
1697917SReza.Sabdar@Sun.COM 
1707917SReza.Sabdar@Sun.COM /*
1717917SReza.Sabdar@Sun.COM  * Tar format archiving ops table
1727917SReza.Sabdar@Sun.COM  */
1737917SReza.Sabdar@Sun.COM extern tm_ops_t tm_tar_ops;
1747917SReza.Sabdar@Sun.COM 
1757917SReza.Sabdar@Sun.COM /*
1767917SReza.Sabdar@Sun.COM  * IS_LBR_BKTYPE shows if the backup type is one of these
1777917SReza.Sabdar@Sun.COM  * 'F' of 'f': 'Full' backup type.
1787917SReza.Sabdar@Sun.COM  * 'A' of 'a': 'Archive' backup type.
1797917SReza.Sabdar@Sun.COM  * 'I' of 'i': 'Incremental' backup type.
1807917SReza.Sabdar@Sun.COM  * 'D' of 'd': 'Differntial' backup type.
1817917SReza.Sabdar@Sun.COM  */
1827917SReza.Sabdar@Sun.COM #define	IS_LBR_BKTYPE(t)	(((t) && strchr("FAID", toupper(t))) ? 1 : 0)
1837917SReza.Sabdar@Sun.COM 
1847917SReza.Sabdar@Sun.COM 
1857917SReza.Sabdar@Sun.COM /*
1867917SReza.Sabdar@Sun.COM  * NLP flags.
1877917SReza.Sabdar@Sun.COM  */
1887917SReza.Sabdar@Sun.COM #define	NLPF_CHKPNTED_PATH	(1 << 0)
1897917SReza.Sabdar@Sun.COM #define	NLPF_FH			(1 << 1)
1907917SReza.Sabdar@Sun.COM #define	NLPF_DIRECT		(1 << 2)
1917917SReza.Sabdar@Sun.COM #define	NLPF_UPDATE		(1 << 3)
1927917SReza.Sabdar@Sun.COM #define	NLPF_DUMP		(1 << 4)
1937917SReza.Sabdar@Sun.COM #define	NLPF_TAR		(1 << 5)
1947917SReza.Sabdar@Sun.COM #define	NLPF_ABORTED		(1 << 6)
1957917SReza.Sabdar@Sun.COM #define	NLPF_TOKENBK		(1 << 8)
1967917SReza.Sabdar@Sun.COM #define	NLPF_LBRBK		(1 << 9)
1977917SReza.Sabdar@Sun.COM #define	NLPF_LEVELBK		(1 << 10)
1987917SReza.Sabdar@Sun.COM #define	NLPF_IGNCTIME		(1 << 11)
1997917SReza.Sabdar@Sun.COM #define	NLPF_INCLMTIME		(1 << 12)
2007917SReza.Sabdar@Sun.COM #define	NLPF_RECURSIVE		(1 << 13)
2017917SReza.Sabdar@Sun.COM 
2027917SReza.Sabdar@Sun.COM /*
2037917SReza.Sabdar@Sun.COM  * Macros on NLP flags.
2047917SReza.Sabdar@Sun.COM  */
2057917SReza.Sabdar@Sun.COM #define	NLP_ISSET(n, f)	(((n)->nlp_flags & (f)) != 0)
2067917SReza.Sabdar@Sun.COM #define	NLP_SET(n, f)	(n)->nlp_flags |= (f)
2077917SReza.Sabdar@Sun.COM #define	NLP_UNSET(n, f)	(n)->nlp_flags &= ~(f)
2087917SReza.Sabdar@Sun.COM 
2097917SReza.Sabdar@Sun.COM 
2107917SReza.Sabdar@Sun.COM #define	NLP_ISCHKPNTED(n)	NLP_ISSET(n, NLPF_CHKPNTED_PATH)
2117917SReza.Sabdar@Sun.COM #define	NLP_SHOULD_UPDATE(n)	NLP_ISSET(n, NLPF_UPDATE)
2127917SReza.Sabdar@Sun.COM #define	NLP_ISDUMP(n)		NLP_ISSET(n, NLPF_DUMP)
2137917SReza.Sabdar@Sun.COM #define	NLP_ISTAR(n)		NLP_ISSET(n, NLPF_TAR)
2147917SReza.Sabdar@Sun.COM #define	NLP_IGNCTIME(n)		NLP_ISSET(n, NLPF_IGNCTIME)
2157917SReza.Sabdar@Sun.COM #define	NLP_INCLMTIME(n)	NLP_ISSET(n, NLPF_INCLMTIME)
2167917SReza.Sabdar@Sun.COM 
2177917SReza.Sabdar@Sun.COM /*
2187917SReza.Sabdar@Sun.COM  * NDMP statistics
2197917SReza.Sabdar@Sun.COM  */
2207917SReza.Sabdar@Sun.COM #define	NS_INC(s)	(atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s))
2217917SReza.Sabdar@Sun.COM #define	NS_DEC(s)	(atomic_dec_32((volatile uint32_t *)&ndstat.ns_##s))
2227917SReza.Sabdar@Sun.COM #define	NS_ADD(s, d)	(atomic_add_64((volatile uint64_t *)&ndstat.ns_##s, \
2237917SReza.Sabdar@Sun.COM 	(uint64_t)d))
2247917SReza.Sabdar@Sun.COM #define	NS_UPD(s, t)	{ \
2257917SReza.Sabdar@Sun.COM 	atomic_inc_32((volatile uint32_t *)&ndstat.ns_##s); \
2267917SReza.Sabdar@Sun.COM 	atomic_dec_32((volatile uint32_t *)&ndstat.ns_##t); \
2277917SReza.Sabdar@Sun.COM 	}
2287917SReza.Sabdar@Sun.COM 
2297917SReza.Sabdar@Sun.COM #define	NLP_READY	1
2307917SReza.Sabdar@Sun.COM 
2317917SReza.Sabdar@Sun.COM typedef struct ndmp_lbr_params {
2327917SReza.Sabdar@Sun.COM 	struct ndmpd_session *nlp_session;
2337917SReza.Sabdar@Sun.COM 	int nlp_flags;
2347917SReza.Sabdar@Sun.COM 
2357917SReza.Sabdar@Sun.COM 	ndmp_backup_params_t bk_params;
2367917SReza.Sabdar@Sun.COM 	ndmp_restore_params_t rs_params;
2377917SReza.Sabdar@Sun.COM #define	nlp_backup_path	bk_params.bk_path
2387917SReza.Sabdar@Sun.COM #define	nlp_llevel	bk_params.bk_llevel
2397917SReza.Sabdar@Sun.COM #define	nlp_ldate	bk_params.bk_ldate
2407917SReza.Sabdar@Sun.COM #define	nlp_clevel	bk_params.bk_clevel
2417917SReza.Sabdar@Sun.COM #define	nlp_tokseq	nlp_clevel
2427917SReza.Sabdar@Sun.COM #define	nlp_tokdate	nlp_ldate
2437917SReza.Sabdar@Sun.COM #define	nlp_cdate	bk_params.bk_cdate
2447917SReza.Sabdar@Sun.COM #define	nlp_bkmap	bk_params.bk_map
2457917SReza.Sabdar@Sun.COM #define	nlp_bkdirino	bk_params.bk_dirino
2467917SReza.Sabdar@Sun.COM #define	nlp_dmpnm	bk_params.bk_dmpnm
2477917SReza.Sabdar@Sun.COM #define	nlp_exl		bk_params.bk_exl
2487917SReza.Sabdar@Sun.COM #define	nlp_inc		bk_params.bk_inc
2497917SReza.Sabdar@Sun.COM 
2507917SReza.Sabdar@Sun.COM #define	nlp_nfiles	rs_params.rs_nf
2517917SReza.Sabdar@Sun.COM #define	nlp_restore_path	rs_params.rs_path
2527917SReza.Sabdar@Sun.COM #define	nlp_restore_bk_path	rs_params.rs_bkpath
2537917SReza.Sabdar@Sun.COM #define	nlp_restored	rs_params.rs_restored
2547917SReza.Sabdar@Sun.COM #define	nlp_rsbm	rs_params.rs_bm
2557917SReza.Sabdar@Sun.COM #define	nlp_lastidx	rs_params.rs_lastidx
2567917SReza.Sabdar@Sun.COM 
2577917SReza.Sabdar@Sun.COM 	ndmpd_module_params_t *nlp_params;
2587917SReza.Sabdar@Sun.COM 	tlm_job_stats_t *nlp_jstat;
2597917SReza.Sabdar@Sun.COM 	lbr_fhlog_call_backs_t *nlp_logcallbacks;
2607917SReza.Sabdar@Sun.COM 	tlm_commands_t nlp_cmds;
2617917SReza.Sabdar@Sun.COM 	struct {
2627917SReza.Sabdar@Sun.COM 		/*
2637917SReza.Sabdar@Sun.COM 		 * nw: shows the number of threads waiting for a request
2647917SReza.Sabdar@Sun.COM 		 * to be processed.
2657917SReza.Sabdar@Sun.COM 		 * rv: if error occurred when processing a request.
2667917SReza.Sabdar@Sun.COM 		 */
2677917SReza.Sabdar@Sun.COM 		int ev_nw;
2687917SReza.Sabdar@Sun.COM 		int ev_rv;
2697917SReza.Sabdar@Sun.COM 	} nlp_event;
2707917SReza.Sabdar@Sun.COM 	cond_t	nlp_cv;
2717917SReza.Sabdar@Sun.COM 	int	nlp_flag;
2727917SReza.Sabdar@Sun.COM #define	nlp_nw	nlp_event.ev_nw
2737917SReza.Sabdar@Sun.COM #define	nlp_rv	nlp_event.ev_rv
2747917SReza.Sabdar@Sun.COM 	u_longlong_t nlp_bytes_total;
2757917SReza.Sabdar@Sun.COM } ndmp_lbr_params_t;
2767917SReza.Sabdar@Sun.COM 
2777917SReza.Sabdar@Sun.COM 
2787917SReza.Sabdar@Sun.COM typedef struct mem_ndmp_name_v3 {
2797917SReza.Sabdar@Sun.COM 	char *nm3_opath;
2807917SReza.Sabdar@Sun.COM 	char *nm3_dpath;
2817917SReza.Sabdar@Sun.COM 	char *nm3_newnm;
2827917SReza.Sabdar@Sun.COM 	u_longlong_t nm3_node;
2837917SReza.Sabdar@Sun.COM 	u_longlong_t nm3_fh_info;
2847917SReza.Sabdar@Sun.COM 	ndmp_error nm3_err;
2857917SReza.Sabdar@Sun.COM } mem_ndmp_name_v3_t;
2867917SReza.Sabdar@Sun.COM 
2877917SReza.Sabdar@Sun.COM typedef struct ndmpd_file_handler {
2887917SReza.Sabdar@Sun.COM 	int fh_fd;
2897917SReza.Sabdar@Sun.COM 	ulong_t fh_mode;
2907917SReza.Sabdar@Sun.COM 	ulong_t fh_class;
2917917SReza.Sabdar@Sun.COM 	void *fh_cookie;
2927917SReza.Sabdar@Sun.COM 	ndmpd_file_handler_func_t *fh_func;
2937917SReza.Sabdar@Sun.COM 	struct ndmpd_file_handler *fh_next;
2947917SReza.Sabdar@Sun.COM } ndmpd_file_handler_t;
2957917SReza.Sabdar@Sun.COM 
2967917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_scsi_desc {
2977917SReza.Sabdar@Sun.COM 	int sd_is_open;
2987917SReza.Sabdar@Sun.COM 	int sd_devid;
2997917SReza.Sabdar@Sun.COM 	boolean_t sd_valid_target_set;
3007917SReza.Sabdar@Sun.COM 	int sd_sid;
3017917SReza.Sabdar@Sun.COM 	int sd_lun;
3027917SReza.Sabdar@Sun.COM 	char sd_adapter_name[SCSI_MAX_NAME];
3037917SReza.Sabdar@Sun.COM } ndmpd_session_scsi_desc_t;
3047917SReza.Sabdar@Sun.COM 
3057917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_tape_desc {
3067917SReza.Sabdar@Sun.COM 	int td_fd;			/* tape device file descriptor */
3077917SReza.Sabdar@Sun.COM 	ulong_t td_record_count;	/* number of records written */
3087917SReza.Sabdar@Sun.COM 	ndmp_tape_open_mode td_mode;	/* tape device open mode */
3097917SReza.Sabdar@Sun.COM 	u_longlong_t td_pos;	/* current position on the current tape */
3107917SReza.Sabdar@Sun.COM 	int td_sid;
3117917SReza.Sabdar@Sun.COM 	int td_lun;
3127917SReza.Sabdar@Sun.COM 	char td_adapter_name[SCSI_MAX_NAME];
3137917SReza.Sabdar@Sun.COM 	ulong_t td_eom_seen:1,
3147917SReza.Sabdar@Sun.COM 		td_io_err:1,
3157917SReza.Sabdar@Sun.COM 		td_write:1;
3167917SReza.Sabdar@Sun.COM } ndmpd_session_tape_desc_t;
3177917SReza.Sabdar@Sun.COM 
3187917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_mover_desc {
3197917SReza.Sabdar@Sun.COM 	ndmp_mover_state md_state;	/* current state */
3207917SReza.Sabdar@Sun.COM 	ndmp_mover_mode md_mode;	/* current mode */
3217917SReza.Sabdar@Sun.COM 	ndmp_mover_pause_reason md_pause_reason;	/* current reason */
3227917SReza.Sabdar@Sun.COM 	ndmp_mover_halt_reason md_halt_reason;	/* current reason */
3237917SReza.Sabdar@Sun.COM 	u_longlong_t md_data_written;	/* total written to tape */
3247917SReza.Sabdar@Sun.COM 	u_longlong_t md_seek_position;	/* current seek position */
3257917SReza.Sabdar@Sun.COM 	u_longlong_t md_bytes_left_to_read; /* #bytes to end of seek window */
3267917SReza.Sabdar@Sun.COM 	u_longlong_t md_window_offset;	/* valid data window begin */
3277917SReza.Sabdar@Sun.COM 	u_longlong_t md_window_length;	/* valid data window length */
3287917SReza.Sabdar@Sun.COM 	u_longlong_t md_position;	/* current data stream pos */
3297917SReza.Sabdar@Sun.COM 	boolean_t md_pre_cond;		/* used for precondition checks */
3307917SReza.Sabdar@Sun.COM 	ulong_t md_record_size;	/* tape I/O record size */
3317917SReza.Sabdar@Sun.COM 	ulong_t md_record_num;	/* current record num */
3327917SReza.Sabdar@Sun.COM 	int md_listen_sock;		/* data conn listen socket */
3337917SReza.Sabdar@Sun.COM 	int md_sock;		/* data conn socket */
3347917SReza.Sabdar@Sun.COM 	ulong_t md_r_index;		/* buffer read  index */
3357917SReza.Sabdar@Sun.COM 	ulong_t md_w_index;		/* buffer write index */
3367917SReza.Sabdar@Sun.COM 	char *md_buf;		/* data buffer */
3377917SReza.Sabdar@Sun.COM 	/*
3387917SReza.Sabdar@Sun.COM 	 * V2 fields.
3397917SReza.Sabdar@Sun.COM 	 */
3407917SReza.Sabdar@Sun.COM 	ulong_t md_discard_length;	/* bytes to discard */
3417917SReza.Sabdar@Sun.COM 
3427917SReza.Sabdar@Sun.COM 	/*
3437917SReza.Sabdar@Sun.COM 	 * V3 fields.
3447917SReza.Sabdar@Sun.COM 	 */
3457917SReza.Sabdar@Sun.COM 	ndmp_addr_v3 md_data_addr;
3467917SReza.Sabdar@Sun.COM 	/*
3477917SReza.Sabdar@Sun.COM 	 * V4 fields.
3487917SReza.Sabdar@Sun.COM 	 */
3497917SReza.Sabdar@Sun.COM 	ndmp_addr_v4 md_data_addr_v4;
3507917SReza.Sabdar@Sun.COM } ndmpd_session_mover_desc_t;
3517917SReza.Sabdar@Sun.COM 
3527917SReza.Sabdar@Sun.COM 
3537917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_data_module {
3547917SReza.Sabdar@Sun.COM 	void *dm_module_cookie;	/* sent as abort_func param */
3557917SReza.Sabdar@Sun.COM 	module_start_func_t *dm_start_func;	/* start function */
3567917SReza.Sabdar@Sun.COM 	module_abort_func_t *dm_abort_func;	/* abort function */
3577917SReza.Sabdar@Sun.COM 	ndmpd_module_stats dm_stats;	/* statistics buffer */
3587917SReza.Sabdar@Sun.COM } ndmpd_session_data_module_t;
3597917SReza.Sabdar@Sun.COM 
3607917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_data_desc {
3617917SReza.Sabdar@Sun.COM 	/*
3627917SReza.Sabdar@Sun.COM 	 * Common fields.
3637917SReza.Sabdar@Sun.COM 	 */
3647917SReza.Sabdar@Sun.COM 	ndmp_data_operation dd_operation;	/* current operation */
3657917SReza.Sabdar@Sun.COM 	boolean_t dd_abort;		/* abort operation flag */
3667917SReza.Sabdar@Sun.COM 	boolean_t dd_io_ready;		/* mover sock read for I/O */
3677917SReza.Sabdar@Sun.COM 	ndmp_pval *dd_env;	/* environment from backup or recover request */
3687917SReza.Sabdar@Sun.COM 	ulong_t dd_env_len;		/* environment length */
3697917SReza.Sabdar@Sun.COM 	ulong_t dd_nlist_len;	/* recover file list length */
3707917SReza.Sabdar@Sun.COM 	int dd_sock;		/* listen and data socket */
3717917SReza.Sabdar@Sun.COM 	u_longlong_t dd_read_offset;	/* data read seek offset */
3727917SReza.Sabdar@Sun.COM 	u_longlong_t dd_read_length;	/* data read length */
3737917SReza.Sabdar@Sun.COM 	u_longlong_t dd_data_size;	/* data size to be backed up */
3747917SReza.Sabdar@Sun.COM 	ndmpd_session_data_module_t dd_module;
3757917SReza.Sabdar@Sun.COM 
3767917SReza.Sabdar@Sun.COM 	ndmp_data_state dd_state;	/* current state */
3777917SReza.Sabdar@Sun.COM 	ndmp_data_halt_reason dd_halt_reason;		/* current reason */
3787917SReza.Sabdar@Sun.COM 	/*
3797917SReza.Sabdar@Sun.COM 	 * V2 fields.
3807917SReza.Sabdar@Sun.COM 	 */
3817917SReza.Sabdar@Sun.COM 	ndmp_name *dd_nlist;	/* recover file list */
3827917SReza.Sabdar@Sun.COM 	ndmp_mover_addr dd_mover;	/* mover address */
3837917SReza.Sabdar@Sun.COM 	/*
3847917SReza.Sabdar@Sun.COM 	 * V3 fields.
3857917SReza.Sabdar@Sun.COM 	 */
3867917SReza.Sabdar@Sun.COM 	mem_ndmp_name_v3_t *dd_nlist_v3;
3877917SReza.Sabdar@Sun.COM 	ndmp_addr_v3 dd_data_addr;
3887917SReza.Sabdar@Sun.COM 	int dd_listen_sock;	/* socket for listening for remote */
3897917SReza.Sabdar@Sun.COM 				/* mover connections */
3907917SReza.Sabdar@Sun.COM 	u_longlong_t dd_bytes_left_to_read;
3917917SReza.Sabdar@Sun.COM 	u_longlong_t dd_position;
3927917SReza.Sabdar@Sun.COM 	u_longlong_t dd_discard_length;
3937917SReza.Sabdar@Sun.COM 	/*
3947917SReza.Sabdar@Sun.COM 	 * V4 fields.
3957917SReza.Sabdar@Sun.COM 	 */
3967917SReza.Sabdar@Sun.COM 	ndmp_addr_v4 dd_data_addr_v4;
3977917SReza.Sabdar@Sun.COM } ndmpd_session_data_desc_t;
3987917SReza.Sabdar@Sun.COM 
3997917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_file_history {
4007917SReza.Sabdar@Sun.COM 	ndmp_fh_unix_path *fh_path_entries;
4017917SReza.Sabdar@Sun.COM 	ndmp_fh_unix_dir *fh_dir_entries;
4027917SReza.Sabdar@Sun.COM 	ndmp_fh_unix_node *fh_node_entries;
4037917SReza.Sabdar@Sun.COM 	char *fh_path_name_buf;
4047917SReza.Sabdar@Sun.COM 	char *fh_dir_name_buf;
4057917SReza.Sabdar@Sun.COM 	ulong_t fh_path_index;
4067917SReza.Sabdar@Sun.COM 	ulong_t fh_dir_index;
4077917SReza.Sabdar@Sun.COM 	ulong_t fh_node_index;
4087917SReza.Sabdar@Sun.COM 	ulong_t fh_path_name_buf_index;
4097917SReza.Sabdar@Sun.COM 	ulong_t fh_dir_name_buf_index;
4107917SReza.Sabdar@Sun.COM } ndmpd_session_file_history_t;
4117917SReza.Sabdar@Sun.COM 
4127917SReza.Sabdar@Sun.COM typedef struct ndmpd_session_file_history_v3 {
4137917SReza.Sabdar@Sun.COM 	ndmp_file_v3 *fh_files;
4147917SReza.Sabdar@Sun.COM 	ndmp_dir_v3 *fh_dirs;
4157917SReza.Sabdar@Sun.COM 	ndmp_node_v3 *fh_nodes;
4167917SReza.Sabdar@Sun.COM 	ndmp_file_name_v3 *fh_file_names;
4177917SReza.Sabdar@Sun.COM 	ndmp_file_name_v3 *fh_dir_names;
4187917SReza.Sabdar@Sun.COM 	ndmp_file_stat_v3 *fh_file_stats;
4197917SReza.Sabdar@Sun.COM 	ndmp_file_stat_v3 *fh_node_stats;
4207917SReza.Sabdar@Sun.COM 	char *fh_file_name_buf;
4217917SReza.Sabdar@Sun.COM 	char *fh_dir_name_buf;
4227917SReza.Sabdar@Sun.COM 	ulong_t fh_file_index;
4237917SReza.Sabdar@Sun.COM 	ulong_t fh_dir_index;
4247917SReza.Sabdar@Sun.COM 	ulong_t fh_node_index;
4257917SReza.Sabdar@Sun.COM 	ulong_t fh_file_name_buf_index;
4267917SReza.Sabdar@Sun.COM 	ulong_t fh_dir_name_buf_index;
4277917SReza.Sabdar@Sun.COM } ndmpd_session_file_history_v3_t;
4287917SReza.Sabdar@Sun.COM 
42912186SJanice.Chang@Sun.COM /*
43012186SJanice.Chang@Sun.COM  * zfs-based backup (zfs send/recv)
43112186SJanice.Chang@Sun.COM  */
43212186SJanice.Chang@Sun.COM 
43312186SJanice.Chang@Sun.COM typedef enum {
43412186SJanice.Chang@Sun.COM 	NDMPD_ZFS_MAJOR_0,
43512186SJanice.Chang@Sun.COM } ndmpd_zfs_major_t;
43612186SJanice.Chang@Sun.COM 
43712186SJanice.Chang@Sun.COM typedef enum {
43812186SJanice.Chang@Sun.COM 	NDMPD_ZFS_MINOR_0,
43912186SJanice.Chang@Sun.COM } ndmpd_zfs_minor_t;
44012186SJanice.Chang@Sun.COM 
44112186SJanice.Chang@Sun.COM typedef enum {
44212186SJanice.Chang@Sun.COM 	NDMPD_ZFS_PROP_MAJOR_0,
44312186SJanice.Chang@Sun.COM } ndmpd_zfs_prop_major_t;
44412186SJanice.Chang@Sun.COM 
44512186SJanice.Chang@Sun.COM typedef enum {
44612186SJanice.Chang@Sun.COM 	NDMPD_ZFS_PROP_MINOR_0,
44712186SJanice.Chang@Sun.COM } ndmpd_zfs_prop_minor_t;
44812186SJanice.Chang@Sun.COM 
44912186SJanice.Chang@Sun.COM #define	NDMPD_ZFS_MAJOR_VERSION NDMPD_ZFS_MAJOR_0
45012186SJanice.Chang@Sun.COM #define	NDMPD_ZFS_MINOR_VERSION NDMPD_ZFS_MINOR_0
45112186SJanice.Chang@Sun.COM #define	NDMPD_ZFS_PROP_MAJOR_VERSION NDMPD_ZFS_PROP_MAJOR_0
45212186SJanice.Chang@Sun.COM #define	NDMPD_ZFS_PROP_MINOR_VERSION NDMPD_ZFS_PROP_MINOR_0
45312186SJanice.Chang@Sun.COM 
45412186SJanice.Chang@Sun.COM #pragma pack(1)
45512186SJanice.Chang@Sun.COM typedef struct {
45612186SJanice.Chang@Sun.COM 	char nzh_magic[14]; /* NDMPUTF8MAGIC\0 */
45712186SJanice.Chang@Sun.COM 	uint32_t nzh_major; /* major version */
45812186SJanice.Chang@Sun.COM 	uint32_t nzh_minor; /* minor version */
45912186SJanice.Chang@Sun.COM 	uint32_t nzh_hdrlen; /* length of hdr in bytes including magic */
46012186SJanice.Chang@Sun.COM 	/* future extensions */
46112186SJanice.Chang@Sun.COM } ndmpd_zfs_header_t;
46212186SJanice.Chang@Sun.COM #pragma pack()
46312186SJanice.Chang@Sun.COM 
46412186SJanice.Chang@Sun.COM #define	PIPE_TAPE 0
46512186SJanice.Chang@Sun.COM #define	PIPE_ZFS 1
46612186SJanice.Chang@Sun.COM 
46712186SJanice.Chang@Sun.COM #define	NDMPD_ZFS_DMP_NAME_MAX 32
46812186SJanice.Chang@Sun.COM 
46912186SJanice.Chang@Sun.COM typedef struct ndmpd_zfs_args {
47012186SJanice.Chang@Sun.COM 	zfs_type_t nz_type;			/* type of ZFS dataset */
47112186SJanice.Chang@Sun.COM 	char nz_dataset[ZFS_MAXNAMELEN];	/* dataset name */
47212186SJanice.Chang@Sun.COM 	char nz_snapname[ZFS_MAXNAMELEN];	/* snapname (following '@') */
47312186SJanice.Chang@Sun.COM 	char nz_fromsnap[ZFS_MAXNAMELEN];	/* snap of L-1 bkup */
47412186SJanice.Chang@Sun.COM 	char nz_snapprop[ZFS_MAXPROPLEN];	/* contents of snap incr prop */
47512186SJanice.Chang@Sun.COM 	boolean_t nz_ndmpd_snap;		/* ndmpd-generated snap? */
47612186SJanice.Chang@Sun.COM 
47712186SJanice.Chang@Sun.COM 	pthread_t nz_sendrecv_thread;		/* thread for send/recv */
47812186SJanice.Chang@Sun.COM 	pthread_t nz_tape_thread;		/* thread for tape r/w */
47912186SJanice.Chang@Sun.COM 	int32_t nz_pipe_fd[2];			/* pipe for above 2 threads */
48012186SJanice.Chang@Sun.COM 	int32_t nz_bufsize;			/* tape r/w buf size */
48112186SJanice.Chang@Sun.COM 	int64_t nz_window_len;			/* DMA window length */
48212186SJanice.Chang@Sun.COM 
48312186SJanice.Chang@Sun.COM 	int nz_level;				/* val of LEVEL env var */
48412186SJanice.Chang@Sun.COM 	char nz_zfs_mode;			/* val of ZFS_MODE env var */
48512186SJanice.Chang@Sun.COM 	boolean_t nz_zfs_force;			/* val of ZFS_FORCE env var */
48612186SJanice.Chang@Sun.COM 	boolean_t nz_update;			/* val of UPDATE env var */
48712186SJanice.Chang@Sun.COM 	char nz_dmp_name[NDMPD_ZFS_DMP_NAME_MAX]; /* val of DMP_NAME env var */
48812740SJanice.Chang@Sun.COM 	u_longlong_t nz_zfs_backup_size;	/* used for restore only */
48912186SJanice.Chang@Sun.COM 
49012186SJanice.Chang@Sun.COM 	ndmpd_module_params_t nz_params;
49112186SJanice.Chang@Sun.COM 	ndmp_lbr_params_t *nz_nlp;
49212186SJanice.Chang@Sun.COM 	libzfs_handle_t *nz_zlibh;		/* session-specific lzfs hdl */
49312186SJanice.Chang@Sun.COM 	ndmp_context_t nz_nctx;			/* used by plugin */
49412186SJanice.Chang@Sun.COM 
49512186SJanice.Chang@Sun.COM 	ndmpd_zfs_header_t nz_tape_header;	/* tape hdr for "zfs" backup */
49612186SJanice.Chang@Sun.COM } ndmpd_zfs_args_t;
49712186SJanice.Chang@Sun.COM 
49812186SJanice.Chang@Sun.COM #define	ndmpd_zfs_params (&(ndmpd_zfs_args)->nz_params)
49912186SJanice.Chang@Sun.COM 
5007917SReza.Sabdar@Sun.COM typedef struct ndmpd_session {
5017917SReza.Sabdar@Sun.COM 	ndmp_connection_t *ns_connection;	/* NDMP connection to client */
5027917SReza.Sabdar@Sun.COM 	boolean_t ns_eof;		/* connection EOF flag */
5037917SReza.Sabdar@Sun.COM 	ushort_t ns_protocol_version;	/* connection protocol version */
5047917SReza.Sabdar@Sun.COM 	ndmpd_session_scsi_desc_t ns_scsi;
5057917SReza.Sabdar@Sun.COM 	ndmpd_session_tape_desc_t ns_tape;
5067917SReza.Sabdar@Sun.COM 	ndmpd_session_mover_desc_t ns_mover;
5077917SReza.Sabdar@Sun.COM 	ndmpd_session_data_desc_t ns_data;
5087917SReza.Sabdar@Sun.COM 	ndmpd_session_file_history_t ns_fh;
5097917SReza.Sabdar@Sun.COM 	ndmpd_file_handler_t *ns_file_handler_list; /* for I/O multiplexing */
5107917SReza.Sabdar@Sun.COM 	int ns_nref;
5117917SReza.Sabdar@Sun.COM 	ndmp_lbr_params_t *ns_ndmp_lbr_params;
51212186SJanice.Chang@Sun.COM 	struct ndmpd_zfs_args ns_ndmpd_zfs_args;
51312186SJanice.Chang@Sun.COM 	ndmpd_backup_type_t ns_butype;
5147917SReza.Sabdar@Sun.COM 	mutex_t ns_lock;
5157917SReza.Sabdar@Sun.COM 
5167917SReza.Sabdar@Sun.COM 	/*
5177917SReza.Sabdar@Sun.COM 	 * NDMP V3
5187917SReza.Sabdar@Sun.COM 	 * Tape, SCSI, mover, data and file handlers will
5197917SReza.Sabdar@Sun.COM 	 * be shared between V2 and V3.
5207917SReza.Sabdar@Sun.COM 	 */
5217917SReza.Sabdar@Sun.COM 	ndmpd_session_file_history_v3_t ns_fh_v3;
5227917SReza.Sabdar@Sun.COM 	unsigned char ns_challenge[MD5_CHALLENGE_SIZE];  /* For MD5 */
5237917SReza.Sabdar@Sun.COM 
5247917SReza.Sabdar@Sun.COM 	/*
5257917SReza.Sabdar@Sun.COM 	 * NDMP V4 related data
5267917SReza.Sabdar@Sun.COM 	 */
5277917SReza.Sabdar@Sun.COM 	boolean_t ns_set_ext_list;
5287917SReza.Sabdar@Sun.COM 
5297917SReza.Sabdar@Sun.COM 	/* handling of hardlink, hardlink queue head */
5307917SReza.Sabdar@Sun.COM 	struct hardlink_q *hardlink_q;
5317917SReza.Sabdar@Sun.COM } ndmpd_session_t;
5327917SReza.Sabdar@Sun.COM 
5337917SReza.Sabdar@Sun.COM 
5347917SReza.Sabdar@Sun.COM /*
5357917SReza.Sabdar@Sun.COM  * NDMP request handler functions.
5367917SReza.Sabdar@Sun.COM  */
5377917SReza.Sabdar@Sun.COM 
5387917SReza.Sabdar@Sun.COM /* Config */
5397917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_host_info_v2;
5407917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_butype_attr_v2;
5417917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_mover_type_v2;
5427917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v2;
5437917SReza.Sabdar@Sun.COM 
5447917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_host_info_v3;
5457917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v3;
5467917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_connection_type_v3;
5477917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_auth_attr_v3;
5487917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_fs_info_v3;
5497917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_tape_info_v3;
5507917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_scsi_info_v3;
5517917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_server_info_v3;
5527917SReza.Sabdar@Sun.COM 
5537917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_butype_info_v4;
5547917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_get_ext_list_v4;
5557917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_config_set_ext_list_v4;
5567917SReza.Sabdar@Sun.COM 
5577917SReza.Sabdar@Sun.COM 
5587917SReza.Sabdar@Sun.COM /* Scsi */
5597917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_open_v2;
5607917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_close_v2;
5617917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_get_state_v2;
5627917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_set_target_v2;
5637917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_reset_device_v2;
5647917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_reset_bus_v2;
5657917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_execute_cdb_v2;
5667917SReza.Sabdar@Sun.COM 
5677917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_open_v3;
5687917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_scsi_set_target_v3;
5697917SReza.Sabdar@Sun.COM 
5707917SReza.Sabdar@Sun.COM 
5717917SReza.Sabdar@Sun.COM /* Tape */
5727917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_open_v2;
5737917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_close_v2;
5747917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_get_state_v2;
5757917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_mtio_v2;
5767917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_write_v2;
5777917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_read_v2;
5787917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_execute_cdb_v2;
5797917SReza.Sabdar@Sun.COM 
5807917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_open_v3;
5817917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_get_state_v3;
5827917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_write_v3;
5837917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_read_v3;
5847917SReza.Sabdar@Sun.COM 
5857917SReza.Sabdar@Sun.COM 
5867917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_tape_close_v4;
5877917SReza.Sabdar@Sun.COM /* Data */
5887917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_get_state_v2;
5897917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_start_backup_v2;
5907917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_start_recover_v2;
5917917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_get_env_v2;
5927917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_stop_v2;
5937917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_abort_v2;
5947917SReza.Sabdar@Sun.COM 
5957917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_get_state_v3;
5967917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_connect_v3;
5977917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_listen_v3;
5987917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_stop_v3;
5997917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_abort_v3;
6007917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_start_recover_v3;
6017917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_start_backup_v3;
6027917SReza.Sabdar@Sun.COM 
6037917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_get_env_v4;
6047917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_get_state_v4;
6057917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_connect_v4;
6067917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_listen_v4;
6077917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_data_start_recover_filehist_v4;
6087917SReza.Sabdar@Sun.COM 
6097917SReza.Sabdar@Sun.COM 
6107917SReza.Sabdar@Sun.COM /* Connect */
6117917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_connect_open_v2;
6127917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_connect_client_auth_v2;
6137917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_connect_server_auth_v2;
6147917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_connect_close_v2;
6157917SReza.Sabdar@Sun.COM 
6167917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_connect_client_auth_v3;
6177917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_connect_close_v3;
6187917SReza.Sabdar@Sun.COM 
6197917SReza.Sabdar@Sun.COM 
6207917SReza.Sabdar@Sun.COM /* Mover */
6217917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_get_state_v2;
6227917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_listen_v2;
6237917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_continue_v2;
6247917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_abort_v2;
6257917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_stop_v2;
6267917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_set_window_v2;
6277917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_read_v2;
6287917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_close_v2;
6297917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v2;
6307917SReza.Sabdar@Sun.COM 
6317917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_get_state_v3;
6327917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_listen_v3;
6337917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_continue_v3;
6347917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_abort_v3;
6357917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_set_window_v3;
6367917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_read_v3;
6377917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_set_record_size_v3;
6387917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_connect_v3;
6397917SReza.Sabdar@Sun.COM 
6407917SReza.Sabdar@Sun.COM 
6417917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_get_state_v4;
6427917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_listen_v4;
6437917SReza.Sabdar@Sun.COM ndmp_msg_handler_func_t ndmpd_mover_connect_v4;
6447917SReza.Sabdar@Sun.COM 
6457917SReza.Sabdar@Sun.COM 
6467917SReza.Sabdar@Sun.COM /*
6477917SReza.Sabdar@Sun.COM  * Backup/recover module API functions.
6487917SReza.Sabdar@Sun.COM  */
6497917SReza.Sabdar@Sun.COM ndmpd_get_env_func_t ndmpd_api_get_env;
6507917SReza.Sabdar@Sun.COM ndmpd_add_env_func_t ndmpd_api_add_env;
6517917SReza.Sabdar@Sun.COM ndmpd_add_env_func_t ndmpd_api_set_env;
6527917SReza.Sabdar@Sun.COM ndmpd_get_name_func_t ndmpd_api_get_name;
6537917SReza.Sabdar@Sun.COM ndmpd_dispatch_func_t ndmpd_api_dispatch;
6547917SReza.Sabdar@Sun.COM ndmpd_done_func_t ndmpd_api_done_v2;
6557917SReza.Sabdar@Sun.COM 
6567917SReza.Sabdar@Sun.COM 
6577917SReza.Sabdar@Sun.COM ndmpd_write_func_t ndmpd_api_write_v2;
6587917SReza.Sabdar@Sun.COM ndmpd_file_history_path_func_t ndmpd_api_file_history_path_v2;
6597917SReza.Sabdar@Sun.COM ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v2;
6607917SReza.Sabdar@Sun.COM ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v2;
6617917SReza.Sabdar@Sun.COM ndmpd_read_func_t ndmpd_api_read_v2;
6627917SReza.Sabdar@Sun.COM ndmpd_seek_func_t ndmpd_api_seek_v2;
6637917SReza.Sabdar@Sun.COM ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v2;
6647917SReza.Sabdar@Sun.COM ndmpd_add_file_handler_func_t ndmpd_api_add_file_handler;
6657917SReza.Sabdar@Sun.COM ndmpd_remove_file_handler_func_t ndmpd_api_remove_file_handler;
6667917SReza.Sabdar@Sun.COM 
6677917SReza.Sabdar@Sun.COM 
6687917SReza.Sabdar@Sun.COM /*
6697917SReza.Sabdar@Sun.COM  * NDMP V3
6707917SReza.Sabdar@Sun.COM  */
6717917SReza.Sabdar@Sun.COM ndmpd_done_func_t ndmpd_api_done_v3;
6727917SReza.Sabdar@Sun.COM ndmpd_write_func_t ndmpd_api_write_v3;
6737917SReza.Sabdar@Sun.COM ndmpd_read_func_t ndmpd_api_read_v3;
6747917SReza.Sabdar@Sun.COM ndmpd_seek_func_t ndmpd_api_seek_v3;
6757917SReza.Sabdar@Sun.COM ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v3;
6767917SReza.Sabdar@Sun.COM ndmpd_get_name_func_t ndmpd_api_get_name_v3;
6777917SReza.Sabdar@Sun.COM ndmpd_file_history_path_func_t ndmpd_api_file_history_file_v3;
6787917SReza.Sabdar@Sun.COM ndmpd_file_history_dir_func_t ndmpd_api_file_history_dir_v3;
6797917SReza.Sabdar@Sun.COM ndmpd_file_history_node_func_t ndmpd_api_file_history_node_v3;
6807917SReza.Sabdar@Sun.COM 
6817917SReza.Sabdar@Sun.COM /*
6827917SReza.Sabdar@Sun.COM  * NDMP V4
6837917SReza.Sabdar@Sun.COM  */
6847917SReza.Sabdar@Sun.COM ndmpd_log_func_v3_t ndmpd_api_log_v4;
6857917SReza.Sabdar@Sun.COM ndmpd_file_recovered_func_t ndmpd_api_file_recovered_v4;
6867917SReza.Sabdar@Sun.COM 
6877917SReza.Sabdar@Sun.COM #ifndef NO_NDMP_API_LOG_PROTOTYPES
6887917SReza.Sabdar@Sun.COM ndmpd_log_func_t ndmpd_api_log_v2;
6897917SReza.Sabdar@Sun.COM ndmpd_log_func_v3_t ndmpd_api_log_v3;
6907917SReza.Sabdar@Sun.COM #endif /* NO_NDMP_API_LOG_PROTOTYPES */
6917917SReza.Sabdar@Sun.COM 
6927917SReza.Sabdar@Sun.COM typedef void ndmpd_func_t(ndmp_connection_t *, void *);
6937917SReza.Sabdar@Sun.COM 
6947917SReza.Sabdar@Sun.COM /*
6957917SReza.Sabdar@Sun.COM  * pthread call arg parameters
6967917SReza.Sabdar@Sun.COM  */
6977917SReza.Sabdar@Sun.COM typedef struct {
6987917SReza.Sabdar@Sun.COM 	int nw_sock;
6997917SReza.Sabdar@Sun.COM 	long nw_ipaddr;
7007917SReza.Sabdar@Sun.COM 	ndmp_con_handler_func_t nw_con_handler_func;
7017917SReza.Sabdar@Sun.COM } ndmpd_worker_arg_t;
7027917SReza.Sabdar@Sun.COM 
7037917SReza.Sabdar@Sun.COM typedef struct {
7047917SReza.Sabdar@Sun.COM 	char *br_jname;
7057917SReza.Sabdar@Sun.COM 	ndmp_lbr_params_t *br_nlp;
7067917SReza.Sabdar@Sun.COM 	tlm_commands_t *br_cmds;
7077917SReza.Sabdar@Sun.COM 	pthread_barrier_t br_barrier;
7087917SReza.Sabdar@Sun.COM } backup_reader_arg_t;
7097917SReza.Sabdar@Sun.COM 
7107917SReza.Sabdar@Sun.COM typedef struct {
7117917SReza.Sabdar@Sun.COM 	ndmpd_session_t *tr_session;
7127917SReza.Sabdar@Sun.COM 	ndmpd_module_params_t *tr_mod_params;
7137917SReza.Sabdar@Sun.COM 	tlm_commands_t *tr_cmds;
7147917SReza.Sabdar@Sun.COM } ndmp_tar_reader_arg_t;
7157917SReza.Sabdar@Sun.COM 
71610038SReza.Sabdar@Sun.COM typedef struct {
71710038SReza.Sabdar@Sun.COM 	ndmpd_session_t *bs_session;
71810038SReza.Sabdar@Sun.COM 	char *bs_jname;
71910038SReza.Sabdar@Sun.COM 	char *bs_path;
72010038SReza.Sabdar@Sun.COM } ndmp_bkup_size_arg_t;
72110038SReza.Sabdar@Sun.COM 
7227917SReza.Sabdar@Sun.COM /*
7237917SReza.Sabdar@Sun.COM  * Variables from ndmpd_comm.c
7247917SReza.Sabdar@Sun.COM  */
7257917SReza.Sabdar@Sun.COM extern int ndmp_ver;
7267917SReza.Sabdar@Sun.COM extern int ndmp_full_restore_path;
7277917SReza.Sabdar@Sun.COM extern int ndmp_dar_support;
7287917SReza.Sabdar@Sun.COM extern int ndmp_port;
7297917SReza.Sabdar@Sun.COM extern ndmp_stat_t ndstat;
7307917SReza.Sabdar@Sun.COM 
7317917SReza.Sabdar@Sun.COM extern void ndmpd_main(void);
7327917SReza.Sabdar@Sun.COM extern void connection_handler(ndmp_connection_t *);
7337917SReza.Sabdar@Sun.COM extern void ndmpd_audit_backup(ndmp_connection_t *conn, char *path,
7347917SReza.Sabdar@Sun.COM     int dest, char *local_path, int result);
7357917SReza.Sabdar@Sun.COM extern void ndmpd_audit_restore(ndmp_connection_t *conn,
7367917SReza.Sabdar@Sun.COM     char *path, int dest, char *local_path, int result);
7377917SReza.Sabdar@Sun.COM extern void ndmpd_audit_connect(ndmp_connection_t *conn,
7387917SReza.Sabdar@Sun.COM     int result);
7397917SReza.Sabdar@Sun.COM extern void ndmpd_audit_disconnect(ndmp_connection_t *conn);
7407917SReza.Sabdar@Sun.COM 
7417917SReza.Sabdar@Sun.COM /* Variables from ndmpd_main.c */
7427917SReza.Sabdar@Sun.COM extern	libzfs_handle_t	*zlibh;
7437917SReza.Sabdar@Sun.COM extern	mutex_t	zlib_mtx;
7447917SReza.Sabdar@Sun.COM 
7457917SReza.Sabdar@Sun.COM /*
7467917SReza.Sabdar@Sun.COM  * Utility from ndmpd_connect.c.
7477917SReza.Sabdar@Sun.COM  */
7487917SReza.Sabdar@Sun.COM extern int ndmp_connect_list_add(ndmp_connection_t *, int *);
7497917SReza.Sabdar@Sun.COM extern int ndmp_connect_list_del(ndmp_connection_t *);
7507917SReza.Sabdar@Sun.COM extern int ndmpd_connect_kill_id(int);
7517917SReza.Sabdar@Sun.COM extern void ndmp_connect_list_get(ndmp_door_ctx_t *);
7527917SReza.Sabdar@Sun.COM extern void ndmpd_get_devs(ndmp_door_ctx_t *);
7537917SReza.Sabdar@Sun.COM 
7547917SReza.Sabdar@Sun.COM /*
7557917SReza.Sabdar@Sun.COM  * Utility functions form ndmpd_data.c.
7567917SReza.Sabdar@Sun.COM  */
7577917SReza.Sabdar@Sun.COM extern void ndmpd_data_cleanup(ndmpd_session_t *);
7587917SReza.Sabdar@Sun.COM extern int ndmpd_data_init(ndmpd_session_t *);
7597917SReza.Sabdar@Sun.COM extern char *ndmp_data_get_mover_mode(ndmpd_session_t *);
7607917SReza.Sabdar@Sun.COM extern void ndmpd_data_error(ndmpd_session_t *, ndmp_data_halt_reason);
7617917SReza.Sabdar@Sun.COM 
7627917SReza.Sabdar@Sun.COM 
7637917SReza.Sabdar@Sun.COM /*
7647917SReza.Sabdar@Sun.COM  * Utility functions from ndmpd_mover.c.
7657917SReza.Sabdar@Sun.COM  */
7667917SReza.Sabdar@Sun.COM extern int ndmpd_mover_init(ndmpd_session_t *);
7677917SReza.Sabdar@Sun.COM extern void ndmpd_mover_cleanup(ndmpd_session_t *);
7687917SReza.Sabdar@Sun.COM extern ndmp_error ndmpd_mover_connect(ndmpd_session_t *,
7697917SReza.Sabdar@Sun.COM     ndmp_mover_mode);
7707917SReza.Sabdar@Sun.COM extern void ndmpd_mover_error(ndmpd_session_t *,
7717917SReza.Sabdar@Sun.COM     ndmp_mover_halt_reason);
7727917SReza.Sabdar@Sun.COM extern int ndmpd_mover_seek(ndmpd_session_t *,
7737917SReza.Sabdar@Sun.COM     u_longlong_t,
7747917SReza.Sabdar@Sun.COM     u_longlong_t);
7757917SReza.Sabdar@Sun.COM extern int ndmpd_local_write(ndmpd_session_t *,
7767917SReza.Sabdar@Sun.COM     char *,
7777917SReza.Sabdar@Sun.COM     ulong_t);
7787917SReza.Sabdar@Sun.COM extern int ndmpd_remote_write(ndmpd_session_t *,
7797917SReza.Sabdar@Sun.COM     char *,
7807917SReza.Sabdar@Sun.COM     ulong_t);
7817917SReza.Sabdar@Sun.COM extern int ndmpd_local_read(ndmpd_session_t *,
7827917SReza.Sabdar@Sun.COM     char *,
7837917SReza.Sabdar@Sun.COM     ulong_t);
7847917SReza.Sabdar@Sun.COM extern int ndmpd_remote_read(ndmpd_session_t *,
7857917SReza.Sabdar@Sun.COM     char *,
7867917SReza.Sabdar@Sun.COM     ulong_t);
7877917SReza.Sabdar@Sun.COM 
7887917SReza.Sabdar@Sun.COM extern void ndmpd_mover_shut_down(ndmpd_session_t *);
7897917SReza.Sabdar@Sun.COM extern void ndmpd_mover_error(ndmpd_session_t *,
7907917SReza.Sabdar@Sun.COM     ndmp_mover_halt_reason);
7917917SReza.Sabdar@Sun.COM extern int ndmpd_local_write_v3(ndmpd_session_t *,
7927917SReza.Sabdar@Sun.COM     char *,
7937917SReza.Sabdar@Sun.COM     ulong_t);
7947917SReza.Sabdar@Sun.COM extern int ndmpd_local_read_v3(ndmpd_session_t *,
7957917SReza.Sabdar@Sun.COM     char *,
7967917SReza.Sabdar@Sun.COM     ulong_t);
7977917SReza.Sabdar@Sun.COM extern int ndmpd_remote_read_v3(ndmpd_session_t *,
7987917SReza.Sabdar@Sun.COM     char *,
7997917SReza.Sabdar@Sun.COM     ulong_t);
8007917SReza.Sabdar@Sun.COM extern int ndmpd_mover_wait_v3(ndmpd_session_t *);
8017917SReza.Sabdar@Sun.COM extern void ndmpd_write_eom(int);
8027917SReza.Sabdar@Sun.COM 
8037917SReza.Sabdar@Sun.COM 
8047917SReza.Sabdar@Sun.COM /*
8057917SReza.Sabdar@Sun.COM  * Utility functions from ndmpd_file_history.c
8067917SReza.Sabdar@Sun.COM  */
8077917SReza.Sabdar@Sun.COM extern void ndmpd_file_history_init(ndmpd_session_t *);
8087917SReza.Sabdar@Sun.COM extern void ndmpd_file_history_cleanup(ndmpd_session_t *,
8097917SReza.Sabdar@Sun.COM     boolean_t);
8107917SReza.Sabdar@Sun.COM extern int ndmpd_file_history_path(lbr_fhlog_call_backs_t *,
8117917SReza.Sabdar@Sun.COM     char *,
8127917SReza.Sabdar@Sun.COM     struct stat64 *,
8137917SReza.Sabdar@Sun.COM     u_longlong_t);
8147917SReza.Sabdar@Sun.COM extern int ndmpd_file_history_dir(lbr_fhlog_call_backs_t *,
8157917SReza.Sabdar@Sun.COM     char *,
8167917SReza.Sabdar@Sun.COM     struct stat64 *);
8177917SReza.Sabdar@Sun.COM extern int ndmpd_file_history_node(lbr_fhlog_call_backs_t *,
8187917SReza.Sabdar@Sun.COM     char *,
8197917SReza.Sabdar@Sun.COM     char *,
8207917SReza.Sabdar@Sun.COM     struct stat64 *,
8217917SReza.Sabdar@Sun.COM     u_longlong_t);
8227917SReza.Sabdar@Sun.COM extern int
8237917SReza.Sabdar@Sun.COM ndmpd_path_restored(lbr_fhlog_call_backs_t *,
8247917SReza.Sabdar@Sun.COM     char *,
8257917SReza.Sabdar@Sun.COM     struct stat64 *,
8267917SReza.Sabdar@Sun.COM     u_longlong_t);
8277917SReza.Sabdar@Sun.COM extern int ndmpd_fhpath_v3_cb(lbr_fhlog_call_backs_t *,
8287917SReza.Sabdar@Sun.COM     char *,
8297917SReza.Sabdar@Sun.COM     struct stat64 *,
8307917SReza.Sabdar@Sun.COM     u_longlong_t);
8317917SReza.Sabdar@Sun.COM extern int ndmpd_fhdir_v3_cb(lbr_fhlog_call_backs_t *,
8327917SReza.Sabdar@Sun.COM     char *,
8337917SReza.Sabdar@Sun.COM     struct stat64 *);
8347917SReza.Sabdar@Sun.COM extern int ndmpd_fhnode_v3_cb(lbr_fhlog_call_backs_t *,
8357917SReza.Sabdar@Sun.COM     char *,
8367917SReza.Sabdar@Sun.COM     char *,
8377917SReza.Sabdar@Sun.COM     struct stat64 *,
8387917SReza.Sabdar@Sun.COM     u_longlong_t);
8397917SReza.Sabdar@Sun.COM extern int ndmpd_path_restored_v3(lbr_fhlog_call_backs_t *,
8407917SReza.Sabdar@Sun.COM     char *,
8417917SReza.Sabdar@Sun.COM     struct stat64 *,
8427917SReza.Sabdar@Sun.COM     u_longlong_t);
8437917SReza.Sabdar@Sun.COM 
8447917SReza.Sabdar@Sun.COM extern int ndmp_send_recovery_stat_v3(ndmpd_module_params_t *,
8457917SReza.Sabdar@Sun.COM     ndmp_lbr_params_t *,
8467917SReza.Sabdar@Sun.COM     int,
8477917SReza.Sabdar@Sun.COM     int);
8487917SReza.Sabdar@Sun.COM 
8497917SReza.Sabdar@Sun.COM 
8507917SReza.Sabdar@Sun.COM /*
8517917SReza.Sabdar@Sun.COM  * Utility functions from ndmpd_dtime.c
8527917SReza.Sabdar@Sun.COM  */
8537917SReza.Sabdar@Sun.COM extern int ndmpd_put_dumptime(char *, int, time_t);
8547917SReza.Sabdar@Sun.COM extern int ndmpd_get_dumptime(char *, int *, time_t *);
8557917SReza.Sabdar@Sun.COM extern int ndmpd_append_dumptime(char *, char *, int, time_t);
8567917SReza.Sabdar@Sun.COM 
8577917SReza.Sabdar@Sun.COM 
8587917SReza.Sabdar@Sun.COM /*
8597917SReza.Sabdar@Sun.COM  * Global variables from ndmpd_tar3.c
8607917SReza.Sabdar@Sun.COM  */
8617917SReza.Sabdar@Sun.COM extern char **ndmp_excl_list;
8627917SReza.Sabdar@Sun.COM 
8637917SReza.Sabdar@Sun.COM 
8647917SReza.Sabdar@Sun.COM /*
8657917SReza.Sabdar@Sun.COM  * Global variables from ndmpd_util.c
8667917SReza.Sabdar@Sun.COM  */
8677917SReza.Sabdar@Sun.COM extern int ndmp_force_bk_dirs;
8687917SReza.Sabdar@Sun.COM extern int ndmp_rbs;
8697917SReza.Sabdar@Sun.COM extern int ndmp_sbs;
8707917SReza.Sabdar@Sun.COM extern boolean_t ndmp_dump_path_node;
8717917SReza.Sabdar@Sun.COM extern boolean_t ndmp_tar_path_node;
8727917SReza.Sabdar@Sun.COM extern boolean_t ndmp_ignore_ctime;
8737917SReza.Sabdar@Sun.COM extern boolean_t ndmp_include_lmtime;
8747917SReza.Sabdar@Sun.COM 
8757917SReza.Sabdar@Sun.COM 
8767917SReza.Sabdar@Sun.COM /*
8777917SReza.Sabdar@Sun.COM  * Utility functions from ndmpd_util.c.
8787917SReza.Sabdar@Sun.COM  */
8797917SReza.Sabdar@Sun.COM extern int ndmpd_select(ndmpd_session_t *,
8807917SReza.Sabdar@Sun.COM     boolean_t,
8817917SReza.Sabdar@Sun.COM     ulong_t);
8827917SReza.Sabdar@Sun.COM 
8837917SReza.Sabdar@Sun.COM extern ndmp_error ndmpd_save_env(ndmpd_session_t *,
8847917SReza.Sabdar@Sun.COM     ndmp_pval *,
8857917SReza.Sabdar@Sun.COM     ulong_t);
8867917SReza.Sabdar@Sun.COM 
8877917SReza.Sabdar@Sun.COM extern void ndmpd_free_env(ndmpd_session_t *);
8887917SReza.Sabdar@Sun.COM extern ndmp_error ndmpd_save_nlist_v2(ndmpd_session_t *,
8897917SReza.Sabdar@Sun.COM     ndmp_name *,
8907917SReza.Sabdar@Sun.COM     ulong_t);
8917917SReza.Sabdar@Sun.COM 
8927917SReza.Sabdar@Sun.COM extern void ndmpd_free_nlist(ndmpd_session_t *);
8937917SReza.Sabdar@Sun.COM extern int ndmpd_add_file_handler(ndmpd_session_t *,
8947917SReza.Sabdar@Sun.COM     void *,
8957917SReza.Sabdar@Sun.COM     int,
8967917SReza.Sabdar@Sun.COM     ulong_t,
8977917SReza.Sabdar@Sun.COM     ulong_t,
8987917SReza.Sabdar@Sun.COM     ndmpd_file_handler_func_t *);
8997917SReza.Sabdar@Sun.COM 
9007917SReza.Sabdar@Sun.COM extern int ndmpd_remove_file_handler(ndmpd_session_t *,
9017917SReza.Sabdar@Sun.COM     int);
9027917SReza.Sabdar@Sun.COM 
9037917SReza.Sabdar@Sun.COM extern void ndmp_send_reply(ndmp_connection_t *,
9047917SReza.Sabdar@Sun.COM     void *,
9057917SReza.Sabdar@Sun.COM     char *);
9067917SReza.Sabdar@Sun.COM 
9077917SReza.Sabdar@Sun.COM extern int ndmp_mtioctl(int, int, int);
9087917SReza.Sabdar@Sun.COM 
9097917SReza.Sabdar@Sun.COM extern u_longlong_t quad_to_long_long(ndmp_u_quad);
9107917SReza.Sabdar@Sun.COM extern ndmp_u_quad long_long_to_quad(u_longlong_t);
9117917SReza.Sabdar@Sun.COM 
9127917SReza.Sabdar@Sun.COM extern void ndmp_set_socket_nodelay(int);
9137917SReza.Sabdar@Sun.COM extern void ndmp_set_socket_snd_buf(int, int);
9147917SReza.Sabdar@Sun.COM extern void ndmp_set_socket_rcv_buf(int, int);
9157917SReza.Sabdar@Sun.COM 
9167917SReza.Sabdar@Sun.COM extern long ndmp_buffer_get_size(ndmpd_session_t *);
9177917SReza.Sabdar@Sun.COM extern int ndmp_lbr_init(ndmpd_session_t *);
9187917SReza.Sabdar@Sun.COM extern void ndmp_lbr_cleanup(ndmpd_session_t *);
9197917SReza.Sabdar@Sun.COM 
9207917SReza.Sabdar@Sun.COM extern void nlp_ref_nw(ndmpd_session_t *);
9217917SReza.Sabdar@Sun.COM extern void nlp_unref_nw(ndmpd_session_t *);
9227917SReza.Sabdar@Sun.COM extern void nlp_wait_nw(ndmpd_session_t *);
9237917SReza.Sabdar@Sun.COM extern void nlp_event_nw(ndmpd_session_t *);
9247917SReza.Sabdar@Sun.COM extern int nlp_event_rv_get(ndmpd_session_t *);
9257917SReza.Sabdar@Sun.COM extern void nlp_event_rv_set(ndmpd_session_t *, int);
9267917SReza.Sabdar@Sun.COM extern boolean_t is_buffer_erroneous(tlm_buffer_t *);
9277917SReza.Sabdar@Sun.COM extern void ndmp_execute_cdb(ndmpd_session_t *,
9287917SReza.Sabdar@Sun.COM     char *,
9297917SReza.Sabdar@Sun.COM     int,
9307917SReza.Sabdar@Sun.COM     int,
9317917SReza.Sabdar@Sun.COM     ndmp_execute_cdb_request *);
9327917SReza.Sabdar@Sun.COM 
9337917SReza.Sabdar@Sun.COM extern scsi_adapter_t *scsi_get_adapter(int);
9347917SReza.Sabdar@Sun.COM extern boolean_t is_tape_unit_ready(char *, int);
9357917SReza.Sabdar@Sun.COM 
9367917SReza.Sabdar@Sun.COM extern int ndmp_open_list_add(ndmp_connection_t *, char *, int, int, int);
9377917SReza.Sabdar@Sun.COM extern int ndmp_open_list_del(char *, int, int);
9387917SReza.Sabdar@Sun.COM extern void ndmp_open_list_release(ndmp_connection_t *);
9397917SReza.Sabdar@Sun.COM 
9407917SReza.Sabdar@Sun.COM extern void ndmp_stop_buffer_worker(ndmpd_session_t *);
9417917SReza.Sabdar@Sun.COM extern void ndmp_stop_reader_thread(ndmpd_session_t *);
9427917SReza.Sabdar@Sun.COM extern void ndmp_stop_writer_thread(ndmpd_session_t *);
9437917SReza.Sabdar@Sun.COM extern void ndmp_free_reader_writer_ipc(ndmpd_session_t *);
9447917SReza.Sabdar@Sun.COM extern void ndmp_waitfor_op(ndmpd_session_t *);
9457917SReza.Sabdar@Sun.COM 
9467917SReza.Sabdar@Sun.COM extern char *cctime(time_t *);
9477917SReza.Sabdar@Sun.COM extern char *ndmp_new_job_name(char *);
9487917SReza.Sabdar@Sun.COM extern char *ndmpd_mk_temp(char *);
9497917SReza.Sabdar@Sun.COM extern char *ndmpd_make_bk_dir_path(char *, char *);
9507917SReza.Sabdar@Sun.COM extern boolean_t ndmp_is_chkpnt_root(char *);
9517917SReza.Sabdar@Sun.COM extern char **ndmpd_make_exc_list(void);
9527917SReza.Sabdar@Sun.COM extern void ndmp_sort_nlist_v3(ndmpd_session_t *);
9537917SReza.Sabdar@Sun.COM extern int ndmp_get_bk_dir_ino(ndmp_lbr_params_t *);
9547917SReza.Sabdar@Sun.COM extern int ndmp_write_utf8magic(tlm_cmd_t *);
9557917SReza.Sabdar@Sun.COM extern int ndmp_tar_writer(ndmpd_session_t *,
9567917SReza.Sabdar@Sun.COM     ndmpd_module_params_t *,
9577917SReza.Sabdar@Sun.COM     tlm_commands_t *);
9587917SReza.Sabdar@Sun.COM extern void ndmp_wait_for_reader(tlm_commands_t *);
9597917SReza.Sabdar@Sun.COM extern ndmp_error ndmpd_save_nlist_v3(ndmpd_session_t *,
9607917SReza.Sabdar@Sun.COM     ndmp_name_v3 *,
9617917SReza.Sabdar@Sun.COM     ulong_t);
9627917SReza.Sabdar@Sun.COM extern void ndmpd_free_nlist_v3(ndmpd_session_t *);
9637917SReza.Sabdar@Sun.COM extern int ndmp_create_socket(ulong_t *, ushort_t *);
9647917SReza.Sabdar@Sun.COM extern int ndmp_connect_sock_v3(ulong_t, ushort_t);
9657917SReza.Sabdar@Sun.COM extern void ndmp_copy_addr_v3(ndmp_addr_v3 *, ndmp_addr_v3 *);
9667917SReza.Sabdar@Sun.COM extern void ndmp_copy_addr_v4(ndmp_addr_v4 *, ndmp_addr_v4 *);
9677917SReza.Sabdar@Sun.COM extern char *ndmp_addr2str_v3(ndmp_addr_type);
9687917SReza.Sabdar@Sun.COM extern boolean_t ndmp_valid_v3addr_type(ndmp_addr_type);
9697917SReza.Sabdar@Sun.COM extern boolean_t ndmp_check_utf8magic(tlm_cmd_t *);
9707917SReza.Sabdar@Sun.COM extern int ndmp_get_cur_bk_time(ndmp_lbr_params_t *,
9717917SReza.Sabdar@Sun.COM     time_t *, char *);
9727917SReza.Sabdar@Sun.COM extern char *ndmp_get_relative_path(char *, char *);
9737917SReza.Sabdar@Sun.COM 
9747917SReza.Sabdar@Sun.COM extern boolean_t ndmp_fhinode;
9757917SReza.Sabdar@Sun.COM extern void ndmp_load_params(void);
9767917SReza.Sabdar@Sun.COM extern void randomize(unsigned char *, int);
9777917SReza.Sabdar@Sun.COM 
9787917SReza.Sabdar@Sun.COM 
9797917SReza.Sabdar@Sun.COM /*
9807917SReza.Sabdar@Sun.COM  * Utility functions from ndmpd_tar3.c.
9817917SReza.Sabdar@Sun.COM  */
9827917SReza.Sabdar@Sun.COM extern ndmp_error ndmp_restore_get_params_v3(ndmpd_session_t *,
9837917SReza.Sabdar@Sun.COM     ndmpd_module_params_t *);
9847917SReza.Sabdar@Sun.COM extern ndmp_error ndmp_backup_get_params_v3(ndmpd_session_t *,
9857917SReza.Sabdar@Sun.COM     ndmpd_module_params_t *);
9867917SReza.Sabdar@Sun.COM 
9877917SReza.Sabdar@Sun.COM /*
9887917SReza.Sabdar@Sun.COM  * door init and fini function from ndmpd_door_serv.c
9897917SReza.Sabdar@Sun.COM  */
9907917SReza.Sabdar@Sun.COM extern int ndmp_door_init(void);
9917917SReza.Sabdar@Sun.COM extern void ndmp_door_fini(void);
9927917SReza.Sabdar@Sun.COM extern boolean_t ndmp_door_check(void);
9937917SReza.Sabdar@Sun.COM 
9947917SReza.Sabdar@Sun.COM extern int ndmp_get_max_tok_seq(void);
9957917SReza.Sabdar@Sun.COM extern boolean_t set_debug_level(boolean_t);
9967917SReza.Sabdar@Sun.COM extern boolean_t get_debug_level(void);
9977917SReza.Sabdar@Sun.COM 
9987917SReza.Sabdar@Sun.COM extern int get_zfsvolname(char *, int, char *);
99912904SReza.Sabdar@Sun.COM extern int ndmp_create_snapshot(char *, char *);
100012904SReza.Sabdar@Sun.COM extern int ndmp_remove_snapshot(char *, char *);
10017917SReza.Sabdar@Sun.COM extern int ndmpd_mark_inodes_v2(ndmpd_session_t *, ndmp_lbr_params_t *);
10027917SReza.Sabdar@Sun.COM extern void ndmpd_abort_marking_v2(ndmpd_session_t *);
10037917SReza.Sabdar@Sun.COM extern int ndmpd_mark_inodes_v3(ndmpd_session_t *, ndmp_lbr_params_t *);
10047917SReza.Sabdar@Sun.COM extern ndmp_lbr_params_t *ndmp_get_nlp(void *);
10057917SReza.Sabdar@Sun.COM 
100612186SJanice.Chang@Sun.COM module_start_func_t ndmpd_tar_backup_starter;
100712186SJanice.Chang@Sun.COM module_abort_func_t ndmpd_tar_backup_abort;
10087917SReza.Sabdar@Sun.COM 
100912186SJanice.Chang@Sun.COM module_start_func_t ndmpd_tar_restore_starter;
101012186SJanice.Chang@Sun.COM module_abort_func_t ndmpd_tar_restore_abort;
10117917SReza.Sabdar@Sun.COM 
10127917SReza.Sabdar@Sun.COM module_start_func_t ndmpd_tar_backup_starter_v3;
10137917SReza.Sabdar@Sun.COM module_abort_func_t ndmpd_tar_backup_abort_v3;
10147917SReza.Sabdar@Sun.COM 
10157917SReza.Sabdar@Sun.COM module_start_func_t ndmpd_tar_restore_starter_v3;
10167917SReza.Sabdar@Sun.COM module_abort_func_t ndmpd_tar_restore_abort_v3;
10177917SReza.Sabdar@Sun.COM 
10187917SReza.Sabdar@Sun.COM extern int ndmp_backup_extract_params(ndmpd_session_t *,
10197917SReza.Sabdar@Sun.COM     ndmpd_module_params_t *);
10207917SReza.Sabdar@Sun.COM extern int ndmp_restore_extract_params(ndmpd_session_t *,
10217917SReza.Sabdar@Sun.COM     ndmpd_module_params_t *);
10227917SReza.Sabdar@Sun.COM extern int ndmp_tar_reader(ndmp_tar_reader_arg_t *);
10237917SReza.Sabdar@Sun.COM 
10247917SReza.Sabdar@Sun.COM extern int tape_open(char *, int);
10257917SReza.Sabdar@Sun.COM 
10267917SReza.Sabdar@Sun.COM extern void ndmp_session_ref(ndmpd_session_t *);
10277917SReza.Sabdar@Sun.COM extern void ndmp_session_unref(ndmpd_session_t *);
10287917SReza.Sabdar@Sun.COM 
10297917SReza.Sabdar@Sun.COM void ndmpd_get_file_entry_type(int, ndmp_file_type *);
10307917SReza.Sabdar@Sun.COM 
10317917SReza.Sabdar@Sun.COM extern int tcp_accept(int, unsigned int *);
10327917SReza.Sabdar@Sun.COM extern int tcp_get_peer(int, unsigned int *, int *);
10337917SReza.Sabdar@Sun.COM 
10347917SReza.Sabdar@Sun.COM extern char *gethostaddr(void);
1035*13023SReza.Sabdar@Sun.COM extern char *get_default_nic_addr(void);
10367917SReza.Sabdar@Sun.COM extern int tlm_init(void);
10377917SReza.Sabdar@Sun.COM 
103812904SReza.Sabdar@Sun.COM extern int snapshot_create(char *, char *, boolean_t, boolean_t);
103912904SReza.Sabdar@Sun.COM extern int snapshot_destroy(char *, char *, boolean_t, boolean_t, int *);
10407917SReza.Sabdar@Sun.COM 
10417917SReza.Sabdar@Sun.COM extern boolean_t fs_is_chkpntvol(char *);
10427917SReza.Sabdar@Sun.COM extern boolean_t fs_is_chkpnt_enabled(char *);
10437917SReza.Sabdar@Sun.COM extern boolean_t fs_is_rdonly(char *);
10447917SReza.Sabdar@Sun.COM extern boolean_t fs_volexist(char *);
10457917SReza.Sabdar@Sun.COM extern boolean_t fs_is_valid_logvol(char *);
10467917SReza.Sabdar@Sun.COM extern boolean_t rootfs_dot_or_dotdot(char *);
10477917SReza.Sabdar@Sun.COM extern int dp_readdir(DIR *, unsigned long *, char *,
10487917SReza.Sabdar@Sun.COM     int *, unsigned long *);
10497917SReza.Sabdar@Sun.COM 
10507917SReza.Sabdar@Sun.COM extern void scsi_find_sid_lun();
10517917SReza.Sabdar@Sun.COM extern char *sasd_slink_name();
10527917SReza.Sabdar@Sun.COM extern int scsi_dev_exists(char *, int, int);
10537917SReza.Sabdar@Sun.COM extern int scsi_get_devtype(char *, int, int);
10547917SReza.Sabdar@Sun.COM extern struct open_list *ndmp_open_list_find(char *, int, int);
10557917SReza.Sabdar@Sun.COM extern int filecopy(char *, char *);
10567917SReza.Sabdar@Sun.COM 
10577917SReza.Sabdar@Sun.COM extern void ndmp_stop_local_reader();
10587917SReza.Sabdar@Sun.COM extern void ndmp_stop_remote_reader();
10597917SReza.Sabdar@Sun.COM 
10607917SReza.Sabdar@Sun.COM extern boolean_t match(char *, char *);
10617917SReza.Sabdar@Sun.COM extern char *trim_whitespace(char *);
10629714SReza.Sabdar@Sun.COM extern int fs_getstat(char *, struct fs_fhandle *, struct stat64 *);
10637917SReza.Sabdar@Sun.COM extern int fs_readdir(struct fs_fhandle *, char *, long *,
10649714SReza.Sabdar@Sun.COM     char *, int *, struct fs_fhandle *, struct stat64 *);
10657917SReza.Sabdar@Sun.COM extern int iscreated(ndmp_lbr_params_t *nlp, char *name, tlm_acls_t *tacl,
10667917SReza.Sabdar@Sun.COM     time_t t);
10677917SReza.Sabdar@Sun.COM 
10687917SReza.Sabdar@Sun.COM extern int sasd_dev_count(void);
10697917SReza.Sabdar@Sun.COM extern struct scsi_link *sasd_dev_slink(int);
10707917SReza.Sabdar@Sun.COM extern struct sasd_drive *sasd_drive(int);
10717917SReza.Sabdar@Sun.COM extern void *ndmp_malloc(size_t size);
10727917SReza.Sabdar@Sun.COM 
10737917SReza.Sabdar@Sun.COM extern ndmp_plugin_t *ndmp_pl;
107412186SJanice.Chang@Sun.COM 
107512186SJanice.Chang@Sun.COM #define	NDMP_APILOG(s, t, m, ...) \
107612186SJanice.Chang@Sun.COM { \
107712186SJanice.Chang@Sun.COM 	if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV4) \
107812186SJanice.Chang@Sun.COM 		(void) ndmpd_api_log_v4(s, t, m, __VA_ARGS__); \
107912186SJanice.Chang@Sun.COM 	else if (((ndmpd_session_t *)(s))->ns_protocol_version == NDMPV3) \
108012186SJanice.Chang@Sun.COM 		(void) ndmpd_api_log_v3(s, t, m, __VA_ARGS__); \
108112186SJanice.Chang@Sun.COM 	else \
108212186SJanice.Chang@Sun.COM 		(void) ndmpd_api_log_v2(s, __VA_ARGS__); \
108312186SJanice.Chang@Sun.COM }
108412186SJanice.Chang@Sun.COM 
108512186SJanice.Chang@Sun.COM /*
108612186SJanice.Chang@Sun.COM  * Backup path utility functions
108712186SJanice.Chang@Sun.COM  */
108812186SJanice.Chang@Sun.COM extern char *get_backup_path_v3(ndmpd_module_params_t *);
108912186SJanice.Chang@Sun.COM extern char *get_backup_path_v2(ndmpd_module_params_t *);
109012186SJanice.Chang@Sun.COM 
109112186SJanice.Chang@Sun.COM /*
109212186SJanice.Chang@Sun.COM  * Functions for zfs-based backup
109312186SJanice.Chang@Sun.COM  */
109412186SJanice.Chang@Sun.COM 
109512186SJanice.Chang@Sun.COM module_start_func_t ndmpd_zfs_backup_starter;
109612186SJanice.Chang@Sun.COM module_start_func_t ndmpd_zfs_restore_starter;
109712186SJanice.Chang@Sun.COM module_abort_func_t ndmpd_zfs_abort;
109812186SJanice.Chang@Sun.COM 
109912186SJanice.Chang@Sun.COM int ndmpd_zfs_init(ndmpd_session_t *);
110012186SJanice.Chang@Sun.COM void ndmpd_zfs_fini(ndmpd_zfs_args_t *);
110112186SJanice.Chang@Sun.COM 
110212186SJanice.Chang@Sun.COM boolean_t ndmpd_zfs_backup_parms_valid(ndmpd_zfs_args_t *);
110312186SJanice.Chang@Sun.COM boolean_t ndmpd_zfs_restore_parms_valid(ndmpd_zfs_args_t *);
110412186SJanice.Chang@Sun.COM 
110512186SJanice.Chang@Sun.COM int ndmpd_zfs_pre_backup(ndmpd_zfs_args_t *);
110612186SJanice.Chang@Sun.COM int ndmpd_zfs_pre_restore(ndmpd_zfs_args_t *);
110712186SJanice.Chang@Sun.COM int ndmpd_zfs_post_backup(ndmpd_zfs_args_t *);
110812186SJanice.Chang@Sun.COM int ndmpd_zfs_post_restore(ndmpd_zfs_args_t *);
110912186SJanice.Chang@Sun.COM 
111012186SJanice.Chang@Sun.COM void ndmpd_zfs_dma_log(ndmpd_zfs_args_t *, ndmp_log_type, char *, ...);
111112186SJanice.Chang@Sun.COM 
11127917SReza.Sabdar@Sun.COM #endif /* _NDMPD_H */
1113