2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Use is subject to license terms.
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#include <locale.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <strings.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <unistd.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <fcntl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <door.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <thread.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ndmpd_door.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libndmp.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_door_fildes = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic char *buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_door_ctx_t *dec_ctx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic ndmp_door_ctx_t *enc_ctx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic door_arg_t arg;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic mutex_t ndmp_lock = DEFAULTMUTEX;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_door_setup(int opcode);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_door_call(void);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_door_fini(void);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* ndmp library APIs */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_devinfo(ndmp_devinfo_t **dip, size_t *size)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_devinfo_t *dipptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int opcode = NDMP_DEVICES_GET_INFO;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_setup(opcode))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_call())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* get the number of devices available */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *size = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *dip = malloc(sizeof (ndmp_devinfo_t) * *size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!*dip) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_MEM_ALLOC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr = *dip;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < *size; i++, dipptr++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_dev_type = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_name = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_lun = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_sid = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_vendor = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_product = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr->nd_revision = ndmp_door_get_string(dec_ctx);
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar dipptr->nd_serial = ndmp_door_get_string(dec_ctx);
7bc22e45a20f905cdd06bb98c98a5c8be7fd25c0Reza Sabdar dipptr->nd_wwn = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fini()) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(*dip);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarerr:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_devinfo_free(ndmp_devinfo_t *dip, size_t size)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_devinfo_t *dipptr;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dipptr = dip;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < size; i++, dipptr++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dipptr->nd_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dipptr->nd_vendor);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dipptr->nd_product);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dipptr->nd_revision);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(dip);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_terminate_session(int session)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int ret;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int opcode = NDMP_TERMINATE_SESSION_ID;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_setup(opcode))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, session);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_call())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ret = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fini())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (ret);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarerr:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_session_info(ndmp_session_info_t **sinfo, size_t *size)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int status;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i, j;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_session_info_t *sp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_pval_t *ep;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_name_t *np;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_name_v3_t *npv3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int opcode = NDMP_SHOW;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_setup(opcode))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_call())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* number of sessions */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *size = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *sinfo = malloc((sizeof (ndmp_session_info_t)) * *size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!*sinfo) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_MEM_ALLOC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp = *sinfo;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < *size; i++, sp++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar status = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (status == NDMP_SESSION_NODATA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* connection common info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_sid = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_pver = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_auth = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_eof = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_cl_addr = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * scsi and tape data are same for all version,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * so keep reading
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* connection common scsi info. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_scsi.ns_scsi_open = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_scsi.ns_adapter_name = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_scsi.ns_valid_target_set = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sp->nsi_scsi.ns_valid_target_set) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_scsi.ns_scsi_id = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_scsi.ns_lun = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* connection common tape info. */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_fd = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sp->nsi_tape.nt_fd != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_rec_count =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_mode = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_dev_name =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_adapter_name =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_sid = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_tape.nt_lun = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* all the V2 mover data are same as V3/V4 */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_state = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_mode = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_pause_reason = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_halt_reason = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_rec_size = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_rec_num = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_mov_pos = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_window_offset = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_window_length = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_sock = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Read V3/V4 mover info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((sp->nsi_pver == NDMP_V3) || (sp->nsi_pver == NDMP_V4)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_listen_sock =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_addr_type =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_mover.nm_tcp_addr =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* connection common data info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_oper = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_state = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_halt_reason = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_sock = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_addr_type = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_abort = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_read_offset = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_read_length = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_total_size = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_env_len = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_env =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar malloc(sizeof (ndmp_dt_pval_t) * sp->nsi_data.nd_env_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!sp->nsi_data.nd_env) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_MEM_ALLOC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ep = sp->nsi_data.nd_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (j = 0; j < sp->nsi_data.nd_env_len; j++, ep++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ep->np_name = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ep->np_value = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_tcp_addr = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Read V2 data info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sp->nsi_pver == NDMP_V2) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nld_nlist_len =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_int64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_nlist.nld_nlist =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar malloc(sizeof (ndmp_dt_name_t) *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nld_nlist_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!sp->nsi_data.nd_nlist.nld_nlist) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_MEM_ALLOC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar np = sp->nsi_data.nd_nlist.nld_nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (j = 0; j < sp->nsi_data.nld_nlist_len; j++, np++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar np->nn_name = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar np->nn_dest = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if ((sp->nsi_pver == NDMP_V3) ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (sp->nsi_pver == NDMP_V4)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Read V3/V4 data info */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_nlist.nld_dt_v3.dv3_listen_sock =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_nlist.nld_dt_v3.dv3_bytes_processed =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nld_nlist_len =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nd_nlist.nld_dt_v3.dv3_nlist =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar malloc(sizeof (ndmp_dt_name_v3_t) *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp->nsi_data.nld_nlist_len);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!sp->nsi_data.nd_nlist.nld_dt_v3.dv3_nlist) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_MEM_ALLOC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar npv3 = sp->nsi_data.nd_nlist.nld_dt_v3.dv3_nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (j = 0; j < sp->nsi_data.nld_nlist_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar j++, npv3++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar npv3->nn3_opath = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar npv3->nn3_dpath = ndmp_door_get_string(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar npv3->nn3_node = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar npv3->nn3_fh_info =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fini())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarerr:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_session_info_free(ndmp_session_info_t *sinfo, size_t size)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_session_info_t *sp;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_pval_t *ep;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_name_t *np;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_dt_name_v3_t *npv3;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int i, j;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar sp = sinfo;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (i = 0; i < size; i++, sp++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_cl_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_scsi.ns_adapter_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sp->nsi_tape.nt_fd != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_tape.nt_dev_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_tape.nt_adapter_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((sp->nsi_pver == NDMP_V3) || (sp->nsi_pver == NDMP_V4))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_mover.nm_tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ep = sp->nsi_data.nd_env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (j = 0; j < sp->nsi_data.nd_env_len; j++, ep++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(ep->np_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(ep->np_value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_data.nd_env);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_data.nd_tcp_addr);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (sp->nsi_pver == NDMP_V2) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar np = sp->nsi_data.nd_nlist.nld_nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (j = 0; j < sp->nsi_data.nld_nlist_len; j++, np++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(np->nn_name);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(np->nn_dest);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_data.nd_nlist.nld_nlist);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if ((sp->nsi_pver == NDMP_V3) ||
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (sp->nsi_pver == NDMP_V4)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar npv3 = sp->nsi_data.nd_nlist.nld_dt_v3.dv3_nlist;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (j = 0; j < sp->nsi_data.nld_nlist_len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar j++, npv3++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(npv3->nn3_opath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(npv3->nn3_dpath);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sp->nsi_data.nd_nlist.nld_dt_v3.dv3_nlist);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(sinfo);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* ARGSUSED */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_get_stats(ndmp_stat_t *statp)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int opcode = NDMP_GET_STAT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!statp) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_INVALID_ARG;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_setup(opcode))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_call())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_trun = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_twait = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_nbk = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_nrs = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_rfile = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_wfile = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_rdisk = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_wdisk = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_rtape = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar statp->ns_wtape = ndmp_door_get_uint64(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fini())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarerr:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_status(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int opcode = NDMP_GET_DOOR_STATUS;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_setup(opcode))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_call())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fini())
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto err;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarerr:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_lock);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_setup(int opcode)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /* Open channel to NDMP service */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((ndmp_door_fildes == -1) &&
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (ndmp_door_fildes = open(NDMP_DOOR_SVC, O_RDONLY)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_DOOR_OPEN;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar buf = malloc(NDMP_DOOR_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (!buf) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_MEM_ALLOC;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar enc_ctx = ndmp_door_encode_start(buf, NDMP_DOOR_SIZE);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (enc_ctx == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_DOOR_ENCODE_START;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, opcode);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_call(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint32_t used;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rc;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((ndmp_door_encode_finish(enc_ctx, &used)) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_DOOR_ENCODE_FINISH;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar arg.data_ptr = buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar arg.data_size = used;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar arg.desc_ptr = NULL;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar arg.desc_num = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar arg.rbuf = buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar arg.rsize = NDMP_DOOR_SIZE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (door_call(ndmp_door_fildes, &arg) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_DOOR_SRV_TIMEOUT;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(ndmp_door_fildes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_fildes = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dec_ctx = ndmp_door_decode_start(arg.data_ptr, arg.data_size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rc = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (rc != NDMP_DOOR_SRV_SUCCESS) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_DOOR_SRV_OPERATION;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_fini(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((ndmp_door_decode_finish(dec_ctx)) != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_errno = ENDMP_DOOR_DECODE_FINISH;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(buf);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}