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