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