2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang/* Copyright (c) 2007, The Storage Networking Industry Association. */
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang/* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
8b87c15576a5138f88a969448b43561bf5968c09Jan Kryl/* Copyright 2014 Nexenta Systems, Inc. All rights reserved. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#ifndef _LIBNDMP_H
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define _LIBNDMP_H
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <rpc/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libscf.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libnvpair.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#ifdef __cplusplus
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern "C" {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP supported versions */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_V2 2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_V3 3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_V4 4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Device type */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_SINQ_SEQ_ACCESS_DEVICE 0x01
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_SINQ_TAPE_ROBOT 0x08
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_errno;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP plugin module API */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_PLUGIN_VERSION 1
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_context {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nc_plname;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint_t nc_plversion;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang void *nc_pldata; /* data private to the plugin */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar void *nc_cmds;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar void *nc_params;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang void *nc_ddata; /* data private to the daemon */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_context_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_plugin {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar const char *np_plid; /* plugin identifier */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint_t np_plversion; /* plugin version */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar void *np_pldata; /* for private use by the plugin */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Plugin entry points */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*np_pre_backup)(struct ndmp_plugin *, ndmp_context_t *,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar const char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*np_post_backup)(struct ndmp_plugin *, ndmp_context_t *,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*np_pre_restore)(struct ndmp_plugin *, ndmp_context_t *,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar const char *, const char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int (*np_post_restore)(struct ndmp_plugin *, ndmp_context_t *,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_plugin_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdartypedef enum ndmp_log_dma_type {
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar NDMP_LOGD_NORMAL = 0,
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar NDMP_LOGD_DEBUG = 1,
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar NDMP_LOGD_ERROR = 2,
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar NDMP_LOGD_WARNING = 3
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar} ndmp_log_dma_type_t;
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdar
8c4f9701439555b41fbfe7848508f53b52166007Janice Changtypedef enum {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_BUTYPE_TAR = 0,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_BUTYPE_DUMP,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_BUTYPE_ZFS
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang} ndmpd_backup_type_t;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Changextern ndmpd_backup_type_t ndmp_get_backup_type(ndmp_context_t *);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* libndmp error codes */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define ENDMP_BASE 2000
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarenum {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_DOOR_SRV_TIMEOUT = ENDMP_BASE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_INVALID_ARG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_DOOR_SRV_OPERATION,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_DOOR_OPEN,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_MEM_ALLOC,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_DOOR_ENCODE_START,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_DOOR_ENCODE_FINISH,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_DOOR_DECODE_FINISH,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_SMF_PERM,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_SMF_INTERNAL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_SMF_PROP,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ENDMP_SMF_PROP_GRP
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Tape device open mode */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_tp_open_mode {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_TP_READ_MODE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_TP_WRITE_MODE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_TP_RAW_MODE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_TP_RAW1_MODE = 0x7fffffff,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_TP_RAW2_MODE = NDMP_TP_RAW_MODE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_tp_open_mode_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Mover state */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_mv_state {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_STATE_IDLE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_STATE_LISTEN,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_STATE_ACTIVE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_STATE_PAUSED,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_STATE_HALTED
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_mv_state_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Mover mode */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_mv_mode {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_MODE_READ,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_MODE_WRITE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_MODE_NOACTION
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_mv_mode_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Mover pause reson */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_mv_pause_reason {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_PAUSE_NA,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_PAUSE_EOM,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_PAUSE_EOF,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_PAUSE_SEEK,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_PAUSE_MEDIA_ERROR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_PAUSE_EOW
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_mv_pause_reason_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Mover halt reason */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_mv_halt_reason {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_HALT_NA,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_HALT_CONNECT_CLOSED,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_HALT_ABORTED,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_HALT_INTERNAL_ERROR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_HALT_CONNECT_ERROR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MV_HALT_MEDIA_ERROR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_mv_halt_reason_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Address type */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_ad_type {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_AD_LOCAL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_AD_TCP,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_AD_FC,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_AD_IPC
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_ad_type_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP data operation */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_dt_operation {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_OP_NOACTION,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_OP_BACKUP,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_OP_RECOVER,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_OP_RECOVER_FILEHIST
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_operation_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP data state */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_dt_state {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_STATE_IDLE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_STATE_ACTIVE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_STATE_HALTED,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_STATE_LISTEN,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_STATE_CONNECTED
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_state_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP data halt reason */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef enum ndmp_dt_halt_reason {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_HALT_NA,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_HALT_SUCCESSFUL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_HALT_ABORTED,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_HALT_INTERNAL_ERROR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DT_HALT_CONNECT_ERROR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_halt_reason_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Device information structure */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_devinfo {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint_t nd_dev_type; /* SCSI device type */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nd_name; /* Device name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint_t nd_lun; /* Lun number */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint_t nd_sid; /* Scsi id */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nd_vendor; /* Vendor name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nd_product; /* Product name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nd_revision; /* Revision */
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar char *nd_serial; /* Serial */
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar char *nd_wwn; /* World wide name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_devinfo_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Scsi device info sturcture */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_scsi {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_scsi_open; /* Scsi device open */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* -1 if not open */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *ns_adapter_name; /* Scsi adapter name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_valid_target_set; /* Scsi valid target */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* scsi_id and lun are set only if valid_target_set is set */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_scsi_id; /* Scsi id */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_lun; /* Scsi lun */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_scsi_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_tape {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nt_fd; /* Tape device file descriptor */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* The data below is set only if "fd" is not -1 */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nt_rec_count; /* Number of records written */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_tp_open_mode_t nt_mode; /* Tape device open mode */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nt_dev_name; /* Device name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nt_adapter_name; /* Adapter name */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nt_sid; /* Scsi id */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nt_lun; /* Lun number */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_tape_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP mover info structure */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_mover {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_mv_state_t nm_state; /* Current state */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_mv_mode_t nm_mode; /* Current mode */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_mv_pause_reason_t nm_pause_reason; /* Current reason */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_mv_halt_reason_t nm_halt_reason; /* Current reason */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nm_rec_size; /* Tape I/O record size */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nm_rec_num; /* Current record num */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nm_mov_pos; /* Current data stream pos */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nm_window_offset; /* Valid data window begin */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nm_window_length; /* Valid data window length */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nm_sock; /* Data conn socket */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Filled in V3 and V4 only */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nm_listen_sock; /* Data conn listen socket */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_ad_type_t nm_addr_type; /* Current address type */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nm_tcp_addr; /* Only if addr_type is tcp */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_mover_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_dt_name {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nn_name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nn_dest;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_name_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP name/value pair structure */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_dt_pval {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *np_name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *np_value;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_pval_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_dt_name_v3 {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nn3_opath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nn3_dpath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nn3_node;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nn3_fh_info;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_name_v3_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_dt_v3 {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int dv3_listen_sock;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t dv3_bytes_processed;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_name_v3_t *dv3_nlist; /* V3 recover file list */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_dt_v3_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP data structure */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_data {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_operation_t nd_oper; /* Current operation */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_state_t nd_state; /* Current state */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_halt_reason_t nd_halt_reason; /* Current reason */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nd_sock; /* Listen and data socket */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_ad_type_t nd_addr_type; /* Current address type */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nd_tcp_addr; /* Only if addr_type is tcp */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nd_abort; /* Abort operation flag */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* 0 = No, otherwise Yes */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nd_read_offset; /* Data read seek offset */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nd_read_length; /* Data read length */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t nd_total_size; /* Backup data size */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nd_env_len; /* Environment length */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_pval_t *nd_env; /* Environment from backup */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* or recover request */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nld_nlist_len; /* Recover file list length */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar union {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Filled in V2 */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_name_t *nld_nlist; /* Recover file list */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Filled in V3 */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_v3_t nld_dt_v3; /* V3 data */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } nd_nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_data_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* NDMP session information */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_session_info {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nsi_sid; /* Session id */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nsi_pver; /* NDMP protocol version */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nsi_auth; /* Authorized ? 0="no", else "yes" */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int nsi_eof; /* Connection EOF flag */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* 0="no", else "yes" */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *nsi_cl_addr; /* Client address */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_scsi_t nsi_scsi; /* Scsi device information */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_tape_t nsi_tape; /* Tape device information */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_mover_t nsi_mover; /* Mover information */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_t nsi_data; /* Data information */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_session_info_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Stats data */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_stat {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_trun; /* Number of worker threads running */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_twait; /* Number of blocked worker threads */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_nbk; /* Number of backups operations running */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_nrs; /* Number of restores operations running */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_rfile; /* Number of files being read */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ns_wfile; /* Number of files being written */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint64_t ns_rdisk; /* Number of disk blocks being read */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint64_t ns_wdisk; /* Number of disk blocks being written */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint64_t ns_rtape; /* Number of tape blocks being read */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint64_t ns_wtape; /* Number of tape blocks being written */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_stat_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Common encode/decode functions used by door clients/servers. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmp_door_ctx {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *ptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *start_ptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *end_ptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int status;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmp_door_ctx_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_get_devinfo(ndmp_devinfo_t **, size_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_get_devinfo_free(ndmp_devinfo_t *, size_t);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_get_dbglevel(void);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_get_session_info(ndmp_session_info_t **, size_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_get_session_info_free(ndmp_session_info_t *, size_t);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_get_stats(ndmp_stat_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_terminate_session(int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_set_dbglevel(int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern const char *ndmp_strerror(int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_door_status(void);
8b87c15576a5138f88a969448b43561bf5968c09Jan Krylextern int ndmp_get_prop(const char *, char **);
8b87c15576a5138f88a969448b43561bf5968c09Jan Krylextern int ndmp_set_prop(const char *, const char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_service_refresh(void);
8b87c15576a5138f88a969448b43561bf5968c09Jan Krylextern char *ndmp_base64_encode(const char *);
8b87c15576a5138f88a969448b43561bf5968c09Jan Krylextern char *ndmp_base64_decode(const char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern ndmp_door_ctx_t *ndmp_door_decode_start(char *, int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_door_decode_finish(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern ndmp_door_ctx_t *ndmp_door_encode_start(char *, int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_door_encode_finish(ndmp_door_ctx_t *, unsigned int *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int32_t ndmp_door_get_int32(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern uint32_t ndmp_door_get_uint32(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern char *ndmp_door_get_string(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_int32(ndmp_door_ctx_t *, int32_t);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_uint32(ndmp_door_ctx_t *, uint32_t);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_string(ndmp_door_ctx_t *, char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_free_string(char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int64_t ndmp_door_get_int64(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern uint64_t ndmp_door_get_uint64(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_uint64(ndmp_door_ctx_t *, uint64_t);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_short(ndmp_door_ctx_t *, short);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern short ndmp_door_get_short(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_ushort(ndmp_door_ctx_t *, unsigned short);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern unsigned short ndmp_door_get_ushort(ndmp_door_ctx_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_door_put_buf(ndmp_door_ctx_t *, unsigned char *, int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_door_get_buf(ndmp_door_ctx_t *, unsigned char *, int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_include_zfs(ndmp_context_t *, const char *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern int ndmp_iter_zfs(ndmp_context_t *, int (*)(nvlist_t *, void *), void *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern uint_t ndmp_context_get_version(ndmp_context_t *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void ndmp_context_set_specific(ndmp_context_t *, void *);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarextern void *ndmp_context_get_specific(ndmp_context_t *);
42ed7838f131b8f58d6c95db1c7e3a6a3e6ea7e4Reza Sabdarvoid ndmp_log_dma(ndmp_context_t *, ndmp_log_dma_type_t, const char *, ...);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#ifdef __cplusplus
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#endif /* _LIBNDMP_H */