2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 2007, The Storage Networking Industry Association. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl/* Copyright 2014 Nexenta Systems, Inc. All rights reserved. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/types.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <assert.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ctype.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <unistd.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <strings.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <time.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <bitmap.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/queue.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/socket.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <netinet/in.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <netinet/tcp.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <arpa/inet.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/socketvar.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <net/if.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <netdb.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/filio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/mtio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/scsi/impl/uscsi.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <sys/scsi/scsi.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "tlm.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Force to backup all the intermediate directories leading to an object
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to be backed up in 'dump' format backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t ndmp_dump_path_node = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Force to backup all the intermediate directories leading to an object
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to be backed up in 'tar' format backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t ndmp_tar_path_node = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Should the 'st_ctime' be ignored during incremental level backup?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t ndmp_ignore_ctime = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Should the 'st_lmtime' be included during incremental level backup?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t ndmp_include_lmtime = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Force to send the file history node entries along with the file history
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dir entries for all directories containing the changed files to the client
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for incremental backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Note: This variable is added to support Bakbone Software's Netvault DMA
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * which expects to get the FH ADD NODES for all upper directories which
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * contain the changed files in incremental backup along with the FH ADD DIRS.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t ndmp_fhinode = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Maximum permitted sequence number in the token-based backup. The
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * value of this variable can be changed by the administrator and is
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * saved in the NDMP configuration file.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_max_tok_seq = NDMP_MAX_TOKSEQ;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Force backup directories in incremental backups. If the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * directory is not modified itself, it's not backed up by
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * default.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint ndmp_force_bk_dirs = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Keeps track of the open SCSI (including tape and robot) devices.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * When a SCSI device is opened its name must be added to this list and
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * when it's closed its name must be removed from this list. The main
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * purpose of this list is the robot device. If the robot devices are not
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * attached in SASD layer, Local Backup won't see them. If they are
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * attached and we open the robot devices, then wrong commands are sent
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to robot by SASD since it assumes that the robot is a tape (sequential
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * access) device.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct open_list {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_ENTRY(open_list) ol_q;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ol_nref;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *ol_devnm;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ol_sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ol_lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ol_fd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connection_t *cl_conn;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza SabdarLIST_HEAD(ol_head, open_list);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Head of the opened SCSI devices list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic struct ol_head ol_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarmutex_t ol_mutex = DEFAULTMUTEX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * List of things to be exluded from backup.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic char *exls[] = {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar EXCL_PROC,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar EXCL_TMP,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NULL, /* reserved for a copy of the "backup.directory" */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NULL
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The counter for creating unique names with "ndmp.%d" format.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define NDMP_RCF_BASENAME "ndmp."
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_job_cnt = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int scsi_test_unit_ready(int dev_id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_add_file_handler
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Adds a file handler to the file handler list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The file handler list is used by ndmpd_api_dispatch.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cookie (input) - opaque data to be passed to file hander when called.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fd (input) - file descriptor.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mode (input) - bitmask of the following:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 1 = watch file for ready for reading
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 2 = watch file for ready for writing
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 4 = watch file for exception
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * class (input) - handler class. (HC_CLIENT, HC_MOVER, HC_MODULE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * func (input) - function to call when the file meets one of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * conditions specified by mode.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_add_file_handler(ndmpd_session_t *session, void *cookie, int fd,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t mode, ulong_t class, ndmpd_file_handler_func_t *func)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_handler_t *new;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new = ndmp_malloc(sizeof (ndmpd_file_handler_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (new == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new->fh_cookie = cookie;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new->fh_fd = fd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new->fh_mode = mode;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new->fh_class = class;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new->fh_func = func;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar new->fh_next = session->ns_file_handler_list;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_file_handler_list = new;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_remove_file_handler
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Removes a file handler from the file handler list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fd (input) - file descriptor.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_remove_file_handler(ndmpd_session_t *session, int fd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_handler_t **last;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_handler_t *handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar last = &session->ns_file_handler_list;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*last != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = *last;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_fd == fd) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *last = handler->fh_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) free(handler);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar last = &handler->fh_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_connection_closed
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If the connection closed or not.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fd (input) : file descriptor
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - connection is still valid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 1 - connection is not valid anymore
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - Internal kernel error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connection_closed(int fd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fd_set fds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int closed, ret;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct timeval timeout;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fd < 0) /* We are not using the mover */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar timeout.tv_sec = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar timeout.tv_usec = 1000;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_ZERO(&fds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_SET(fd, &fds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ret = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar closed = (ret == -1 && errno == EBADF);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (closed);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_check_mover_state
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Checks the mover connection status and sends an appropriate
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP message to client based on that.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_session_t *session (input) : session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_check_mover_state(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int moverfd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMPV3 Spec (Three-way restore):
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Once all of the files have been recovered, NDMP DATA Server closes
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the connection to the mover on the NDMP TAPE Server. THEN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The NDMP client should receive an NDMP_NOTIFY_MOVER_HALTED message
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * with an NDMP_MOVER_CONNECT_CLOSED reason from the NDMP TAPE Server
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar moverfd = session->ns_mover.md_sock;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* If connection is closed by the peer */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (moverfd >= 0 &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_mover.md_mode == NDMP_MOVER_MODE_WRITE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int closed, reason;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar closed = ndmp_connection_closed(moverfd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (closed) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Connection closed or internal error */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (closed > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp mover: connection closed by peer");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reason = NDMP_MOVER_HALT_CONNECT_CLOSED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp mover: Internal error");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reason = NDMP_MOVER_HALT_INTERNAL_ERROR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_mover_error(session, reason);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_select
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Calls select on the the set of file descriptors from the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file handler list masked by the fd_class argument.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Calls the file handler function for each
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file descriptor that is ready for I/O.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * block (input) - if TRUE, ndmpd_select waits until at least one
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file descriptor is ready for I/O. Otherwise,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * it returns immediately if no file descriptors are
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ready for I/O.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * class_mask (input) - bit mask of handler classes to be examined.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Provides for excluding some of the handlers from
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * being called.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - no handlers were called.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 1 - at least one handler was called.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_select(ndmpd_session_t *session, boolean_t block, ulong_t class_mask)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fd_set rfds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fd_set wfds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fd_set efds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_file_handler_t *handler;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct timeval timeout;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_file_handler_list == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If select should be blocked, then we poll every ten seconds.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The reason is in case of three-way restore we should be able
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * to detect if the other end closed the connection or not.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP client(DMA) does not send any information about the connection
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * that was closed in the other end.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (block == TRUE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar timeout.tv_sec = 10;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar timeout.tv_sec = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar timeout.tv_usec = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Create the fd_sets for select. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_ZERO(&rfds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_ZERO(&wfds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_ZERO(&efds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (handler = session->ns_file_handler_list; handler != 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = handler->fh_next) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((handler->fh_class & class_mask) == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_READ)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_SET(handler->fh_fd, &rfds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_WRITE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_SET(handler->fh_fd, &wfds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_EXCEPTION)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_SET(handler->fh_fd, &efds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_check_mover_state(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = select(FD_SETSIZE, &rfds, &wfds, &efds, &timeout);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (n == 0 && block == TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (n < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int connection_fd = ndmp_get_fd(session->ns_connection);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (errno == EINTR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Select error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl nlp = ndmp_get_nlp(session);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_lock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (handler = session->ns_file_handler_list; handler != 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = handler->fh_next) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((handler->fh_class & class_mask) == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_READ) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FD_ISSET(handler->fh_fd, &rfds) &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar connection_fd == handler->fh_fd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_eof = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_WRITE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FD_ISSET(handler->fh_fd, &wfds) &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar connection_fd == handler->fh_fd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_eof = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_EXCEPTION) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FD_ISSET(handler->fh_fd, &efds) &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar connection_fd == handler->fh_fd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_eof = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) cond_broadcast(&nlp->nlp_cv);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_unlock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (n == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = session->ns_file_handler_list;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (handler != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t mode = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((handler->fh_class & class_mask) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = handler->fh_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_READ) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FD_ISSET(handler->fh_fd, &rfds)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mode |= NDMPD_SELECT_MODE_READ;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_CLR(handler->fh_fd, &rfds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_WRITE) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FD_ISSET(handler->fh_fd, &wfds)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mode |= NDMPD_SELECT_MODE_WRITE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_CLR(handler->fh_fd, &wfds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (handler->fh_mode & NDMPD_SELECT_MODE_EXCEPTION) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FD_ISSET(handler->fh_fd, &efds)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mode |= NDMPD_SELECT_MODE_EXCEPTION;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar FD_CLR(handler->fh_fd, &efds);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (mode) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (*handler->fh_func) (handler->fh_cookie,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler->fh_fd, mode);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * K.L. The list can be modified during the execution
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * of handler->fh_func. Therefore, handler will start
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * from the beginning of the handler list after
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * each execution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = session->ns_file_handler_list;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar handler = handler->fh_next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_save_env
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Saves a copy of the environment variable list from the data_start_backup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * request or data_start_recover request.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * env (input) - environment variable list to be saved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * envlen (input) - length of variable array.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * error code.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_save_env(ndmpd_session_t *session, ndmp_pval *env, ulong_t envlen)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *namebuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *valbuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (envlen == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env = ndmp_malloc(sizeof (ndmp_pval) * envlen);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_env == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < envlen; i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar namebuf = strdup(env[i].name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (namebuf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar valbuf = strdup(env[i].value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (valbuf == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(namebuf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "env(%s): \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar namebuf, valbuf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env[i].name = namebuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env[i].value = valbuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env_len++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_free_env
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Free the previously saved environment variable array.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session - NDMP session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_free_env(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int count = session->ns_data.dd_env_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < count; i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_data.dd_env[i].name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_data.dd_env[i].value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free((char *)session->ns_data.dd_env);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_env = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_save_nlist_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Save a copy of list of file names to be restored.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlist (input) - name list from data_start_recover request.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlistlen (input) - length of name list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * array of file name pointers.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Notes:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * free_nlist should be called to free the returned list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A null pointer indicates the end of the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_save_nlist_v2(ndmpd_session_t *session, ndmp_name *nlist,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nlistlen)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *namebuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *destbuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlistlen == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist = ndmp_malloc(sizeof (ndmp_name)*nlistlen);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_nlist == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < nlistlen; i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar namebuf = ndmp_malloc(strlen(nlist[i].name) + 1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (namebuf == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar destbuf = ndmp_malloc(strlen(nlist[i].dest) + 1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (destbuf == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(namebuf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(namebuf, nlist[i].name,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar strlen(nlist[i].name) + 1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(destbuf, nlist[i].dest,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar strlen(nlist[i].dest) + 1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist[i].name = namebuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist[i].dest = destbuf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist[i].ssid = nlist[i].ssid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist[i].fh_info = nlist[i].fh_info;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_free_nlist_v2
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Free a list created by ndmpd_save_nlist_v2.
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_free_nlist_v2(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < session->ns_data.dd_nlist_len; i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_data.dd_nlist[i].name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(session->ns_data.dd_nlist[i].dest);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_nlist != NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free((char *)session->ns_data.dd_nlist);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_free_nlist_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Free a list created by ndmpd_save_nlist_v3.
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_free_nlist_v3(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mem_ndmp_name_v3_t *tp; /* destination entry */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp = session->ns_data.dd_nlist_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < session->ns_data.dd_nlist_len; tp++, i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(tp->nm3_opath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(tp->nm3_dpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(tp->nm3_newnm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(session->ns_data.dd_nlist_v3);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_save_nlist_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Save a copy of list of file names to be restored.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlist (input) - name list from data_start_recover request.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nlistlen (input) - length of name list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * array of file name pointers.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Notes:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * free_nlist should be called to free the returned list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * A null pointer indicates the end of the list.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_save_nlist_v3(ndmpd_session_t *session, ndmp_name_v3 *nlist,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t nlistlen)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ulong_t i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_error rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_name_v3 *sp; /* source entry */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mem_ndmp_name_v3_t *tp; /* destination entry */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (nlistlen == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_ILLEGAL_ARGS_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp = session->ns_data.dd_nlist_v3 =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(sizeof (mem_ndmp_name_v3_t) * nlistlen);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_nlist_v3 == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NDMP_NO_MEM_ERR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp = nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < nlistlen; tp++, sp++, i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp->nm3_opath = strdup(sp->original_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!tp->nm3_opath) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NO_MEM_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!*sp->destination_dir) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp->nm3_dpath = NULL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* In V4 destination dir cannot be NULL */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_protocol_version == NDMPV4) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (!(tp->nm3_dpath = strdup(sp->destination_dir))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NO_MEM_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!*sp->new_name)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp->nm3_newnm = NULL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (!(tp->nm3_newnm = strdup(sp->new_name))) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = NDMP_NO_MEM_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp->nm3_node = quad_to_long_long(sp->node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp->nm3_fh_info = quad_to_long_long(sp->fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp->nm3_err = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "orig \"%s\"", tp->nm3_opath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dest \"%s\"", NDMP_SVAL(tp->nm3_dpath));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "name \"%s\"", NDMP_SVAL(tp->nm3_newnm));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "node %lld", tp->nm3_node);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "fh_info %lld", tp->nm3_fh_info);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rv != NDMP_NO_ERR)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_free_nlist_v3(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_free_nlist
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Free the recovery list based on the version
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_free_nlist(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (session->ns_protocol_version) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 1:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 2:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_free_nlist_v2(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 3:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case 4:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_free_nlist_v3(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unknown version %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_protocol_version);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fh_cmpv3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Comparison function used in sorting the Nlist based on their
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * file history info (offset of the entry on the tape)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * p (input) - pointer to P
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * q (input) - pointer to Q
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1: P < Q
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: P = Q
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 1: P > Q
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarfh_cmpv3(const void *p,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar const void *q)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#define FH_INFOV3(p) (((mem_ndmp_name_v3_t *)p)->nm3_fh_info)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (FH_INFOV3(p) < FH_INFOV3(q))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else if (FH_INFOV3(p) == FH_INFOV3(q))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#undef FH_INFOV3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_sort_nlist_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Sort the recovery list based on their offset on the tape
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_sort_nlist_v3(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!session || session->ns_data.dd_nlist_len == 0 ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar !session->ns_data.dd_nlist_v3)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) qsort(session->ns_data.dd_nlist_v3,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_nlist_len,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sizeof (mem_ndmp_name_v3_t), fh_cmpv3);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_send_reply
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Send the reply, check for error and print the msg if any error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * occured when sending the reply.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * connection (input) - connection pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Return:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_send_reply(ndmp_connection_t *connection, void *reply, char *msg)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(connection, NDMP_NO_ERR, reply) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "%s", msg);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_mtioctl
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Performs numerous filemark operations.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fd - file descriptor of the device
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cmd - filemark or record command
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * count - the number of operations to be performed
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_mtioctl(int fd, int cmd, int count)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct mtop mp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mt_op = cmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar mp.mt_count = count;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ioctl(fd, MTIOCTOP, &mp) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Failed to send command to tape: %m.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * quad_to_long_long
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert type quad to longlong_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdaru_longlong_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarquad_to_long_long(ndmp_u_quad q)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar u_longlong_t ull;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ull = ((u_longlong_t)q.high << 32) + q.low;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (ull);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * long_long_to_quad
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert long long to quad type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_u_quad
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarlong_long_to_quad(u_longlong_t ull)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_u_quad q;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar q.high = (ulong_t)(ull >> 32);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar q.low = (ulong_t)ull;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Krylset_socket_options(int sock)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl int val;
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl /* set send buffer size */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val = atoi((const char *)ndmpd_get_prop_default(NDMP_SOCKET_CSS, "60"));
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl if (val <= 0)
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val = 60;
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val <<= 10; /* convert the value from kilobytes to bytes */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &val, sizeof (val)) < 0)
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl NDMP_LOG(LOG_ERR, "SO_SNDBUF failed: %m");
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl /* set receive buffer size */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val = atoi((const char *)ndmpd_get_prop_default(NDMP_SOCKET_CRS, "60"));
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl if (val <= 0)
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val = 60;
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val <<= 10; /* convert the value from kilobytes to bytes */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val)) < 0)
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl NDMP_LOG(LOG_ERR, "SO_RCVBUF failed: %m");
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl /* don't wait to group tcp data */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val = 1;
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)) != 0)
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl NDMP_LOG(LOG_ERR, "TCP_NODELAY failed: %m");
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl /* tcp keep-alive */
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl val = 1;
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof (val)) != 0)
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl NDMP_LOG(LOG_ERR, "SO_KEEPALIVE failed: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_get_max_tok_seq
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the maximum permitted token sequence for token-based
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * backups.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_max_tok_seq
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_max_tok_seq(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (ndmp_max_tok_seq);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_buffer_get_size
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Return the NDMP transfer buffer size
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buffer size
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarlong
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_buffer_get_size(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar long xfer_size;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar xfer_size = atoi(ndmpd_get_prop_default(NDMP_MOVER_RECSIZE,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "60"));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (xfer_size > 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar xfer_size *= KILOBYTE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar xfer_size = REMOTE_RECORD_SIZE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Remote operation: %d", xfer_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Local operation: %lu", session->ns_mover.md_record_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((xfer_size = session->ns_mover.md_record_size) == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar xfer_size = MAX_RECORD_SIZE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "xfer_size: %d", xfer_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (xfer_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_lbr_init
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Initialize the LBR/NDMP backup parameters
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_lbr_init(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_ndmp_lbr_params != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ndmp_lbr_params already allocated.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_ndmp_lbr_params = ndmp_malloc(sizeof (ndmp_lbr_params_t));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_ndmp_lbr_params == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_ndmp_lbr_params->nlp_bkmap = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_ndmp_lbr_params->nlp_session = session;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) cond_init(&session->ns_ndmp_lbr_params->nlp_cv, 0, NULL);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_init(&session->ns_ndmp_lbr_params->nlp_mtx, 0, NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_init(&session->ns_lock, 0, NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_nref = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_lbr_cleanup
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Deallocate and cleanup all NDMP/LBR parameters
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_lbr_cleanup(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_abort_marking_v2(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_stop_buffer_worker(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_waitfor_op(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_free_reader_writer_ipc(session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_ndmp_lbr_params) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_ndmp_lbr_params->nlp_bkmap != -1)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) dbm_free(session->ns_ndmp_lbr_params->nlp_bkmap);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_release_list(session->ns_ndmp_lbr_params->nlp_exl);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_release_list(session->ns_ndmp_lbr_params->nlp_inc);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) cond_destroy(&session->ns_ndmp_lbr_params->nlp_cv);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_destroy(&session->ns_ndmp_lbr_params->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_FREE(session->ns_ndmp_lbr_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl * ndmp_wait_for_mover
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl * Wait for a mover to become active. Waiting is interrupted if session is
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl * aborted or mover gets to unexpected state.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl * 0 if success, -1 if failure.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Krylint
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Krylndmp_wait_for_mover(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl tlm_cmd_t *lcmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if ((nlp = ndmp_get_nlp(session)) == NULL)
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_lock(&nlp->nlp_mtx);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl while (session->ns_mover.md_state == NDMP_MOVER_STATE_PAUSED) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (session->ns_eof) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl NDMP_LOG(LOG_ERR, "EOF detected");
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (session->ns_data.dd_abort) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl NDMP_LOG(LOG_DEBUG, "Received data abort");
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl break;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl }
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl /* remote backup/restore error */
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (session->ns_mover.md_sock == -1 &&
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl session->ns_mover.md_listen_sock == -1) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl NDMP_LOG(LOG_ERR,
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl "Remote data connection terminated");
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl break;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl }
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl } else {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl /* local backup/restore error */
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if ((lcmd = nlp->nlp_cmds.tcs_command) != NULL) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (lcmd->tc_reader == TLM_STOP ||
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl lcmd->tc_reader == TLM_ABORT ||
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl lcmd->tc_writer == TLM_STOP ||
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl lcmd->tc_writer == TLM_ABORT) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl NDMP_LOG(LOG_ERR,
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl "Local data connection terminated");
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl break;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl }
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) cond_wait(&nlp->nlp_cv, &nlp->nlp_mtx);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl }
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_unlock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
f5b1cef2488dc579cb4312d49164f10debf8e97dJan Kryl return ((session->ns_mover.md_state == NDMP_MOVER_STATE_ACTIVE) ?
f5b1cef2488dc579cb4312d49164f10debf8e97dJan Kryl 0 : -1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is_buffer_erroneous
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Run a sanity check on the buffer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * TRUE: if the buffer seems to have error
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * FALSE: if the buffer is full and has valid data.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdaris_buffer_erroneous(tlm_buffer_t *buf)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar boolean_t rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = (buf == NULL || buf->tb_eot || buf->tb_eof ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar buf->tb_errno != 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rv) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (buf == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "buf == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "eot: %u, eof: %u, errno: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar buf->tb_eot, buf->tb_eof, buf->tb_errno);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_execute_cdb
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Main SCSI CDB execution program, this is used by message handler
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for the NDMP tape/SCSI execute CDB requests. This function uses
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * USCSI interface to run the CDB command and sets all the CDB parameters
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * in the SCSI query before calling the USCSI ioctl. The result of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CDB is returned in two places:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cmd.uscsi_status The status of CDB execution
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cmd.uscsi_rqstatus The status of sense requests
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * reply.error The general errno (ioctl)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * adapter_name (input) - name of SCSI adapter
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sid (input) - SCSI target ID
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * lun (input) - LUN number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * request (input) - NDMP client CDB request
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_execute_cdb(ndmpd_session_t *session, char *adapter_name, int sid, int lun,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_execute_cdb_request *request)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_execute_cdb_reply reply;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct uscsi_cmd cmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int fd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct open_list *olp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char rq_buf[255];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void *)&cmd, 0, sizeof (cmd));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void *)&reply, 0, sizeof (reply));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void *)rq_buf, 0, sizeof (rq_buf));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (request->flags == NDMP_SCSI_DATA_IN) {
b6b15642ffbc95b31765357dc6cc036b590c3a97Reza Sabdar cmd.uscsi_flags = USCSI_READ | USCSI_RQENABLE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((cmd.uscsi_bufaddr =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_malloc(request->datain_len)) == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_MEM_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(session->ns_connection,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_NO_ERR, (void *)&reply) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "error sending"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar " scsi_execute_cdb reply.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_buflen = request->datain_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (request->flags == NDMP_SCSI_DATA_OUT) {
65451a03349bdb7f4bf79a8f29d4065772e01caeReza Sabdar cmd.uscsi_flags = USCSI_WRITE | USCSI_RQENABLE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_bufaddr = request->dataout.dataout_val;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_buflen = request->dataout.dataout_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
86c48bbfeb72d5a6ee171e713059939bab658b77Reza Sabdar cmd.uscsi_flags = USCSI_RQENABLE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_bufaddr = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_buflen = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
65451a03349bdb7f4bf79a8f29d4065772e01caeReza Sabdar cmd.uscsi_rqlen = sizeof (rq_buf);
65451a03349bdb7f4bf79a8f29d4065772e01caeReza Sabdar cmd.uscsi_rqbuf = rq_buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_timeout = (request->timeout < 1000) ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar 1 : (request->timeout / 1000);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_cdb = (caddr_t)request->cdb.cdb_val;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmd.uscsi_cdblen = request->cdb.cdb_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmd: 0x%x, len: %d, flags: %d, datain_len: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->cdb.cdb_val[0] & 0xff, request->cdb.cdb_len,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->flags, request->datain_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "dataout_len: %d, timeout: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar request->dataout.dataout_len, request->timeout);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (request->cdb.cdb_len > 12) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_ILLEGAL_ARGS_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(session->ns_connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending execute_cdb reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (request->flags == NDMP_SCSI_DATA_IN)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(cmd.uscsi_bufaddr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_NO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((olp = ndmp_open_list_find(adapter_name, sid, lun)) != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fd = olp->ol_fd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_DEV_NOT_OPEN_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_send_reply(session->ns_connection, (void *) &reply,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "sending execute_cdb reply");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (request->flags == NDMP_SCSI_DATA_IN)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(cmd.uscsi_bufaddr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ioctl(fd, USCSICMD, &cmd) < 0) {
674cb4b09c0706bc1cb658e79f39997d43bad8a0Reza Sabdar if (errno != EIO && errno != 0)
674cb4b09c0706bc1cb658e79f39997d43bad8a0Reza Sabdar NDMP_LOG(LOG_ERR,
674cb4b09c0706bc1cb658e79f39997d43bad8a0Reza Sabdar "Failed to send command to device: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ioctl(USCSICMD) error: %m");
7a088f03b431bdffa96c3b2175964d4d38420caaReza Sabdar if (cmd.uscsi_status == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.error = NDMP_IO_ERR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.status = cmd.uscsi_status;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (request->flags == NDMP_SCSI_DATA_IN) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.datain.datain_len = cmd.uscsi_buflen;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.datain.datain_val = cmd.uscsi_bufaddr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.dataout_len = request->dataout.dataout_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.ext_sense.ext_sense_len = cmd.uscsi_rqlen - cmd.uscsi_rqresid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar reply.ext_sense.ext_sense_val = rq_buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void *)&reply) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Error sending scsi_execute_cdb reply.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (request->flags == NDMP_SCSI_DATA_IN)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(cmd.uscsi_bufaddr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_stop_local_reader
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Stops a mover reader thread (for local backup only)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cmds (input) - reader/writer command struct
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_stop_local_reader(ndmpd_session_t *session, tlm_commands_t *cmds)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl ndmp_lbr_params_t *nlp;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (session != NULL && session->ns_data.dd_sock == -1) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl /* 2-way restore */
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if (cmds != NULL && cmds->tcs_reader_count > 0) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl if ((nlp = ndmp_get_nlp(session)) != NULL) {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_lock(&nlp->nlp_mtx);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl cmds->tcs_command->tc_reader = TLM_STOP;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) cond_broadcast(&nlp->nlp_cv);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_unlock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Stops a mover reader thread (for remote backup only)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cmds (input) - reader/writer command struct
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_stop_remote_reader(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session->ns_data.dd_sock >= 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 3-way restore.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "data.sock: %d", session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(session->ns_data.dd_sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_data.dd_sock = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_wait_for_reader
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Wait for a reader until get done (busy wait)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_wait_for_reader(tlm_commands_t *cmds)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmds == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmds == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "reader_count: %d", cmds->tcs_reader_count);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (cmds->tcs_reader_count > 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) sleep(1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_open_list_find
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Find a specific device in the open list
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dev (input) - device name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sid (input) - SCSI target ID
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * lun (input) - LUN number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * pointer to the open list entry
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstruct open_list *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_open_list_find(char *dev, int sid, int lun)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct ol_head *olhp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct open_list *olp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dev == NULL || *dev == '\0') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olhp = &ol_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (olp = LIST_FIRST(olhp); olp != NULL; olp = LIST_NEXT(olp, ol_q))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcmp(olp->ol_devnm, dev) == 0 && olp->ol_sid == sid &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_lun == lun) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (olp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_open_list_add
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Add a specific device to the open list
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * conn (input) - connection pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dev (input) - device name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sid (input) - SCSI target ID
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * lun (input) - LUN number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fd (input) - the device file descriptor
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * errno
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_open_list_add(ndmp_connection_t *conn, char *dev, int sid, int lun, int fd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct ol_head *olhp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct open_list *olp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dev == NULL || *dev == '\0') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (EINVAL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "conn: 0x%08x, dev: %s, sid: %d, lun: %d", conn, dev, sid, lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olhp = &ol_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((olp = ndmp_open_list_find(dev, sid, lun)) != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "already in list");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The adapter handle can be opened many times by the clients.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Only when the target is set, we must check and reject the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * open request if the device is already being used by another
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sid == -1)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_nref++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = EBUSY;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if ((olp = ndmp_malloc(sizeof (struct open_list))) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = ENOMEM;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if ((olp->ol_devnm = strdup(dev)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Out of memory.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(olp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = ENOMEM;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->cl_conn = conn;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_nref = 1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_sid = sid;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_lun = lun;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fd > 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_fd = fd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_fd = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_INSERT_HEAD(olhp, olp, ol_q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_open_list_del
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Delete a specific device from the open list
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dev (input) - device name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * sid (input) - SCSI target ID
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * lun (input) - LUN number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * errno
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_open_list_del(char *dev, int sid, int lun)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct open_list *olp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dev == NULL || *dev == '\0') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (EINVAL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((olp = ndmp_open_list_find(dev, sid, lun)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "%s not found", dev);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (ENOENT);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (--olp->ol_nref <= 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Removed dev: %s, sid: %d, lun: %d", dev, sid, lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_REMOVE(olp, ol_q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(olp->ol_devnm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(olp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_open_list_release
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Close all the resources belonging to this connection.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_connection_t *conn : connection identifier
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_open_list_release(ndmp_connection_t *conn)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct ol_head *olhp = &ol_head;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct open_list *olp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct open_list *next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp = LIST_FIRST(olhp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (olp != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar next = LIST_NEXT(olp, ol_q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "olp->conn 0x%08x", olp->cl_conn);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (olp->cl_conn == conn) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Removed dev: %s, sid: %d, lun: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp->ol_devnm, olp->ol_sid, olp->ol_lun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar LIST_REMOVE(olp, ol_q);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (olp->ol_fd > 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(olp->ol_fd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(olp->ol_devnm);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(olp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar olp = next;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ol_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_stop_buffer_worker
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Stop all reader and writer threads for a specific buffer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_stop_buffer_worker(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_commands_t *cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_tape.td_pos = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(session)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds = &nlp->nlp_cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmds->tcs_command == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmds->tcs_command == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_reader = cmds->tcs_writer = TLM_ABORT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_command->tc_reader = TLM_ABORT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_command->tc_writer = TLM_ABORT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (cmds->tcs_reader_count > 0 ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_writer_count > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "trying to stop buffer worker");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) sleep(1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_stop_reader_thread
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Stop only the reader threads of a specific buffer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_stop_reader_thread(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_commands_t *cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(session)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds = &nlp->nlp_cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmds->tcs_command == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmds->tcs_command == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_reader = TLM_ABORT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_command->tc_reader = TLM_ABORT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (cmds->tcs_reader_count > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "trying to stop reader thread");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) sleep(1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_stop_reader_thread
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Stop only the writer threads of a specific buffer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_stop_writer_thread(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_commands_t *cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(session)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds = &nlp->nlp_cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmds->tcs_command == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmds->tcs_command == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_lock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_writer = TLM_ABORT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_command->tc_writer = TLM_ABORT;
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) cond_broadcast(&nlp->nlp_cv);
a23888a301b4822208e58d55cccf1b42c8e46cc7Jan Kryl (void) mutex_unlock(&nlp->nlp_mtx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (cmds->tcs_writer_count > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "trying to stop writer thread");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) sleep(1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_free_reader_writer_ipc
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Free and release the reader/writer buffers and the IPC structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * for reader and writer threads.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_free_reader_writer_ipc(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_lbr_params_t *nlp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_commands_t *cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((nlp = ndmp_get_nlp(session)) != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds = &nlp->nlp_cmds;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmds->tcs_command != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmds->tcs_command->tc_ref: %d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cmds->tcs_command->tc_ref);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_release_reader_writer_ipc(cmds->tcs_command);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_waitfor_op
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Wait for a session reference count to drop to zero
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_waitfor_op(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (session != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (session->ns_nref > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) sleep(1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "waiting for session nref: %d", session->ns_nref);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_session_ref
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Increment the reference count of the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_session_ref(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_nref++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_session_unref
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Decrement the reference count of the session
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_session_unref(ndmpd_session_t *session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar session->ns_nref--;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&session->ns_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_addr2str_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert the address type to a string
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * type (input) - address type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * type in string
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_addr2str_v3(ndmp_addr_type type)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = "Local";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = "TCP";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_FC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = "FC";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_IPC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = "IPC";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = "Unknown";
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_valid_v3addr_type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Make sure that the NDMP address is from any of the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * valid types
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * type (input) - address type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 1: valid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: invalid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_valid_v3addr_type(ndmp_addr_type type)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar boolean_t rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_FC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_IPC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = TRUE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_copy_addr_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copy NDMP address from source to destination (V2 and V3 only)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dst (ouput) - destination address
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * src (input) - source address
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_copy_addr_v3(ndmp_addr_v3 *dst, ndmp_addr_v3 *src)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->addr_type = src->addr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (src->addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* nothing */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_ip_v3 = htonl(src->tcp_ip_v3);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_port_v3 = src->tcp_port_v3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_FC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_IPC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_copy_addr_v4
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copy NDMP address from source to destination. V4 has a extra
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * environment list inside the address too which needs to be copied.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * dst (ouput) - destination address
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * src (input) - source address
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_copy_addr_v4(ndmp_addr_v4 *dst, ndmp_addr_v4 *src)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->addr_type = src->addr_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_len_v4 = src->tcp_len_v4;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (src->addr_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_LOCAL:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* nothing */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_TCP:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_addr_v4 = ndmp_malloc(sizeof (ndmp_tcp_addr_v4) *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar src->tcp_len_v4);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dst->tcp_addr_v4 == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < src->tcp_len_v4; i++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_ip_v4(i) = htonl(src->tcp_ip_v4(i));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_port_v4(i) = src->tcp_port_v4(i);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_env_v4(i).addr_env_len = 0; /* Solaris */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dst->tcp_env_v4(i).addr_env_val = 0; /* Solaris */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_FC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_ADDR_IPC:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_connect_sock_v3
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Creates a socket and connects to the specified address/port
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * addr (input) - IP address
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * port (input) - port number
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0: on success
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1: otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_connect_sock_v3(ulong_t addr, ushort_t port)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int sock;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct sockaddr_in sin;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "addr %s:%d", inet_ntoa(IN_ADDR(addr)), port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sock = socket(AF_INET, SOCK_STREAM, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sock < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Socket error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset((void *) &sin, 0, sizeof (sin));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sin.sin_family = AF_INET;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sin.sin_addr.s_addr = htonl(addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sin.sin_port = htons(port);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (connect(sock, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Connect error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(sock);
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl set_socket_options(sock);
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl NDMP_LOG(LOG_DEBUG, "sock %d", sock);
97f7c4750238e3c507904468e4e9f17b15a08e2dJan Kryl
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (sock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_create_socket
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Creates a socket for listening for accepting data connections.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session (input) - session pointer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * addr (output) - location to store address of socket.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * port (output) - location to store port of socket.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * 0 - success.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * -1 - error.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_create_socket(ulong_t *addr, ushort_t *port)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *p;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int length;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int sd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct sockaddr_in sin;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar /* Try the user's prefered NIC IP address */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p = ndmpd_get_prop(NDMP_MOVER_NIC);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar /* Try host's IP address */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!p || *p == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p = gethostaddr();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar /* Try default NIC's IP address (if DNS failed) */
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar if (!p)
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar p = get_default_nic_addr();
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar
588541fbf64fffe619698198cef04af1900f1f86Reza Sabdar /* Fail if no IP can be obtained */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!p) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR, "Undetermined network port.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *addr = inet_addr(p);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sd = socket(AF_INET, SOCK_STREAM, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sd < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Socket error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sin.sin_family = AF_INET;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sin.sin_addr.s_addr = INADDR_ANY;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sin.sin_port = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar length = sizeof (sin);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (bind(sd, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Bind error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(sd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sd = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (getsockname(sd, (struct sockaddr *)&sin, &length) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "getsockname error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(sd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sd = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (listen(sd, 5) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Listen error: %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(sd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sd = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *port = sin.sin_port;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (sd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * cctime
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Convert the specified time into a string. It's like
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ctime(), but:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - chops the trailing '\n' of ctime.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - and returns "the epoch" if time is 0.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * "": invalid argument.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * "the epoch": if time is 0.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * string format of the time.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarcctime(time_t *t)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *bp, *cp;
89f9eb8701145fa396cfc2ac0b468bd5c8466494Reza Sabdar static char tbuf[BUFSIZ];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!t)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ("");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*t == (time_t)0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ("the epoch");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
89f9eb8701145fa396cfc2ac0b468bd5c8466494Reza Sabdar if ((bp = ctime_r(t, tbuf, BUFSIZ)) == NULL)
89f9eb8701145fa396cfc2ac0b468bd5c8466494Reza Sabdar return ("");
89f9eb8701145fa396cfc2ac0b468bd5c8466494Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cp = strchr(bp, '\n');
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *cp = '\0';
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (bp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_new_job_name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Create a job name for each backup/restore to keep track
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * jname (output) - job name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * jname
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_new_job_name(char *jname)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (jname != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) snprintf(jname, TLM_MAX_BACKUP_JOB_NAME, "%s%d",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_RCF_BASENAME, ndmp_job_cnt++);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "jname: \"%s\"", jname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (jname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fs_is_valid_logvol
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Check if the log path exists
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * path (input) - log path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * FALSE: invalid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * TRUE: valid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarfs_is_valid_logvol(char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stat64(path, &st) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_mk_temp
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Make a temporary file using the working directory path and the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * jobname
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buf (output) - the temporary file name path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buf
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_mk_temp(char *buf)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char fname[TLM_MAX_BACKUP_JOB_NAME];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar const char *dir;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!buf)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir = ndmpd_get_prop(NDMP_DEBUG_PATH);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dir == 0 || *dir == '\0') {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "NDMP work path not specified");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!fs_is_valid_logvol((char *)dir)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Log file path cannot be on system volumes.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dir += strspn(dir, " \t");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!*dir) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "NDMP work path not specified");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_new_job_name(fname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) tlm_cat_path(buf, (char *)dir, fname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_make_bk_dir_path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Make a directory path for temporary files under the NDMP
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * working directory.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buf (output) - result path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * fname (input) - the file name
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buf
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_make_bk_dir_path(char *buf, char *fname)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar const char *p;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char path[PATH_MAX];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!buf || !fname || !*fname)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p = ndmpd_get_prop(NDMP_DEBUG_PATH);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (p == NULL || *p == '\0' || !fs_is_valid_logvol((char *)p)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strlcpy(path, (char *)p, PATH_MAX);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) trim_whitespace(path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((name = strrchr(fname, '/')) == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar name = fname;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) tlm_cat_path(buf, path, name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_is_chkpnt_root
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Is this a root checkpoint (snapshot) directory.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Note: a temporary function
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_is_chkpnt_root(char *path)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stat64(path, &st) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Couldn't stat path \"%s\"", path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_make_exc_list
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Make a list of files that should not be backed up.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameters:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * list - array of character strings
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar **
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_make_exc_list(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *val, **cpp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i, n;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar n = sizeof (exls);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((cpp = ndmp_malloc(n)) != NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; exls[i] != NULL; i++)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cpp[i] = exls[i];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * If ndmpd_get_prop returns NULL, the array will be
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * null-terminated.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar val = ndmpd_get_prop(NDMP_DEBUG_PATH);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cpp[i] = val;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (cpp);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_get_bk_dir_ino
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the inode number of the backup directory
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_bk_dir_ino(ndmp_lbr_params_t *nlp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rv;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct stat64 st;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (stat64(nlp->nlp_backup_path, &st) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Getting inode # of \"%s\"",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rv = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_bkdirino = st.st_ino;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "nlp_bkdirino: %lu",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (uint_t)nlp->nlp_bkdirino);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rv);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_check_utf8magic
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Check if the magic string for exists in the tar header. This
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * magic string (which also indicates that the file names are in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * UTF8 format) is used as a crest to indetify our own tapes.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This checking is always done before all restores except DAR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * restores.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_check_utf8magic(tlm_cmd_t *cmd)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *cp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err, len, actual_size;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmd == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmd == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cmd->tc_buffers == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "cmd->tc_buffers == NULL");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* wait until the first buffer gets full. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tlm_buffer_in_buf_wait(cmd->tc_buffers);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = actual_size = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cp = tlm_get_read_buffer(RECORDSIZE, &err, cmd->tc_buffers,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar &actual_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cp == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Can't read from buffers, err: %d", err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len = strlen(NDMPUTF8MAGIC);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (actual_size < len) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Not enough data in the buffers");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ((strncmp(cp, NDMPUTF8MAGIC, len) == 0) ? TRUE : FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_get_cur_bk_time
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get the backup checkpoint time.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_cur_bk_time(ndmp_lbr_params_t *nlp, time_t *tp, char *jname)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!nlp || !nlp->nlp_backup_path || !tp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Invalid argument");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!fs_is_chkpnt_enabled(nlp->nlp_backup_path)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Not a chkpnt volume %s",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nlp->nlp_backup_path);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *tp = time(NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar err = tlm_get_chkpnt_time(nlp->nlp_backup_path, !NLP_ISCHKPNTED(nlp),
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tp, jname);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (err != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Can't checkpoint time");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "%s", cctime(tp));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (err);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * get_relative_path
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_relative_path(char *base, char *fullpath)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *p = fullpath;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!base || !*base)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (fullpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar while (*base) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*base != *p)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p++; base++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (*p == '/')
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar p++;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return ((*base) ? fullpath : p);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_get_nlp
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get NDMP local backup parameters
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameter:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * session cooke
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LBR structure
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_lbr_params_t *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_nlp(void *cookie)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cookie == NULL)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (NULL);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (((ndmpd_session_t *)cookie)->ns_ndmp_lbr_params);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * is_tape_unit_ready
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Check if the tape device is ready or not
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdaris_tape_unit_ready(char *adptnm, int dev_id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int try;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int fd = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar try = TUR_MAX_TRY;
295e611f647a9229cb7b346b6febc77618b605c4Reza Sabdar if (dev_id <= 0) {
295e611f647a9229cb7b346b6febc77618b605c4Reza Sabdar if ((fd = open(adptnm, O_RDONLY | O_NDELAY)) < 0)
295e611f647a9229cb7b346b6febc77618b605c4Reza Sabdar return (FALSE);
295e611f647a9229cb7b346b6febc77618b605c4Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar fd = dev_id;
295e611f647a9229cb7b346b6febc77618b605c4Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar do {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (scsi_test_unit_ready(fd) >= 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unit is ready");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
86c48bbfeb72d5a6ee171e713059939bab658b77Reza Sabdar if (dev_id <= 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(fd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (TRUE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unit not ready");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) usleep(TUR_WAIT);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } while (--try > 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
86c48bbfeb72d5a6ee171e713059939bab658b77Reza Sabdar if (dev_id <= 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(fd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Unit didn't get ready");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (FALSE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * scsi_test_unit_ready
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This is for Test Unit Read, without this function, the only
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * impact is getting EBUSY's before each operation which we have
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * busy waiting loops checking EBUSY error code.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarscsi_test_unit_ready(int dev_id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar struct uscsi_cmd ucmd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar union scsi_cdb cdb;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int retval;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset(&ucmd, 0, sizeof (struct uscsi_cmd));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memset(&cdb, 0, sizeof (union scsi_cdb));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cdb.scc_cmd = SCMD_TEST_UNIT_READY;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ucmd.uscsi_cdb = (caddr_t)&cdb;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ucmd.uscsi_cdblen = CDB_GROUP0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ucmd.uscsi_flags |= USCSI_SILENT;
c211fc479225fa54805cf480633bf6689ca9a2dbReza Sabdar ucmd.uscsi_timeout = 60; /* Allow maximum 1 min */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar retval = ioctl(dev_id, USCSICMD, &ucmd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (retval != 0 && errno != EIO) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Failed to send inquiry request to device: %m.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Inquiry request failed for"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar " dev_id:%d err=%d -%m", dev_id, errno);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar retval = -errno;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar retval = -(ucmd.uscsi_status);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (retval);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmp_load_params
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Load the parameters.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameter:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_load_params(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dump_path_node = ndmpd_get_prop_yorn(NDMP_DUMP_PATHNODE_ENV) ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar TRUE : FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_tar_path_node = ndmpd_get_prop_yorn(NDMP_TAR_PATHNODE_ENV) ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar TRUE : FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_ignore_ctime =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_get_prop_yorn(NDMP_IGNCTIME_ENV) ? TRUE : FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_include_lmtime = ndmpd_get_prop_yorn(NDMP_INCLMTIME_ENV) ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar TRUE : FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_max_tok_seq = atoi(ndmpd_get_prop_default(NDMP_MAXSEQ_ENV, "9"));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_full_restore_path = ndmpd_get_prop_yorn(NDMP_FULL_RESTORE_PATH) ?
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar TRUE : FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_fhinode = ndmpd_get_prop_yorn(NDMP_FHIST_INCR_ENV) ? TRUE : FALSE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Get the value from ndmp SMF property. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dar_support = ndmpd_get_prop_yorn(NDMP_DAR_SUPPORT);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((ndmp_ver = atoi(ndmpd_get_prop(NDMP_VERSION_ENV))) == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_ver = NDMPVER;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * randomize
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Randomize the contents of a buffer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameter:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * buffer (output) - destination buffer
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * size (input) - buffer size
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarrandomize(unsigned char *buffer, int size)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* LINTED improper alignment */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int *p = (unsigned int *)buffer;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int dwlen = size / sizeof (unsigned int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int remlen = size % sizeof (unsigned int);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int tmp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < dwlen; i++)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *p++ = random();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (remlen) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar tmp = random();
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) memcpy(p, &tmp, remlen);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_get_file_entry_type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Converts the mode to the NDMP file type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Parameter:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * mode (input) - file mode
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ftype (output) - file type
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * void
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_get_file_entry_type(int mode, ndmp_file_type *ftype)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (mode & S_IFMT) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case S_IFIFO:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_FIFO;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case S_IFCHR:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_CSPEC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case S_IFDIR:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_DIR;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case S_IFBLK:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_BSPEC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case S_IFREG:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_REG;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case S_IFLNK:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_SLINK;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *ftype = NDMP_FILE_SOCK;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Set a private data in the plugin context
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_context_set_specific(ndmp_context_t *nctx, void *ptr)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar nctx->nc_pldata = ptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Get a private data in the plugin context
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_context_get_specific(ndmp_context_t *nctx)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (nctx->nc_pldata);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmpd_backup_type_t
8c4f9701439555b41fbfe7848508f53b52166007Janice Changndmp_get_backup_type(ndmp_context_t *ctx)
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang{
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang ndmpd_session_t *session = (ndmpd_session_t *)ctx->nc_ddata;
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang return (session->ns_butype);
8c4f9701439555b41fbfe7848508f53b52166007Janice Chang}