2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
674cb4b09c0706bc1cb658e79f39997d43bad8a0Reza Sabdar * Copyright 2009 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
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* This file contains all the door server code */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <door.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <alloca.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <errno.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <note.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libintl.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ndmpd_door.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* static variables */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmp_door_fildes = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic mutex_t ndmp_doorsrv_mutex;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* static routines */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic void ndmp_door_server(void *cookie, char *ptr, size_t size,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar door_desc_t *dp, uint_t n_desc);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Statistics used in ndmpstat command
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_stat_t ndstat;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_init(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int fd;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fildes != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp_door_init: ndmpd service is already running.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((ndmp_door_fildes = door_create(ndmp_door_server,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NULL, DOOR_UNREF)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Could not create door.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) unlink(NDMP_DOOR_SVC);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((fd = creat(NDMP_DOOR_SVC, 0444)) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Can't create %s: %m.",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DOOR_SVC);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) door_revoke(ndmp_door_fildes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_fildes = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(fd);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fdetach(NDMP_DOOR_SVC);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (fattach(ndmp_door_fildes, NDMP_DOOR_SVC) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ndmp_door_init: fattach failed %m");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) door_revoke(ndmp_door_fildes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_fildes = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "ndmp_door_init: Door server successfully started");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_fini(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_lock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmp_door_fildes != -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) fdetach(NDMP_DOOR_SVC);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) door_revoke(ndmp_door_fildes);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_fildes = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) mutex_unlock(&ndmp_doorsrv_mutex);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarboolean_t
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_check(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar door_info_t info;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int door;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((door = open(NDMP_DOOR_SVC, O_RDONLY)) < 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (door_info(door, &info) < 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(door);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (info.di_target > 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_ERR,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "Service already running: pid %ld", info.di_target);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(door);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) close(door);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/* door server */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*ARGSUSED*/
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarvoid
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmp_door_server(void *cookie, char *ptr, size_t size,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar door_desc_t *dp, uint_t n_desc)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NOTE(ARGUNUSED(cookie,dp,n_desc))
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int req_type;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *buf;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int buflen;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int used;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *dec_ctx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_ctx_t *enc_ctx;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int dec_status;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar unsigned int enc_status;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar dec_ctx = ndmp_door_decode_start(ptr, size);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (dec_ctx == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar req_type = ndmp_door_get_uint32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar buflen = NDMP_DOOR_SIZE;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((buf = alloca(buflen)) == NULL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG, "Out of memory.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_door_decode_finish(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar enc_ctx = ndmp_door_encode_start(buf, buflen);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (enc_ctx == 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_door_decode_finish(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
674cb4b09c0706bc1cb658e79f39997d43bad8a0Reza Sabdar if (req_type != NDMP_GET_STAT)
674cb4b09c0706bc1cb658e79f39997d43bad8a0Reza Sabdar NDMP_LOG(LOG_DEBUG, "ndmp_door_server: req_type=%d", req_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar switch (req_type) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_GET_DOOR_STATUS: {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_DEVICES_GET_INFO: {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_get_devs(enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_SHOW: {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_connect_list_get(enc_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_TERMINATE_SESSION_ID: {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int status, id;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar id = ndmp_door_get_int32(dec_ctx);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar status = ndmpd_connect_kill_id(id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (status == -1) /* session not found */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DOOR_SRV_SUCCESS);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar else
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_DOOR_SRV_SUCCESS);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, status);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar case NDMP_GET_STAT:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_SUCCESS);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, ndstat.ns_trun);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, ndstat.ns_twait);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, ndstat.ns_nbk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, ndstat.ns_nrs);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, ndstat.ns_rfile);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, ndstat.ns_wfile);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, ndstat.ns_rdisk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, ndstat.ns_wdisk);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, ndstat.ns_rtape);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint64(enc_ctx, ndstat.ns_wtape);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar break;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar default:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar NDMP_LOG(LOG_DEBUG,
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar "ndmp_door_server: Invalid request type 0x%x", req_type);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto decode_error;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((dec_status = ndmp_door_decode_finish(dec_ctx)) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto decode_error;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((enc_status = ndmp_door_encode_finish(enc_ctx, &used)) != 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar goto encode_error;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) door_return(buf, used, NULL, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdardecode_error:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_ERROR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, dec_status);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_door_encode_finish(enc_ctx, &used);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) door_return(buf, used, NULL, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarencode_error:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar enc_ctx = ndmp_door_encode_start(buf, buflen);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_int32(enc_ctx, NDMP_DOOR_SRV_ERROR);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmp_door_put_uint32(enc_ctx, enc_status);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) ndmp_door_encode_finish(enc_ctx, &used);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) door_return(buf, used, NULL, 0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}