2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl * Copyright 2014 Nexenta Systems, Inc. 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 */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 2007, The Storage Networking Industry Association. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/param.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/socket.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <netinet/in.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <arpa/inet.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <string.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd_common.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_data_error_send_v4(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_halt_reason reason);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_data_error_send(ndmpd_session_t *session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_halt_reason reason);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void data_accept_connection_v3(void *cookie, int fd, ulong_t mode);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int create_listen_socket_v3(ndmpd_session_t *session, ulong_t *addr,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ushort_t *port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_error data_connect_sock_v3(ndmpd_session_t *session, ulong_t addr,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ushort_t port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int discard_data_v3(ndmpd_session_t *session, ulong_t length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void nlp_release_job_stat(ndmpd_session_t *session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic u_longlong_t ndmpd_data_get_info(ndmpd_session_t *session);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Changstatic ndmp_error ndmpd_tar_start_backup_v2(ndmpd_session_t *, char *,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *, ulong_t);
8c4f9701439555b41fbfe7848508f53b52166007Janice Changstatic ndmp_error ndmpd_tar_start_recover_v2(ndmpd_session_t *, char *,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *, ulong_t, ndmp_name *, ulong_t);
8c4f9701439555b41fbfe7848508f53b52166007Janice Changstatic ndmp_error ndmpd_tar_start_backup_v3(ndmpd_session_t *, char *,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *, ulong_t);
8c4f9701439555b41fbfe7848508f53b52166007Janice Changstatic ndmp_error ndmpd_tar_start_recover_v3(ndmpd_session_t *,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *, ulong_t, ndmp_name_v3 *, ulong_t);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Changstatic ndmp_error ndmpd_zfs_start_op(ndmpd_session_t *,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *, ulong_t, ndmp_name_v3 *, ulong_t, enum ndmp_data_operation);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V2 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_get_state_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Returns current data state.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_get_state_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_get_state_reply_v2 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.operation = session->ns_data.dd_operation;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.state = session->ns_data.dd_state;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.halt_reason = session->ns_data.dd_halt_reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.est_time_remain =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_time_remaining;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.est_bytes_remain =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.bytes_processed =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(ndmpd_data_get_info(session));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.mover = session->ns_data.dd_mover;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.read_offset = long_long_to_quad(session->ns_data.dd_read_offset);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.read_length = long_long_to_quad(session->ns_data.dd_read_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_get_state reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_start_backup_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Starts a backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_start_backup_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_backup_request_v2 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_backup_reply_v2 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_error err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_start_backup_request_v2 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_mover = request->mover;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang err = ndmpd_tar_start_backup_v2(session, request->bu_type,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->env.env_val, request->env.env_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * start_backup sends the reply if the backup is successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Otherwise, send the reply containing the error here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "err: %d", err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_start_backup reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_cleanup(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_start_recover_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Starts a restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_start_recover_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_request_v2 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_reply_v2 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_error err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_start_recover_request_v2 *) body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_mover = request->mover;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang err = ndmpd_tar_start_recover_v2(session, request->bu_type,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->env.env_val, request->env.env_len,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->nlist.nlist_val, request->nlist.nlist_len);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * start_recover sends the reply if the recover is successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Otherwise, send the reply containing the error here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_start_recover_request_v2 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_cleanup(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_get_env_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Returns the environment variable array sent
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * with the backup request. This request may only be sent with
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * a backup operation is in progress.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_get_env_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_get_env_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_operation != NDMP_DATA_OP_BACKUP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Backup operation not active.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_len = session->ns_data.dd_env_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_val = session->ns_data.dd_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply, "sending data_get_env reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_stop_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Stops the current data operation.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_stop_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_stop_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_HALTED) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state to process stop request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_stop reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_waitfor_op(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_cleanup(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_cleanup(session, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp_release_job_stat(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* prepare for another data operation */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_data_init(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_init(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply, "sending data_stop reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_abort_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Aborts the current backup/restore. The operation
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * state is not changed to the halted state until after the operation
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * has actually been aborted and the notify_halt request has been sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_abort_v2(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_abort_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state == NDMP_DATA_STATE_IDLE ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state == NDMP_DATA_STATE_HALTED) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state to process abort request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_abort reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Don't go to HALTED state yet. Need to wait for data operation to
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * abort. When this happens, ndmpd_done will get called and will
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * perform the halt processing.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (*session->ns_data.dd_module.dm_abort_func)(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_module_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply, "sending data_abort reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V3 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_get_state_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Returns current data state.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_get_state_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_get_state_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.invalid = NDMP_DATA_STATE_EST_BYTES_REMAIN_INVALID
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar | NDMP_DATA_STATE_EST_TIME_REMAIN_INVALID;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.operation = session->ns_data.dd_operation;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.state = session->ns_data.dd_state;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.halt_reason = session->ns_data.dd_halt_reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.operation == NDMP_DATA_OP_BACKUP)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.bytes_processed =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_bytes_processed);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.bytes_processed =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(ndmpd_data_get_info(session));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.est_bytes_remain = long_long_to_quad(0LL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.est_time_remain = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_copy_addr_v3(&reply.data_connection_addr,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_data.dd_data_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.read_offset = long_long_to_quad(session->ns_data.dd_read_offset);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.read_length = long_long_to_quad(session->ns_data.dd_read_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_get_state_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_start_backup_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Starts a backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_start_backup_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_backup_request_v3 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_backup_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_start_backup_request_v3 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (session->ns_data.dd_state != NDMP_DATA_STATE_CONNECTED) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang "Can't start new backup in current state.");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang "Connection to the mover is not established.");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = NDMP_ILLEGAL_STATE_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang goto _error;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (session->ns_data.dd_data_addr.addr_type == NDMP_ADDR_LOCAL) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (session->ns_tape.td_mode == NDMP_TAPE_READ_MODE) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, "Write protected device.");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = NDMP_WRITE_PROTECT_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang goto _error;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (strcasecmp(request->bu_type, NDMP_TAR_TYPE) == 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_butype = NDMP_BUTYPE_TAR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else if (strcasecmp(request->bu_type, NDMP_DUMP_TYPE) == 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_butype = NDMP_BUTYPE_DUMP;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else if (strcasecmp(request->bu_type, NDMP_ZFS_TYPE) == 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_butype = NDMP_BUTYPE_ZFS;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang char msg_invalid[32];
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang char msg_types[32];
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) snprintf(msg_invalid, 32, "Invalid backup type: %s.",
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->bu_type);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) snprintf(msg_types, 32,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang "Supported backup types are tar, dump, and zfs.");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang msg_invalid);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang msg_types);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, msg_invalid);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, msg_types);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = NDMP_ILLEGAL_ARGS_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang goto _error;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (session->ns_butype == NDMP_BUTYPE_ZFS) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = ndmpd_zfs_start_op(session, request->env.env_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->env.env_len, NULL, 0, NDMP_DATA_OP_BACKUP);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = ndmpd_tar_start_backup_v3(session,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->bu_type, request->env.env_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->env.env_len);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * *_start_backup* sends the reply if the backup is
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * successfully started. Otherwise, send the reply
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * containing the error here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang_error:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_start_backup_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_cleanup(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_start_recover_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Starts a restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_start_recover_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_request_v3 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_start_recover_request_v3 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (session->ns_data.dd_state != NDMP_DATA_STATE_CONNECTED) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, "Can't start new recover in current state.");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = NDMP_ILLEGAL_STATE_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang goto _error;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (strcasecmp(request->bu_type, NDMP_TAR_TYPE) == 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_butype = NDMP_BUTYPE_TAR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else if (strcasecmp(request->bu_type, NDMP_DUMP_TYPE) == 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_butype = NDMP_BUTYPE_DUMP;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else if (strcasecmp(request->bu_type, NDMP_ZFS_TYPE) == 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_butype = NDMP_BUTYPE_ZFS;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang char msg_invalid[32];
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang char msg_types[32];
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) snprintf(msg_invalid, 32, "Invalid backup type: %s.",
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->bu_type);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) snprintf(msg_types, 32,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang "Supported backup types are tar, dump, and zfs.");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang msg_invalid);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_APILOG((void *) session, NDMP_LOG_ERROR, ++ndmp_log_msg_id,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang msg_types);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, msg_invalid);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, msg_types);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = NDMP_ILLEGAL_ARGS_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang goto _error;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (session->ns_butype == NDMP_BUTYPE_ZFS) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = ndmpd_zfs_start_op(session, request->env.env_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->env.env_len, request->nlist.nlist_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->nlist.nlist_len, NDMP_DATA_OP_RECOVER);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply.error = ndmpd_tar_start_recover_v3(session,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->env.env_val, request->env.env_len,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang request->nlist.nlist_val, request->nlist.nlist_len);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * *_start_recover* sends the reply if the recover is
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * successfully started. Otherwise, send the reply
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * containing the error here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang_error:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_start_recover_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_error(session, NDMP_DATA_HALT_INTERNAL_ERROR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_cleanup(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_abort_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Aborts the current backup/restore. The operation
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * state is not changed to the halted state until after the operation
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * has actually been aborted and the notify_halt request has been sent.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_abort_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_abort_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_data.dd_state) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_DATA_STATE_IDLE:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state to process abort request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_DATA_STATE_ACTIVE:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Don't go to HALTED state yet. Need to wait for data
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * operation to abort. When this happens, ndmpd_done_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * will get called and will perform the halt processing.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_module.dm_abort_func)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (*session->ns_data.dd_module.dm_abort_func)(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_module_cookie);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_DATA_STATE_HALTED:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_DATA_STATE_LISTEN:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_DATA_STATE_CONNECTED:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_error(session, NDMP_DATA_HALT_ABORTED);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unknown data V3 state %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_abort_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_stop_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Stops the current data operation.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_stop_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_stop_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_HALTED) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state to process stop request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_stop_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_waitfor_op(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_cleanup(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_cleanup(session, FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* prepare for another data operation */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_data_init(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_init(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending data_stop_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_listen_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Configures the server to listen for a connection
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * from a remote mover.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_listen_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_listen_request_v3 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_listen_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ushort_t port;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_listen_request_v3 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid internal data state to process listen request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (session->ns_mover.md_state != NDMP_MOVER_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid mover state to process listen request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp_data_listen_request_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.data_connection_addr.addr_type = request->addr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_LOCAL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (create_listen_socket_v3(session, &addr, &port) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_IO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.data_connection_addr.addr_type = request->addr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.data_connection_addr.tcp_ip_v3 = htonl(addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.data_connection_addr.tcp_port_v3 = htons(port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_TCP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_ip_v3 = addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_port_v3 = ntohs(port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "listen_socket: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid address type: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_LISTEN;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp_data_listen_request_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_connect_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Connects the data server to either a local
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * or remote mover.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_connect_v3(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_connect_request_v3 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_connect_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_connect_request_v3 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!ndmp_valid_v3addr_type(request->addr.addr_type)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr.addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state to process connect request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_connect_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->addr.addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Verify that the mover is listening for a
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * local connection
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_mover.md_state != NDMP_MOVER_STATE_LISTEN ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_listen_sock != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Mover is not in local listen state.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_state = NDMP_MOVER_STATE_ACTIVE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = data_connect_sock_v3(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr.tcp_ip_v3, request->addr.tcp_port_v3);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr.addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_CONNECTED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_connect_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V4 HANDLERS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_get_env_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Returns the environment variable array sent
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * with the backup request. This request may only be sent with
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * a backup operation is in progress.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_get_env_v4(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_get_env_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_ACTIVE &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state != NDMP_DATA_STATE_HALTED) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state for the data server.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (session->ns_data.dd_operation != NDMP_DATA_OP_BACKUP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Backup operation not active.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_len = session->ns_data.dd_env_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.env.env_val = session->ns_data.dd_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply, "sending data_get_env reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_get_state_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Returns current data state.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_get_state_v4(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_get_state_reply_v4 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.unsupported = NDMP_DATA_STATE_EST_BYTES_REMAIN_INVALID
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar | NDMP_DATA_STATE_EST_TIME_REMAIN_INVALID;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.operation = session->ns_data.dd_operation;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.state = session->ns_data.dd_state;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.halt_reason = session->ns_data.dd_halt_reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.operation == NDMP_DATA_OP_BACKUP)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.bytes_processed = long_long_to_quad(
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_bytes_processed);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.bytes_processed =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(ndmpd_data_get_info(session));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.est_bytes_remain = long_long_to_quad(0LL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.est_time_remain = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_copy_addr_v4(&reply.data_connection_addr,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &session->ns_data.dd_data_addr_v4);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.read_offset = long_long_to_quad(session->ns_data.dd_read_offset);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.read_length = long_long_to_quad(session->ns_data.dd_read_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_get_state_v4 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(reply.data_connection_addr.tcp_addr_v4);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_connect_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Connects the data server to either a local
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * or remote mover.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_connect_v4(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_connect_request_v4 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_connect_reply_v4 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_connect_request_v4 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!ndmp_valid_v3addr_type(request->addr.addr_type)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr.addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid state to process connect request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_connect_v4 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->addr.addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Verify that the mover is listening for a
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * local connection
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_mover.md_state != NDMP_MOVER_STATE_LISTEN ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_listen_sock != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Mover is not in local listen state.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_state = NDMP_MOVER_STATE_ACTIVE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = data_connect_sock_v3(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr.tcp_ip_v4(0), request->addr.tcp_port_v4(0));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid address type %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr.addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_CONNECTED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_connect_v4 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_listen_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Configures the server to listen for a connection
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * from a remote mover.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_listen_v4(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_listen_request_v4 *request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_listen_reply_v4 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = ndmp_get_client_data(connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ushort_t port;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request = (ndmp_data_listen_request_v4 *)body;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid internal data state to process listen request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (session->ns_mover.md_state != NDMP_MOVER_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_STATE_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Invalid mover state to process listen request.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp_data_listen_request_v4 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (request->addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.connect_addr.addr_type = request->addr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_LOCAL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (create_listen_socket_v3(session, &addr, &port) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_IO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.connect_addr.addr_type = request->addr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.connect_addr.tcp_addr_v4 =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_tcp_addr_v4));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.connect_addr.tcp_ip_v4(0) = htonl(addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.connect_addr.tcp_port_v4(0) = htons(port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.connect_addr.tcp_len_v4 = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr_v4.addr_type = NDMP_ADDR_TCP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr_v4.tcp_addr_v4 =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (ndmp_tcp_addr_v4));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr_v4.tcp_ip_v4(0) = addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr_v4.tcp_port_v4(0) = ntohs(port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr_v4.tcp_len_v4 = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Copy that to data_addr for compatibility */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_TCP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_ip_v3 = addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_port_v3 = ntohs(port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "listen_socket: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid address type: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->addr_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error == NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_LISTEN;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp_data_listen_request_v4 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_start_recover_filehist_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handler. Recovers the file history (not supported yet)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This command has an optional support in V4.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection handle.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * body (input) - request message body.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_start_recover_filehist_v4(ndmp_connection_t *connection, void *body)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_filehist_reply_v4 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Request not supported");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NOT_SUPPORTED_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(connection, &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending ndmp_data_start_recover_filehist_reply_v4 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LOCALS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ************************************************************************
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_error_send
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This function sends the notify message to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * reason (input) - halt reason.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Error code
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_error_send(ndmpd_session_t *session, ndmp_data_halt_reason reason)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_notify_data_halted_request req;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req.reason = session->ns_data.dd_halt_reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req.text_reason = "";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (ndmp_send_request(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_NOTIFY_DATA_HALTED, NDMP_NO_ERR, &req, 0));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_error_send_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This function sends the notify message to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * reason (input) - halt reason.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Error code
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_error_send_v4(ndmpd_session_t *session, ndmp_data_halt_reason reason)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_notify_data_halted_request_v4 req;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req.reason = session->ns_data.dd_halt_reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ndmp_send_request(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_NOTIFY_DATA_HALTED, NDMP_NO_ERR, &req, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This function is called when a data error has been detected.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A notify message is sent to the client and the data server is
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * placed into the halted state.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * reason (input) - halt reason.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_error(ndmpd_session_t *session, ndmp_data_halt_reason reason)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state == NDMP_DATA_STATE_IDLE ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state == NDMP_DATA_STATE_HALTED)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_operation == NDMP_DATA_OP_BACKUP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send/discard any buffered file history data.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_history_cleanup(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (reason == NDMP_DATA_HALT_SUCCESSFUL ? TRUE : FALSE));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If mover local and successful backup, write any
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * remaining buffered data to tape.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_data_addr.addr_type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar == NDMP_ADDR_LOCAL && reason == NDMP_DATA_HALT_SUCCESSFUL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_local_write_v3(session, 0, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_HALTED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_halt_reason = reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_protocol_version == NDMPV4) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_data_error_send_v4(session, reason) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Error sending notify_data_halted request");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_data_error_send(session, reason) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Error sending notify_data_halted request");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_data_addr.addr_type == NDMP_ADDR_TCP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_remove_file_handler(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpcopy: we use the same socket for the mover,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * so expect to close when mover is done!
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock !=
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_sock)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_listen_sock != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_remove_file_handler(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_mover_error(session, NDMP_MOVER_HALT_CONNECT_CLOSED);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data_accept_connection_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Accept a data connection from a remote mover.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Called by ndmpd_select when a connection is pending on
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the data listen socket.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fd (input) - file descriptor.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mode (input) - select mode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardata_accept_connection_v3(void *cookie, int fd, ulong_t mode)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_session_t *session = (ndmpd_session_t *)cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int from_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct sockaddr_in from;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar from_len = sizeof (from);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = accept(fd, (struct sockaddr *)&from,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &from_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "sock fd: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "sin: port %d addr %s",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ntohs(from.sin_port),
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar inet_ntoa(IN_ADDR(from.sin_addr.s_addr)));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_remove_file_handler(session, fd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Accept error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_error(session, NDMP_DATA_HALT_CONNECT_ERROR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Save the peer address.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_ip_v3 = from.sin_addr.s_addr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_port_v3 = ntohs(from.sin_port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl /* Set the parameter of the new socket */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl set_socket_options(session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_CONNECTED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * create_listen_socket_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Creates the data sockets for listening for a remote mover/data
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * incoming connections.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcreate_listen_socket_v3(ndmpd_session_t *session, ulong_t *addr, ushort_t *port)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock = ndmp_create_socket(addr, port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_listen_sock < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a file handler for the listen socket.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_select will call data_accept_connection when a
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection is ready to be accepted.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_add_file_handler(session, (void*)session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock, NDMPD_SELECT_MODE_READ, HC_MOVER,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar data_accept_connection_v3) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "addr: %s:%d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar inet_ntoa(IN_ADDR(*addr)), ntohs(*port));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data_connect_sock_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Connect the data interface socket to the specified ip/port
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * addr (input) - IP address
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * port (input) - port number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR - backup successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * otherwise - error code of backup start error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardata_connect_sock_v3(ndmpd_session_t *session, ulong_t addr, ushort_t port)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int sock;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sock = ndmp_connect_sock_v3(addr, port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sock < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_CONNECT_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = sock;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_TCP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_ip_v3 = ntohl(addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.tcp_port_v3 = port;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * ndmpd_tar_start_backup_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Start the backup work
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * session (input) - session pointer.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * bu_type (input) - backup type.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * env_val (input) - environment variable array.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * env_len (input) - length of env_val.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR - backup successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * otherwise - error code of backup start error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_error
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmpd_tar_start_backup_v3(ndmpd_session_t *session, char *bu_type,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *env_val, ulong_t env_len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_backup_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = ndmpd_save_env(session, env_val, env_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_daemon_cookie = (void *)session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_module_cookie = &session->ns_data.dd_module.dm_module_cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_protocol_version = session->ns_protocol_version;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_operation = NDMP_DATA_OP_BACKUP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_env_func = ndmpd_api_get_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_env_func = ndmpd_api_add_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_set_env_func = ndmpd_api_set_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_name_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_dispatch_func = ndmpd_api_dispatch;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_done_func = ndmpd_api_done_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_protocol_version == NDMPV4)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_log_func_v3 = ndmpd_api_log_v4;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_log_func_v3 = ndmpd_api_log_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_file_handler_func = ndmpd_api_add_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_remove_file_handler_func = ndmpd_api_remove_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_write_func = ndmpd_api_write_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_read_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_recovered_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_stats = &session->ns_data.dd_module.dm_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_module_cookie = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(bu_type, NDMP_DUMP_TYPE) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_SET(nlp, NLPF_DUMP);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_path_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_dir_func =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_api_file_history_dir_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_node_func =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_api_file_history_node_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (strcmp(bu_type, NDMP_TAR_TYPE) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_SET(nlp, NLPF_TAR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_path_func =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_api_file_history_file_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_dir_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_node_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_UNSET(nlp, NLPF_DUMP);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_UNSET(nlp, NLPF_TAR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_start_func = ndmpd_tar_backup_starter_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_abort_func = ndmpd_tar_backup_abort_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_time_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_v3 = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_position = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_discard_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmp_backup_get_params_v3(session, params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "err: %d", err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (reply.error);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &reply) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Sending data_start_backup_v3 reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NS_INC(nbk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_operation = NDMP_DATA_OP_BACKUP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * perform the backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * Cannot wait for the thread to exit as we are replying to the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * client request here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = pthread_create(NULL, NULL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (funct_t)session->ns_data.dd_module.dm_start_func,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Can't start backup session.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_ARGS_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * ndmpd_tar_start_recover_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Start the restore work
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bu_type (input) - backup type.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env_val (input) - environment variable array.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env_len (input) - length of env_val.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * nlist_val (input) - list of files.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * nlist_len (input) - length of nlist_val.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR - recover successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * otherwise - error code of recover start error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_error
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmpd_tar_start_recover_v3(ndmpd_session_t *session,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *env_val, ulong_t env_len, ndmp_name_v3 *nlist_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ulong_t nlist_len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_reply_v3 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void*)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!params) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmpd_save_env(session, env_val, env_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmpd_save_nlist_v3(session, nlist_val, nlist_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Setup restore parameters.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_daemon_cookie = (void *)session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_module_cookie = &session->ns_data.dd_module.dm_module_cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_protocol_version = session->ns_protocol_version;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_operation = NDMP_DATA_OP_RECOVER;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_env_func = ndmpd_api_get_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_env_func = ndmpd_api_add_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_set_env_func = ndmpd_api_set_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_name_func = ndmpd_api_get_name_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_dispatch_func = ndmpd_api_dispatch;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_done_func = ndmpd_api_done_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_protocol_version == NDMPV4) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_log_func_v3 = ndmpd_api_log_v4;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_recovered_func = ndmpd_api_file_recovered_v4;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_log_func_v3 = ndmpd_api_log_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_recovered_func = ndmpd_api_file_recovered_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_file_handler_func = ndmpd_api_add_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_remove_file_handler_func = ndmpd_api_remove_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_write_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_path_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_dir_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_node_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_read_func = ndmpd_api_read_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_seek_func = ndmpd_api_seek_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_stats = &session->ns_data.dd_module.dm_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_module_cookie = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_start_func = ndmpd_tar_restore_starter_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_abort_func = ndmpd_tar_restore_abort_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_time_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_position = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_discard_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = ndmp_restore_get_params_v3(session, params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &reply) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_free_nlist_v3(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Error sending ndmp_data_start_recover_reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_data_error(session, NDMP_DATA_HALT_CONNECT_ERROR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NS_INC(nrs);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_operation = NDMP_DATA_OP_RECOVER;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * perform the restore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Cannot wait for the thread to exit as we are replying to the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * client request here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = pthread_create(NULL, NULL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (funct_t)session->ns_data.dd_module.dm_start_func,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Can't start recover session.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_ARGS_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
8c4f9701439555b41fbfe7848508f53b52166007Janice Changstatic ndmp_error
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmpd_zfs_start_op(ndmpd_session_t *session, ndmp_pval *env_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ulong_t env_len, ndmp_name_v3 *nlist_val, ulong_t nlist_len,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang enum ndmp_data_operation op)
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang{
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_args_t *ndmpd_zfs_args = &session->ns_ndmpd_zfs_args;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_data_start_backup_reply_v3 backup_reply;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_data_start_recover_reply_v3 recover_reply;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang pthread_t tid;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang void *reply;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang char str[8];
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang int err;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (ndmpd_zfs_init(session) != 0)
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_UNDEFINED_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang err = ndmpd_save_env(session, env_val, env_len);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (err != NDMP_NO_ERR) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_fini(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (err);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang switch (op) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang case NDMP_DATA_OP_BACKUP:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (!ndmpd_zfs_backup_parms_valid(ndmpd_zfs_args)) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_fini(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_ILLEGAL_ARGS_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (ndmpd_zfs_pre_backup(ndmpd_zfs_args)) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, "pre_backup error");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_ILLEGAL_ARGS_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_data.dd_module.dm_start_func =
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_backup_starter;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) strlcpy(str, "backup", 8);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang break;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang case NDMP_DATA_OP_RECOVER:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang err = ndmpd_save_nlist_v3(session, nlist_val, nlist_len);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (err != NDMP_NO_ERR) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_fini(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_NO_MEM_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (!ndmpd_zfs_restore_parms_valid(ndmpd_zfs_args)) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_fini(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_ILLEGAL_ARGS_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (ndmpd_zfs_pre_restore(ndmpd_zfs_args)) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, "pre_restore error");
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) ndmpd_zfs_post_restore(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_ILLEGAL_ARGS_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_data.dd_module.dm_start_func =
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_restore_starter;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) strlcpy(str, "recover", 8);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang break;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_params->mp_operation = op;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_data.dd_operation = op;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_data.dd_module.dm_abort_func = ndmpd_zfs_abort;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang session->ns_data.dd_abort = FALSE;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (op == NDMP_DATA_OP_BACKUP) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) memset((void*)&backup_reply, 0, sizeof (backup_reply));
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang backup_reply.error = NDMP_NO_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply = &backup_reply;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang } else {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) memset((void*)&recover_reply, 0, sizeof (recover_reply));
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang recover_reply.error = NDMP_NO_ERR;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply = &recover_reply;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang reply) < 0) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_DEBUG, "Sending data_start_%s_v3 reply", str);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (op == NDMP_DATA_OP_RECOVER)
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_data_error(session, NDMP_DATA_HALT_CONNECT_ERROR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_fini(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_NO_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang err = pthread_create(&tid, NULL,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (funct_t)session->ns_data.dd_module.dm_start_func, ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (err) {
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NDMP_LOG(LOG_ERR, "Can't start %s session (errno %d)",
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang str, err);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_fini(ndmpd_zfs_args);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang MOD_DONE(ndmpd_zfs_params, -1);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_NO_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang }
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang (void) pthread_detach(tid);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang if (op == NDMP_DATA_OP_BACKUP)
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NS_INC(nbk);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang else
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang NS_INC(nrs);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_zfs_dma_log(ndmpd_zfs_args, NDMP_LOG_NORMAL,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang "'zfs' %s starting\n", str);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (NDMP_NO_ERR);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * discard_data_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Read and discard data from the data connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Called when a module has called ndmpd_seek() prior to
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * reading all of the data from the previous seek.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * number of bytes read and discarded.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardiscard_data_v3(ndmpd_session_t *session, ulong_t length)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar static char buf[MAX_RECORD_SIZE];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int n, toread;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar toread = (length < MAX_RECORD_SIZE) ? length :
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar MAX_RECORD_SIZE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Read and discard the data. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = read(session->ns_data.dd_sock, buf, toread);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (n < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Socket read error: %m.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (n);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_remote_read_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Reads data from the remote mover.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data (input) - data to be written.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * length (input) - data length.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - data successfully read.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_remote_read_v3(ndmpd_session_t *session, char *data, ulong_t length)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ssize_t n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_notify_data_read_request request;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_job_stats_t *jstat;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar longlong_t fsize;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ns_data.dd_xx: [%llu, %llu, %llu, %llu, %llu]",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_position,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_discard_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar count = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (count < length) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len = length - count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the end of the seek window has been reached then
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * send an ndmp_read request to the client.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The NDMP client will then send a mover_data_read request to
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the remote mover and the mover will send more data.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This condition can occur if the module attempts to read past
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * a seek window set via a prior call to ndmpd_seek() or
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the module has not issued a seek. If no seek was issued then
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * pretend that a seek was issued to read the entire tape.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_bytes_left_to_read == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* ndmpd_seek() never called? */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_read_length == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read = ~0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset = 0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = ~0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * While restoring a file, restoreFile()
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * records the number of bytes still need to
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * be restored. We use this as a guidance
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * when asking for data from the tape.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar jstat = session->ns_ndmp_lbr_params->nlp_jstat;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fsize = jstat->js_bytes_in_file;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "bytes_left [%llu / %u]",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fsize, len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Fall back to the old way if fsize if too
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * small.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fsize < len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fsize = len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read = fsize;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_position;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = fsize;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.offset =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(session->ns_data.dd_read_offset);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request.length =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long_long_to_quad(session->ns_data.dd_read_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "to NOTIFY_DATA_READ [%llu, %llu]",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar if (ndmp_send_request_lock(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_NOTIFY_DATA_READ, NDMP_NO_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &request, 0) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Sending notify_data_read request");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the module called ndmpd_seek() prior to reading all of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * data that the remote mover was requested to send, then the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * excess data from the seek has to be discarded.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_discard_length != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = discard_data_v3(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (ulong_t)session->ns_data.dd_discard_length);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (n < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_discard_length -= n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Don't attempt to read more data than the remote is sending.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (len > session->ns_data.dd_bytes_left_to_read)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len = session->ns_data.dd_bytes_left_to_read;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((n = read(session->ns_data.dd_sock, &data[count],
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Socket read error: %m.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* read returns 0 if the connection was closed */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (n == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "n 0 errno %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar errno);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar count += n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read -= n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_position += n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlp_release_job_stat
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Unreference the job statistics
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarnlp_release_job_stat(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(session)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_jstat != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bytes_total =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (u_longlong_t)nlp->nlp_jstat->js_bytes_total;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_un_ref_job_stats(nlp->nlp_jstat->js_job_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_jstat = NULL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "JSTAT == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* *** ndmpd global internal functions *********************************** */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_init
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Initializes data specific session variables.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_init(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_operation = NDMP_DATA_OP_NOACTION;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_IDLE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_halt_reason = NDMP_DATA_HALT_NA;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_mover.addr_type = NDMP_ADDR_LOCAL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_time_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP V3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_IDLE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_v3 = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_data_addr.addr_type = NDMP_ADDR_LOCAL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_bytes_left_to_read = 0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_position = 0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_discard_length = 0LL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_cleanup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Releases resources allocated during a data operation.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_cleanup(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_listen_sock != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "data.listen_sock: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmpd_remove_file_handler(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_listen_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_listen_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "data.sock: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpcopy: we use the same socket for the mover,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * so expect to close when mover is done!
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock != session->ns_mover.md_sock)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_free_env(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_free_nlist(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_data_get_mover_mode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Return the mover mode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * remote - remote backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * local - local backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_data_get_mover_mode(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_protocol_version) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV2:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = ((session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ? "remote" : "local");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV3:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = ((session->ns_data.dd_data_addr.addr_type == NDMP_ADDR_TCP)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ? "remote" : "local");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMPV4:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = ((session->ns_data.dd_data_addr.addr_type ==
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_ADDR_TCP ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (session->ns_data.dd_data_addr_v4.addr_type ==
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_ADDR_TCP)) ? "remote" : "local");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang rv = "Unknown";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid protocol version %d.",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* *** static functions ******************************************** */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * ndmpd_tar_start_backup_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Request handling code common to version 1 and
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * version 2 data_start_backup request handlers.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bu_type (input) - backup type.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env_val (input) - environment variable array.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env_len (input) - length of env_val.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR - backup successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * otherwise - error code of backup start error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_error
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmpd_tar_start_backup_v2(ndmpd_session_t *session, char *bu_type,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *env_val, ulong_t env_len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_backup_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Can't start new backup in current state.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_STATE_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(bu_type, NDMP_DUMP_TYPE) != 0 &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar strcmp(bu_type, NDMP_TAR_TYPE) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid backup type: %s.", bu_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Supported backup types are tar and dump.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_ARGS_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((err = ndmpd_save_env(session, env_val, env_len)) != NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (params == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_daemon_cookie = (void *)session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_module_cookie = &session->ns_data.dd_module.dm_module_cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_protocol_version = session->ns_protocol_version;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_operation = NDMP_DATA_OP_BACKUP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_env_func = ndmpd_api_get_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_env_func = ndmpd_api_add_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_name_func = ndmpd_api_get_name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_dispatch_func = ndmpd_api_dispatch;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_done_func = ndmpd_api_done_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_log_func = ndmpd_api_log_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_file_handler_func = ndmpd_api_add_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_remove_file_handler_func = ndmpd_api_remove_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_write_func = ndmpd_api_write_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_read_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_recovered_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_stats = &session->ns_data.dd_module.dm_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_module_cookie = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(bu_type, NDMP_DUMP_TYPE) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_SET(nlp, NLPF_DUMP);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_path_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_dir_func =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_api_file_history_dir_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_node_func =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_api_file_history_node_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (strcmp(bu_type, NDMP_TAR_TYPE) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* backup type == NDMP_TAR_TYPE */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_SET(nlp, NLPF_TAR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_path_func =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_api_file_history_path_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_dir_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_node_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_UNSET(nlp, NLPF_DUMP);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NLP_UNSET(nlp, NLPF_TAR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_start_func = ndmpd_tar_backup_starter;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_abort_func = ndmpd_tar_backup_abort;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_time_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((err = ndmp_backup_extract_params(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params)) != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "err: %d", err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = ndmpd_mover_connect(session, NDMP_MOVER_MODE_READ);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "mover connect err: %d", err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_operation = NDMP_DATA_OP_BACKUP;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "starting backup");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &reply) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Sending data_start_backup reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpcopy: we use the same socket for the mover,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * so expect to close when mover is done!
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock !=
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_sock)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_mover_error(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MOVER_HALT_CONNECT_CLOSED);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * perform the backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Cannot wait for the thread to exit as we are replying to the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * client request here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) pthread_create(NULL, NULL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (funct_t)session->ns_data.dd_module.dm_start_func,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * ndmpd_tar_start_recover_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The main recover/restore function
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * bu_type (input) - backup type.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env_val (input) - environment variable array.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env_len (input) - length of env_val.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * nlist_val (input) - list of files.
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * nlist_len (input) - length of nlist_val.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP_NO_ERR - recover successfully started.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * otherwise - error code of backup start error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_error
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmpd_tar_start_recover_v2(ndmpd_session_t *session, char *bu_type,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmp_pval *env_val, ulong_t env_len, ndmp_name *nlist_val,
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ulong_t nlist_len)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_data_start_recover_reply_v2 reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_module_params_t *params;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_state != NDMP_DATA_STATE_IDLE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Can't start new recover in current state.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_STATE_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(bu_type, NDMP_DUMP_TYPE) != 0 &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar strcmp(bu_type, NDMP_TAR_TYPE) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Invalid backup type: %s.", bu_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Supported backup types are tar and dump.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_ARGS_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmpd_save_env(session, env_val, env_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = ndmpd_save_nlist_v2(session, nlist_val, nlist_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (reply.error != NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params = nlp->nlp_params = ndmp_malloc(sizeof (ndmpd_module_params_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (params == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Setup restore parameters.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_daemon_cookie = (void *)session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_module_cookie = &session->ns_data.dd_module.dm_module_cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_protocol_version = session->ns_protocol_version;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_operation = NDMP_DATA_OP_RECOVER;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_env_func = ndmpd_api_get_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_env_func = ndmpd_api_add_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_get_name_func = ndmpd_api_get_name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_dispatch_func = ndmpd_api_dispatch;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_done_func = ndmpd_api_done_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_log_func = ndmpd_api_log_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_add_file_handler_func = ndmpd_api_add_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_remove_file_handler_func = ndmpd_api_remove_file_handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_write_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_path_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_dir_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_history_node_func = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_read_func = ndmpd_api_read_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_seek_func = ndmpd_api_seek_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_file_recovered_func = ndmpd_api_file_recovered_v2;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params->mp_stats = &session->ns_data.dd_module.dm_stats;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_module_cookie = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_start_func = ndmpd_tar_restore_starter;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_abort_func = ndmpd_tar_restore_abort;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_bytes_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_module.dm_stats.ms_est_time_remaining = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_offset = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_read_length = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((err = ndmp_restore_extract_params(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params)) != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = ndmpd_mover_connect(session, NDMP_MOVER_MODE_WRITE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != NDMP_NO_ERR) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_state = NDMP_DATA_STATE_ACTIVE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_operation = NDMP_DATA_OP_RECOVER;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_abort = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &reply) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Sending data_start_recover reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(nlp->nlp_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpcopy: we use the same socket for the mover,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * so expect to close when mover is done!
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock !=
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_sock)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_mover_error(session,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_MOVER_HALT_CONNECT_CLOSED);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * perform the restore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * Cannot wait for the thread to exit as we are replying to the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * client request here.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) pthread_create(NULL, NULL,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (funct_t)session->ns_data.dd_module.dm_start_func,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_data_get_info
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Return the total number of bytes processed
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the number of bytes processed
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic u_longlong_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_data_get_info(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp = ndmp_get_nlp(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ((u_longlong_t)0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlp->nlp_jstat == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (nlp->nlp_bytes_total);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ((u_longlong_t)nlp->nlp_jstat->js_bytes_total);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}