a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER START
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The contents of this file are subject to the terms of the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Common Development and Distribution License (the "License").
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You may not use this file except in compliance with the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * or http://www.opensolaris.org/os/licensing.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * See the License for the specific language governing permissions
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * and limitations under the License.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * When distributing Covered Code, include this CDDL HEADER in each
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If applicable, add the following below this CDDL HEADER, with the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * fields enclosed by brackets "[]" replaced with your own identifying
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * information: Portions Copyright [yyyy] [name of copyright owner]
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * CDDL HEADER END
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
59927d313a821b7f3822314ed16fc0a44c128431Yuri Pankov
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
59927d313a821b7f3822314ed16fc0a44c128431Yuri Pankov * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/time.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#if defined(_KERNEL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/ddi.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/types.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/sunddi.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/socket.h>
59927d313a821b7f3822314ed16fc0a44c128431Yuri Pankov#include <inet/ip.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <inet/tcp.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <stdio.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <strings.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <stdlib.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <errno.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/types.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/socket.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <netinet/in.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <arpa/inet.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/iscsit/iscsit_common.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/iscsi_protocol.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#include <sys/iscsit/isns_protocol.h>
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_zalloc(size_t size)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#if defined(_KERNEL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (kmem_zalloc(size, KM_SLEEP));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (calloc(1, size));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapiscsit_free(void *buf, size_t size) /* ARGSUSED */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#if defined(_KERNEL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap kmem_free(buf, size);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap free(buf);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * default_port should be the port to be used, if not specified
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * as part of the supplied string 'arg'.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define NI_MAXHOST 1025
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#define NI_MAXSERV 32
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapstruct sockaddr_storage *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_common_convert_sa(char *arg, struct sockaddr_storage *buf,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t default_port)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* Why does addrbuf need to be this big!??! XXX */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char addrbuf[NI_MAXHOST + NI_MAXSERV + 1];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *addr_str;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *port_str;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#ifndef _KERNEL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *errchr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap long tmp_port = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa_family_t af;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in *sin;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in6 *sin6;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_storage *sa = buf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!arg || !buf) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bzero(buf, sizeof (struct sockaddr_storage));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* don't modify the passed-in string */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(addrbuf, arg, sizeof (addrbuf));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_str = addrbuf;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*addr_str == '[') {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * An IPv6 address must be inside square brackets
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port_str = strchr(addr_str, ']');
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!port_str) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* No closing bracket */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* strip off the square brackets so we can convert */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap addr_str++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *port_str = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port_str++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*port_str == ':') {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* TCP port to follow */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port_str++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (*port_str == '\0') {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* No port specified */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port_str = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* malformed */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap af = AF_INET6;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port_str = strchr(addr_str, ':');
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (port_str) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *port_str = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port_str++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap af = AF_INET;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (port_str) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#if defined(_KERNEL)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ddi_strtol(port_str, NULL, 10, &tmp_port) != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#else
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_port = strtol(port_str, &errchr, 10);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tmp_port < 0 || tmp_port > 65535) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp_port = default_port;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sa->ss_family = af;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin = (struct sockaddr_in *)sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (af == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (inet_pton(af, addr_str,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void *)&(sin->sin_addr.s_addr)) != 1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin->sin_port = htons(tmp_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin6 = (struct sockaddr_in6 *)sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (inet_pton(af, addr_str,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void *)&(sin6->sin6_addr.s6_addr)) != 1) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin6->sin6_port = htons(tmp_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* successful */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (sa);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/* Functions to convert iSCSI target structures to/from nvlists. */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#ifndef _KERNEL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_config_to_nv(it_config_t *cfg, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *nv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *lnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&nv, NV_UNIQUE_NAME_TYPE, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* if there's no config, store an empty list */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = nv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_uint32(nv, "cfgVersion", cfg->config_version);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_tgtlist_to_nv(cfg->config_tgt_list, &lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == 0) && (lnv != NULL)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(nv, "targetList", lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_tpglist_to_nv(cfg->config_tpg_list, &lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == 0) && (lnv != NULL)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(nv, "tpgList", lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_inilist_to_nv(cfg->config_ini_list, &lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == 0) && (lnv != NULL)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(nv, "iniList", lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(lnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap lnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(nv, "globalProperties",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg->config_global_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = nv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(nv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif /* !_KERNEL */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * nvlist version of config is 3 list-of-list, + 1 proplist. arrays
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * are interesting, but lists-of-lists are more useful when doing
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * individual lookups when we later add support for it. Also, no
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * need to store name in individual struct representation.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_config(nvlist_t *nvl, it_config_t **cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t intval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *listval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_config_t *tmpcfg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* initialize output */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *cfg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmpcfg = iscsit_zalloc(sizeof (it_config_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tmpcfg == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to decode, but return the empty cfg struct */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&tmpcfg->config_global_properties,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(tmpcfg, sizeof (it_config_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *cfg = tmpcfg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_uint32(nvl, "cfgVersion", &intval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(tmpcfg, sizeof (it_config_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmpcfg->config_version = intval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "targetList", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* decode list of it_tgt_t */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_tgtlist(listval, &(tmpcfg->config_tgt_count),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(tmpcfg->config_tgt_list));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "tpgList", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* decode list of it_tpg_t */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_tpglist(listval, &(tmpcfg->config_tpg_count),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(tmpcfg->config_tpg_list));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "iniList", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* decode list of initiators */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_inilist(listval, &(tmpcfg->config_ini_count),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(tmpcfg->config_ini_list));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "globalProperties", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * don't depend on the original nvlist staying in-scope,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * duplicate the nvlist
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_dup(listval, &(tmpcfg->config_global_properties),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * No global properties defined, make an empty list
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&tmpcfg->config_global_properties,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char **isnsArray = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t numisns = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * decode the list of iSNS server information to make
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * references from the kernel simpler.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tmpcfg->config_global_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_string_array(
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmpcfg->config_global_properties,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap PROP_ISNS_SERVER,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &isnsArray, &numisns);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_array_to_portallist(isnsArray,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap numisns, ISNS_DEFAULT_SERVER_PORT,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &tmpcfg->config_isns_svr_list,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &tmpcfg->config_isns_svr_count);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* It's OK if we don't have any iSNS servers */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *cfg = tmpcfg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_config_free_cmn(tmpcfg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_lookup(it_config_t *cfg, char *tgt_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *cfg_tgt = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_tgt = cfg->config_tgt_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tgt != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tgt = cfg_tgt->tgt_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strncmp(cfg_tgt->tgt_name, tgt_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MAX_ISCSI_NODENAMELEN) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (cfg_tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_tgtlist(nvlist_t *nvl, uint32_t *count, it_tgt_t **tgtlist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *nvt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tgtlist || !count) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tgtlist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *count = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvpair_value_nvlist(nvp, &nvt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* invalid entry? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_tgt(nvt, name, &tgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (*count)++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*tgtlist == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tgtlist = tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->tgt_next = tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_free_cmn(*tgtlist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tgtlist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgtlist_to_nv(it_tgt_t *tgtlist, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *tgtp = tgtlist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *pnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *tnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tgtlist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* create the target list if required */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*nvl == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&pnv, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = pnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tgtp) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_tgt_to_nv(tgtp, &tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, tgtp->tgt_name, tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgtp = tgtp->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (pnv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(pnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_to_nv(it_tgt_t *tgt, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *tnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(nvl, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgt->tgt_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, "properties",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_uint64(*nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgt->tgt_generation);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_tpgtlist_to_nv(tgt->tgt_tpgt_list, &tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == 0) && tnv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, "tpgtList", tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(*nvl);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_tgt(nvlist_t *nvl, char *name, it_tgt_t **tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *ttgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *listval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t intval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl || !tgt || !name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tgt = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ttgt = iscsit_zalloc(sizeof (it_tgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ttgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ttgt->tgt_name, name, sizeof (ttgt->tgt_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "properties", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* duplicate list so it does not go out of context */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_dup(listval, &(ttgt->tgt_properties), 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_uint64(nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(ttgt->tgt_generation));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "tpgtList", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_tpgtlist(listval, &intval,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(ttgt->tgt_tpgt_list));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ttgt->tgt_tpgt_count = intval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tgt = ttgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_free_cmn(ttgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpgt_to_nv(it_tpgt_t *tpgt, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(nvl, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_uint16(*nvl, "tag", tpgt->tpgt_tag);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_uint64(*nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgt->tpgt_generation);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(*nvl);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_tpgt(nvlist_t *nvl, char *name, it_tpgt_t **tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpgt || !name) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpgt = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = iscsit_zalloc(sizeof (it_tpgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ptr->tpgt_tpg_name, name, sizeof (ptr->tpgt_tpg_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_uint16(nvl, "tag", &(ptr->tpgt_tag));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_uint64(nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(ptr->tpgt_generation));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpgt = ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(ptr, sizeof (it_tpgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpgtlist_to_nv(it_tpgt_t *tpgtlist, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *pnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *tnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *ptr = tpgtlist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpgtlist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* create the target list if required */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*nvl == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&pnv, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = pnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_tpgt_to_nv(ptr, &tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, ptr->tpgt_tpg_name, tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (pnv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(pnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_tpgtlist(nvlist_t *nvl, uint32_t *count, it_tpgt_t **tpgtlist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *nvt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpgtlist || !count) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpgtlist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *count = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvpair_value_nvlist(nvp, &nvt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* invalid entry? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_tpgt(nvt, name, &tpgt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (*count)++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*tpgtlist == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpgtlist = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->tpgt_next = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_free_cmn(*tpgtlist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpgtlist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#ifndef _KERNEL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_to_nv(it_tpg_t *tpg, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char **portalArray = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *ptr;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(nvl, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_uint64(*nvl, "generation", tpg->tpg_generation);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == 0) && tpg->tpg_portal_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* add the portals */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portalArray = iscsit_zalloc(tpg->tpg_portal_count *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portalArray == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(*nvl);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap i = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = tpg->tpg_portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr && (i < tpg->tpg_portal_count)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = sockaddr_to_str(&(ptr->portal_addr),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(portalArray[i]));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill ptr = ptr->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap i++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((ret == 0) && portalArray) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_string_array(*nvl, "portalList",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portalArray, i);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portalArray) {
4f1fc35da1d29699488fd1c9472dbeb042b2b9d0srivijitha dugganapalli while (--i >= 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (portalArray[i]) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(portalArray[i],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap strlen(portalArray[i] + 1));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(portalArray,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpg->tpg_portal_count * sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(*nvl);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif /* !_KERNEL */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_tpg(nvlist_t *nvl, char *name, it_tpg_t **tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *ptpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char **portalArray = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint32_t count = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!name || !tpg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptpg = iscsit_zalloc(sizeof (it_tpg_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ptpg == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(ptpg->tpg_name, name, sizeof (ptpg->tpg_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_uint64(nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(ptpg->tpg_generation));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_string_array(nvl, "portalList",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &portalArray, &count);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* set the portals */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_array_to_portallist(portalArray, count,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ISCSI_LISTEN_PORT, &ptpg->tpg_portal_list,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &ptpg->tpg_portal_count);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpg = ptpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_free_cmn(ptpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#ifndef _KERNEL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpglist_to_nv(it_tpg_t *tpglist, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *pnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *tnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *ptr = tpglist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpglist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* create the target portal group list if required */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*nvl == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&pnv, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = pnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_tpg_to_nv(ptr, &tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, ptr->tpg_name, tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (pnv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(pnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif /* !_KERNEL */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_lookup(it_config_t *cfg, char *tpg_name)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *cfg_tpg = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_tpg = cfg->config_tpg_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tpg != NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_tpg = cfg_tpg->tpg_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (strncmp(&cfg_tpg->tpg_name[0], tpg_name,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap MAX_TPG_NAMELEN) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (cfg_tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_sa_compare(struct sockaddr_storage *sa1, struct sockaddr_storage *sa2)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in *sin1, *sin2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in6 *sin6_1, *sin6_2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * XXX - should we check here for IPv4 addrs mapped to v6?
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * see also iscsit_is_v4_mapped in iscsit_login.c
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (sa1->ss_family != sa2->ss_family) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * sockaddr_in has padding which may not be initialized.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * be more specific in the comparison, and don't trust the
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * caller has fully initialized the structure.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (sa1->ss_family == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin1 = (struct sockaddr_in *)sa1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin2 = (struct sockaddr_in *)sa2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if ((bcmp(&sin1->sin_addr, &sin2->sin_addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sizeof (struct in_addr)) == 0) &&
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (sin1->sin_port == sin2->sin_port)) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (sa1->ss_family == AF_INET6) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin6_1 = (struct sockaddr_in6 *)sa1;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin6_2 = (struct sockaddr_in6 *)sa2;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (bcmp(sin6_1, sin6_2, sizeof (struct sockaddr_in6)) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (1);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_portal_lookup(it_tpg_t *tpg, struct sockaddr_storage *sa)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *cfg_portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_portal = tpg->tpg_portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_portal != NULL;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill cfg_portal = cfg_portal->portal_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_sa_compare(sa, &cfg_portal->portal_addr) == 0)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (cfg_portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_portal_t *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_sns_svr_lookup(it_config_t *cfg, struct sockaddr_storage *sa)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *cfg_portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (cfg_portal = cfg->config_isns_svr_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap cfg_portal != NULL;
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill cfg_portal = cfg_portal->portal_next) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_sa_compare(sa, &cfg_portal->portal_addr) == 0)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (cfg_portal);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (NULL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_tpglist(nvlist_t *nvl, uint32_t *count, it_tpg_t **tpglist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *nvt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpglist || !count) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpglist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *count = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvpair_value_nvlist(nvp, &nvt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* invalid entry? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_tpg(nvt, name, &tpg);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (*count)++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*tpglist == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpglist = tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->tpg_next = tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_free_cmn(*tpglist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *tpglist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_ini_to_nv(it_ini_t *ini, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ini) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(nvl, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ini->ini_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, "properties",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini->ini_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_uint64(*nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ini->ini_generation);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(*nvl);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_ini(nvlist_t *nvl, char *name, it_ini_t **ini)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *inip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *listval;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!name || !ini) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ini = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap inip = iscsit_zalloc(sizeof (it_ini_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!inip) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcpy(inip->ini_name, name, sizeof (inip->ini_name));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_nvlist(nvl, "properties", &listval);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_dup(listval, &(inip->ini_properties), 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (ret == ENOENT) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_lookup_uint64(nvl, "generation",
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(inip->ini_generation));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *ini = inip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_free_cmn(inip);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_inilist_to_nv(it_ini_t *inilist, nvlist_t **nvl)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *pnv = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *tnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *ptr = inilist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!inilist) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* create the target list if required */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*nvl == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_alloc(&pnv, NV_UNIQUE_NAME, 0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = pnv;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (ptr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_ini_to_nv(ptr, &tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvlist_add_nvlist(*nvl, ptr->ini_name, tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ptr = ptr->ini_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (pnv) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(pnv);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *nvl = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_nv_to_inilist(nvlist_t *nvl, uint32_t *count, it_ini_t **inilist)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *inip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvpair_t *nvp = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_t *nvt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char *name;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!inilist || !count) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *inilist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *count = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!nvl) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* nothing to do */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap name = nvpair_name(nvp);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = nvpair_value_nvlist(nvp, &nvt);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* invalid entry? */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = it_nv_to_ini(nvt, name, &inip);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (*count)++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*inilist == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *inilist = inip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev->ini_next = inip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = inip;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (ret != 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_free_cmn(*inilist);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *inilist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Convert a sockaddr to the string representation, suitable for
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * storing in an nvlist or printing out in a list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#ifndef _KERNEL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapsockaddr_to_str(struct sockaddr_storage *sa, char **addr)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char buf[INET6_ADDRSTRLEN + 7]; /* addr : port */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap char pbuf[7];
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap const char *bufp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in *sin;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap struct sockaddr_in6 *sin6;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap uint16_t port;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!sa || !addr) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap buf[0] = '\0';
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (sa->ss_family == AF_INET) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin = (struct sockaddr_in *)sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bufp = inet_ntop(AF_INET,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (const void *)&(sin->sin_addr.s_addr),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap buf, sizeof (buf));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (bufp == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = errno;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port = ntohs(sin->sin_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else if (sa->ss_family == AF_INET6) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcat(buf, "[", sizeof (buf));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap sin6 = (struct sockaddr_in6 *)sa;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap bufp = inet_ntop(AF_INET6,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (const void *)&sin6->sin6_addr.s6_addr,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &buf[1], (sizeof (buf) - 1));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (bufp == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = errno;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcat(buf, "]", sizeof (buf));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap port = ntohs(sin6->sin6_port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) snprintf(pbuf, sizeof (pbuf), ":%u", port);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (void) strlcat(buf, pbuf, sizeof (buf));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *addr = strdup(buf);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*addr == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ENOMEM);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (0);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap#endif /* !_KERNEL */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapint
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_array_to_portallist(char **arr, uint32_t count, uint32_t default_port,
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t **portallist, uint32_t *list_count)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int ret = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap int i;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *prev = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *tmp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!arr || !portallist || !list_count) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (EINVAL);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *list_count = 0;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *portallist = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap for (i = 0; i < count; i++) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!arr[i]) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* should never happen */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = iscsit_zalloc(sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = ENOMEM;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_common_convert_sa(arr[i],
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(portal->portal_addr), default_port) == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(portal, sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap ret = EINVAL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /* make sure no duplicates */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tmp = *portallist;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tmp) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (it_sa_compare(&(tmp->portal_addr),
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap &(portal->portal_addr)) == 0) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(portal, sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portal = NULL;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap break;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill tmp = tmp->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!portal) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap continue;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap /*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * The first time through the loop, *portallist == NULL
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * because we assigned it to NULL above. Subsequently
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * prev will have been set. Therefor it's OK to put
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill * lint override before prev->portal_next assignment.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (*portallist == NULL) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *portallist = portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap } else {
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill prev->portal_next = portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap prev = portal;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap (*list_count)++;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return (ret);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_config_free_cmn()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Free any resources associated with the it_config_t structure.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Parameters:
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * cfg A C representation of the current iSCSI configuration
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_config_free_cmn(it_config_t *cfg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!cfg) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfg->config_tgt_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_free_cmn(cfg->config_tgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfg->config_tpg_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_free_cmn(cfg->config_tpg_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfg->config_ini_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_free_cmn(cfg->config_ini_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfg->config_global_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(cfg->config_global_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (cfg->config_isns_svr_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *pp = cfg->config_isns_svr_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *pp_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (pp) {
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill pp_next = pp->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(pp, sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap pp = pp_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(cfg, sizeof (it_config_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tgt_free_cmn()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Frees an it_tgt_t structure. If tgt_next is not NULL, frees
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * all structures in the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tgt_free_cmn(it_tgt_t *tgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *tgtp = tgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tgt_t *next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tgtp) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next = tgtp->tgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgtp->tgt_tpgt_list) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_free_cmn(tgtp->tgt_tpgt_list);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (tgtp->tgt_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(tgtp->tgt_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(tgtp, sizeof (it_tgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tgtp = next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpgt_free_cmn()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Deallocates resources of an it_tpgt_t structure. If tpgt->next
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * is not NULL, frees all members of the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpgt_free_cmn(it_tpgt_t *tpgt)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *tpgtp = tpgt;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpgt_t *next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!tpgt) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tpgtp) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next = tpgtp->tpgt_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(tpgtp, sizeof (it_tpgt_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgtp = next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_tpg_free_cmn()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Deallocates resources associated with an it_tpg_t structure.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * If tpg->next is not NULL, frees all members of the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_tpg_free_cmn(it_tpg_t *tpg)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *tpgp = tpg;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_tpg_t *next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *portalp;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_portal_t *pnext;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (tpgp) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next = tpgp->tpg_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portalp = tpgp->tpg_portal_list;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (portalp) {
42bf653b44c42fc6b637ae50e590489d69399241Peter Gill pnext = portalp->portal_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(portalp, sizeof (it_portal_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap portalp = pnext;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(tpgp, sizeof (it_tpg_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap tpgp = next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap/*
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Function: it_ini_free_cmn()
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap *
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * Deallocates resources of an it_ini_t structure. If ini->next is
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap * not NULL, frees all members of the list.
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap */
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapvoid
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlapit_ini_free_cmn(it_ini_t *ini)
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap{
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *inip = ini;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap it_ini_t *next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (!ini) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap return;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap while (inip) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap next = inip->ini_next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap if (inip->ini_properties) {
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap nvlist_free(inip->ini_properties);
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap iscsit_free(inip, sizeof (it_ini_t));
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap inip = next;
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap }
a6d42e7d71324c5193c3b94d57d96ba2925d52e1Peter Dunlap}