Blame usr/idbm.c

Packit Service 646995
/*
Packit Service 646995
 * iSCSI Discovery Database Library
Packit Service 646995
 *
Packit Service 646995
 * Copyright (C) 2004 Dmitry Yusupov, Alex Aizman
Packit Service 646995
 * Copyright (C) 2006 Mike Christie
Packit Service 646995
 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
Packit Service 646995
 * maintained by open-iscsi@@googlegroups.com
Packit Service 646995
 *
Packit Service 646995
 * This program is free software; you can redistribute it and/or modify
Packit Service 646995
 * it under the terms of the GNU General Public License as published
Packit Service 646995
 * by the Free Software Foundation; either version 2 of the License, or
Packit Service 646995
 * (at your option) any later version.
Packit Service 646995
 *
Packit Service 646995
 * This program is distributed in the hope that it will be useful, but
Packit Service 646995
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 646995
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit Service 646995
 * General Public License for more details.
Packit Service 646995
 *
Packit Service 646995
 * See the file COPYING included with this distribution for more details.
Packit Service 646995
 */
Packit Service 646995
Packit Service 646995
#include <stdio.h>
Packit Service 646995
#include <ctype.h>
Packit Service 646995
#include <unistd.h>
Packit Service 646995
#include <stdlib.h>
Packit Service 646995
#include <string.h>
Packit Service 646995
#include <errno.h>
Packit Service 646995
#include <dirent.h>
Packit Service 646995
#include <limits.h>
Packit Service 646995
#include <fcntl.h>
Packit Service d1f683
#include <glob.h>
Packit Service 646995
#include <sys/stat.h>
Packit Service 646995
#include <sys/file.h>
Packit Service 646995
#include <inttypes.h>
Packit Service 646995
Packit Service 646995
#include "idbm.h"
Packit Service 646995
#include "idbm_fields.h"
Packit Service 646995
#include "log.h"
Packit Service 646995
#include "iscsi_util.h"
Packit Service 646995
#include "iscsi_settings.h"
Packit Service 646995
#include "transport.h"
Packit Service 646995
#include "iscsi_sysfs.h"
Packit Service 646995
#include "iface.h"
Packit Service 646995
#include "sysdeps.h"
Packit Service 646995
#include "fw_context.h"
Packit Service 646995
#include "iscsi_err.h"
Packit Service 646995
Packit Service 646995
#define IDBM_HIDE	0    /* Hide parameter when print. */
Packit Service 646995
#define IDBM_SHOW	1    /* Show parameter when print. */
Packit Service 646995
#define IDBM_MASKED	2    /* Show "stars" instead of real value when print */
Packit Service 646995
Packit Service 646995
static struct idbm *db;
Packit Service 646995
Packit Service 646995
#define ARRAY_LEN(x) ( sizeof(x) / sizeof((x)[0]) )
Packit Service 646995
Packit Service 646995
#define __recinfo_str(_key, _info, _rec, _name, _show, _n, _mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_STR; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	if (strlen((char*)_rec->_name)) \
Packit Service 646995
		strlcpy((char*)_info[_n].value, (char*)_rec->_name, \
Packit Service 646995
			VALUE_MAXVAL); \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int(_key, _info, _rec, _name, _show, _n, _mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_INT; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIi32, _rec->_name); \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_uint8(_key, _info, _rec, _name, _show, _n, _mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_UINT8; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu8, _rec->_name); \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while (0)
Packit Service 646995
Packit Service 646995
#define __recinfo_uint16(_key, _info, _rec, _name, _show, _n, _mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_UINT16; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu16, _rec->_name); \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while (0)
Packit Service 646995
Packit Service 646995
#define __recinfo_uint32(_key, _info, _rec, _name, _show, _n, _mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_UINT32; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu32, _rec->_name); \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while (0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int_o2(_key,_info,_rec,_name,_show,_op0,_op1,_n, _mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_INT_O; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	if (_rec->_name == 0) strlcpy(_info[_n].value, _op0, VALUE_MAXVAL); \
Packit Service 646995
	if (_rec->_name == 1) strlcpy(_info[_n].value, _op1, VALUE_MAXVAL); \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].opts[0] = _op0; \
Packit Service 646995
	_info[_n].opts[1] = _op1; \
Packit Service 646995
	_info[_n].numopts = 2; \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int_o3(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_n,	\
Packit Service 646995
			 _mod) do { \
Packit Service 646995
	__recinfo_int_o2(_key,_info,_rec,_name,_show,_op0,_op1,_n, _mod); \
Packit Service 646995
	_n--; \
Packit Service 646995
	if (_rec->_name == 2) strlcpy(_info[_n].value, _op2, VALUE_MAXVAL);\
Packit Service 646995
	_info[_n].opts[2] = _op2; \
Packit Service 646995
	_info[_n].numopts = 3; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int_o4(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3,_n, \
Packit Service 646995
			 _mod) do { \
Packit Service 646995
	__recinfo_int_o3(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_n, _mod); \
Packit Service 646995
	_n--; \
Packit Service 646995
	if (_rec->_name == 3) strlcpy(_info[_n].value, _op3, VALUE_MAXVAL); \
Packit Service 646995
	_info[_n].opts[3] = _op3; \
Packit Service 646995
	_info[_n].numopts = 4; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int_o5(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3, \
Packit Service 646995
			 _op4,_n, _mod) do { \
Packit Service 646995
	__recinfo_int_o4(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3, \
Packit Service 646995
			  _n,_mod); \
Packit Service 646995
	_n--; \
Packit Service 646995
	if (_rec->_name == 4) strlcpy(_info[_n].value, _op4, VALUE_MAXVAL); \
Packit Service 646995
	_info[_n].opts[4] = _op4; \
Packit Service 646995
	_info[_n].numopts = 5; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int_o6(_key,_info,_rec,_name,_show,_op0,_op1,_op2, \
Packit Service 646995
			 _op3,_op4,_op5,_n,_mod) do { \
Packit Service 646995
	__recinfo_int_o5(_key,_info,_rec,_name,_show,_op0,_op1,_op2,_op3, \
Packit Service 646995
			 _op4,_n,_mod); \
Packit Service 646995
	_n--; \
Packit Service 646995
	if (_rec->_name == 5) strlcpy(_info[_n].value, _op5, VALUE_MAXVAL); \
Packit Service 646995
	_info[_n].opts[5] = _op5; \
Packit Service 646995
	_info[_n].numopts = 6; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while(0)
Packit Service 646995
Packit Service 646995
#define __recinfo_int_list(_key,_info,_rec,_name,_show,_tbl,_n,_mod) do { \
Packit Service 646995
	_info[_n].type = TYPE_INT_LIST; \
Packit Service 646995
	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
Packit Service 646995
	_info[_n].value[0] = '\0'; \
Packit Service 646995
	for (unsigned long _i = 0; _i < ARRAY_LEN(_rec->_name); _i++) {	\
Packit Service 646995
		if (_rec->_name[_i] != (unsigned)~0) {			\
Packit Service 646995
			for (unsigned long _j = 0; _j < ARRAY_LEN(_tbl); _j++) {	\
Packit Service 646995
				if (_tbl[_j].value == (int)_rec->_name[_i]) { \
Packit Service 646995
					strcat(_info[_n].value, _tbl[_j].name); \
Packit Service 646995
					strcat(_info[_n].value, ","); \
Packit Service 646995
					break; \
Packit Service 646995
				} \
Packit Service 646995
			} \
Packit Service 646995
		} \
Packit Service 646995
	} \
Packit Service 646995
	/* delete trailing ',' */ \
Packit Service 646995
	if (strrchr(_info[_n].value, ',')) \
Packit Service 646995
		*strrchr(_info[_n].value, ',') = '\0'; \
Packit Service 646995
	_info[_n].data = &_rec->_name; \
Packit Service 646995
	_info[_n].data_len = sizeof(_rec->_name); \
Packit Service 646995
	_info[_n].visible = _show; \
Packit Service 646995
	_info[_n].opts[0] = (void *)&_tbl; \
Packit Service 646995
	_info[_n].numopts = ARRAY_LEN(_tbl); \
Packit Service 646995
	_info[_n].can_modify = _mod; \
Packit Service 646995
	_n++; \
Packit Service 646995
} while (0)
Packit Service 646995
Packit Service 646995
static struct int_list_tbl {
Packit Service 646995
	const char *name;
Packit Service 646995
	int value;
Packit Service 646995
} chap_algs [] = {
Packit Service 646995
	{ "MD5", AUTH_CHAP_ALG_MD5 },
Packit Service 646995
	{ "SHA1", AUTH_CHAP_ALG_SHA1 },
Packit Service 646995
	{ "SHA256", AUTH_CHAP_ALG_SHA256 },
Packit Service 646995
	{ "SHA3-256", AUTH_CHAP_ALG_SHA3_256 },
Packit Service 646995
};
Packit Service 646995
Packit Service d1f683
static int idbm_remove_disc_to_node_link(node_rec_t *rec, char *portal);
Packit Service d1f683
Packit Service 646995
static void
Packit Service 646995
idbm_recinfo_discovery(discovery_rec_t *r, recinfo_t *ri)
Packit Service 646995
{
Packit Service 646995
	int num = 0;
Packit Service 646995
Packit Service 646995
	__recinfo_int_o2(DISC_STARTUP, ri, r, startup, IDBM_SHOW,
Packit Service 646995
			"manual", "automatic", num, 1);
Packit Service 646995
	__recinfo_int_o6(DISC_TYPE, ri, r, type, IDBM_SHOW,
Packit Service 646995
			"sendtargets", "isns", "offload_send_targets", "slp",
Packit Service 646995
			"static", "fw", num, 0);
Packit Service 646995
	switch (r->type) {
Packit Service 646995
	case DISCOVERY_TYPE_SENDTARGETS:
Packit Service 646995
		__recinfo_str(DISC_ST_ADDR, ri, r,
Packit Service 646995
			address, IDBM_SHOW, num, 0);
Packit Service 646995
		__recinfo_int(DISC_ST_PORT, ri, r,
Packit Service 646995
			port, IDBM_SHOW, num, 0);
Packit Service 646995
		__recinfo_int_o2(DISC_ST_AUTH_METHOD, ri, r,
Packit Service 646995
			u.sendtargets.auth.authmethod,
Packit Service 646995
			IDBM_SHOW, "None", "CHAP", num, 1);
Packit Service 646995
		__recinfo_str(DISC_ST_USERNAME, ri, r,
Packit Service 646995
			u.sendtargets.auth.username, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(DISC_ST_PASSWORD, ri, r,
Packit Service 646995
			u.sendtargets.auth.password, IDBM_MASKED, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_PASSWORD_LEN, ri, r,
Packit Service 646995
			u.sendtargets.auth.password_length, IDBM_HIDE, num, 1);
Packit Service 646995
		__recinfo_str(DISC_ST_USERNAME_IN, ri, r,
Packit Service 646995
			u.sendtargets.auth.username_in, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(DISC_ST_PASSWORD_IN, ri, r,
Packit Service 646995
			u.sendtargets.auth.password_in, IDBM_MASKED, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_PASSWORD_IN_LEN, ri, r,
Packit Service 646995
			u.sendtargets.auth.password_in_length, IDBM_HIDE,
Packit Service 646995
			num, 1);
Packit Service 646995
		/* reusing SESSION_CHAP_ALGS */
Packit Service 646995
		__recinfo_int_list(SESSION_CHAP_ALGS, ri, r,
Packit Service 646995
				   u.sendtargets.auth.chap_algs,
Packit Service 646995
				   IDBM_SHOW, chap_algs, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_LOGIN_TMO, ri, r,
Packit Service 646995
			u.sendtargets.conn_timeo.login_timeout,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_int_o2(DISC_ST_USE_DISC_DAEMON, ri, r,
Packit Service 646995
			u.sendtargets.use_discoveryd,
Packit Service 646995
			IDBM_SHOW, "No", "Yes", num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_DISC_DAEMON_POLL_INVAL, ri, r,
Packit Service 646995
			u.sendtargets.discoveryd_poll_inval,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_REOPEN_MAX, ri, r,
Packit Service 646995
			u.sendtargets.reopen_max,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_AUTH_TMO, ri, r,
Packit Service 646995
			u.sendtargets.conn_timeo.auth_timeout,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_ACTIVE_TMO, ri, r,
Packit Service 646995
			      u.sendtargets.conn_timeo.active_timeout,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_int(DISC_ST_MAX_RECV_DLEN, ri, r,
Packit Service 646995
			      u.sendtargets.conn_conf.MaxRecvDataSegmentLength,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_ISNS:
Packit Service 646995
		__recinfo_str(DISC_ISNS_ADDR, ri, r,
Packit Service 646995
			address, IDBM_SHOW, num, 0);
Packit Service 646995
		__recinfo_int(DISC_ISNS_PORT, ri, r,
Packit Service 646995
			port, IDBM_SHOW, num, 0);
Packit Service 646995
		__recinfo_int_o2(DISC_ISNS_USE_DISC_DAEMON, ri, r,
Packit Service 646995
			u.isns.use_discoveryd,
Packit Service 646995
			IDBM_SHOW, "No", "Yes", num, 1);
Packit Service 646995
		__recinfo_int(DISC_ISNS_DISC_DAEMON_POLL_INVAL, ri, r,
Packit Service 646995
			u.isns.discoveryd_poll_inval,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
		break;
Packit Service 646995
	default:
Packit Service 646995
		break;
Packit Service 646995
	}
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void
Packit Service 646995
idbm_recinfo_node(node_rec_t *r, recinfo_t *ri)
Packit Service 646995
{
Packit Service 646995
	int num = 0, i;
Packit Service 646995
	int iface_type;
Packit Service 646995
Packit Service 646995
	iface_type = iface_get_iptype(&r->iface);
Packit Service 646995
Packit Service 646995
	__recinfo_str(NODE_NAME, ri, r, name, IDBM_SHOW, num, 0);
Packit Service 646995
	__recinfo_int(NODE_TPGT, ri, r, tpgt, IDBM_SHOW, num, 0);
Packit Service 646995
	__recinfo_int_o3(NODE_STARTUP, ri, r, startup,
Packit Service 646995
			IDBM_SHOW, "manual", "automatic", "onboot", num, 1);
Packit Service 646995
	__recinfo_int_o2(NODE_LEADING_LOGIN, ri, r, leading_login, IDBM_SHOW,
Packit Service 646995
			 "No", "Yes", num, 1);
Packit Service 646995
	/*
Packit Service 646995
	 * Note: because we do not add the iface.iscsi_ifacename to
Packit Service 646995
	 * sysfs iscsiadm does some weird matching. We can change the iface
Packit Service 646995
	 * values if a session is not running, but node record ifaces values
Packit Service 646995
	 * have to be changed and so do the iface record ones.
Packit Service 646995
	 *
Packit Service 646995
	 * Users should nornmally not want to change the iface ones
Packit Service 646995
	 * in the node record directly and instead do it through
Packit Service 646995
	 * the iface mode which will do the right thing (although that
Packit Service 646995
	 * needs some locking).
Packit Service 646995
	 */
Packit Service 646995
	__recinfo_str(IFACE_HWADDR, ri, r, iface.hwaddress, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_IPADDR, ri, r, iface.ipaddress, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_ISCSINAME, ri, r, iface.name, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_NETNAME, ri, r, iface.netdev, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_GATEWAY, ri, r, iface.gateway, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_SUBNET_MASK, ri, r, iface.subnet_mask, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_PREFIX_LEN, ri, r, iface.prefix_len,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	/*
Packit Service 646995
	 * svn 780 compat: older versions used node.transport_name and
Packit Service 646995
	 * rec->transport_name
Packit Service 646995
	 */
Packit Service 646995
	__recinfo_str(IFACE_TRANSPORTNAME, ri, r, iface.transport_name,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_INAME, ri, r, iface.iname, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_STATE, ri, r, iface.state, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_VLAN_ID, ri, r, iface.vlan_id, IDBM_SHOW, num,
Packit Service 646995
			 1);
Packit Service 646995
	__recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, iface.vlan_priority,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_VLAN_STATE, ri, r, iface.vlan_state, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_int(IFACE_NUM, ri, r, iface.iface_num, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_MTU, ri, r, iface.mtu, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_PORT, ri, r, iface.port, IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
	if (iface_type == ISCSI_IFACE_TYPE_IPV4) {
Packit Service 646995
		__recinfo_str(IFACE_BOOT_PROTO, ri, r, iface.bootproto,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_ALT_CID, ri, r,
Packit Service 646995
			      iface.dhcp_alt_client_id_state, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r,
Packit Service 646995
			      iface.dhcp_alt_client_id, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_DNS, ri, r, iface.dhcp_dns, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r,
Packit Service 646995
			      iface.dhcp_learn_iqn, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_REQ_VID, ri, r,
Packit Service 646995
			      iface.dhcp_req_vendor_id_state, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_VID, ri, r, iface.dhcp_vendor_id_state,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_VID_STR, ri, r, iface.dhcp_vendor_id,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_SLP_DA, ri, r, iface.dhcp_slp_da,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_FRAGMENTATION, ri, r, iface.fragmentation,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_GRAT_ARP, ri, r, iface.gratuitous_arp,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_IN_FORWARD, ri, r,
Packit Service 646995
			      iface.incoming_forwarding, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_TOS_STATE, ri, r, iface.tos_state,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_TOS, ri, r, iface.tos, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_TTL, ri, r, iface.ttl, IDBM_SHOW, num, 1);
Packit Service 646995
	} else if (iface_type == ISCSI_IFACE_TYPE_IPV6) {
Packit Service 646995
		__recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, iface.ipv6_autocfg,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r,
Packit Service 646995
			      iface.linklocal_autocfg, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, iface.router_autocfg,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_LINKLOCAL, ri, r, iface.ipv6_linklocal,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_ROUTER, ri, r, iface.ipv6_router,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
Packit Service 646995
				iface.dup_addr_detect_cnt, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_FLOW_LABEL, ri, r, iface.flow_label,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
Packit Service 646995
			      iface.gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_HOP_LIMIT, ri, r, iface.hop_limit,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_MLD, ri, r, iface.mld, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r,
Packit Service 646995
				 iface.nd_reachable_tmo, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r,
Packit Service 646995
				 iface.nd_rexmit_time, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, iface.nd_stale_tmo,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
Packit Service 646995
				 iface.router_adv_link_mtu, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, iface.traffic_class,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	__recinfo_str(IFACE_DELAYED_ACK, ri, r, iface.delayed_ack, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TCP_NAGLE, ri, r, iface.nagle, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TCP_WSF_STATE, ri, r, iface.tcp_wsf_state,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_TCP_WSF, ri, r, iface.tcp_wsf, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, iface.tcp_timer_scale,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, iface.tcp_timestamp,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_REDIRECT, ri, r, iface.redirect, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, iface.def_task_mgmt_tmo,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_HDRDGST, ri, r, iface.header_digest, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DATADGST, ri, r, iface.data_digest, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_IMM_DATA, ri, r, iface.immediate_data, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_INITIAL_R2T, ri, r, iface.initial_r2t, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DSEQ_INORDER, ri, r, iface.data_seq_inorder,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DPDU_INORDER, ri, r, iface.data_pdu_inorder,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_ERL, ri, r, iface.erl, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, iface.max_recv_dlength,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint32(IFACE_FIRST_BURST, ri, r, iface.first_burst_len,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_MAX_R2T, ri, r, iface.max_out_r2t, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_uint32(IFACE_MAX_BURST, ri, r, iface.max_burst_len, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_str(IFACE_CHAP_AUTH, ri, r, iface.chap_auth, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_BIDI_CHAP, ri, r, iface.bidi_chap, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, iface.strict_login_comp,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, iface.discovery_auth,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, iface.discovery_logout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
Packit Service 646995
	__recinfo_str(NODE_DISC_ADDR, ri, r, disc_address, IDBM_SHOW,
Packit Service 646995
		      num, 0);
Packit Service 646995
	__recinfo_int(NODE_DISC_PORT, ri, r, disc_port, IDBM_SHOW,
Packit Service 646995
		      num, 0);
Packit Service 646995
	__recinfo_int_o6(NODE_DISC_TYPE, ri, r, disc_type, IDBM_SHOW,
Packit Service 646995
			 "send_targets", "isns", "offload_send_targets", "slp",
Packit Service 646995
			 "static", "fw", num, 0);
Packit Service 646995
	__recinfo_int(SESSION_INIT_CMDSN, ri, r,
Packit Service 646995
		      session.initial_cmdsn, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_INIT_LOGIN_RETRY, ri, r,
Packit Service 646995
		      session.initial_login_retry_max, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_XMIT_THREAD_PRIORITY, ri, r,
Packit Service 646995
		      session.xmit_thread_priority, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_CMDS_MAX, ri, r,
Packit Service 646995
		      session.cmds_max, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_QDEPTH, ri, r,
Packit Service 646995
		       session.queue_depth, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_NR_SESSIONS, ri, r,
Packit Service 646995
		       session.nr_sessions, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int_o2(SESSION_AUTH_METHOD, ri, r, session.auth.authmethod,
Packit Service 646995
			 IDBM_SHOW, "None", "CHAP", num, 1);
Packit Service 646995
	__recinfo_str(SESSION_USERNAME, ri, r,
Packit Service 646995
		      session.auth.username, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(SESSION_PASSWORD, ri, r,
Packit Service 646995
		      session.auth.password, IDBM_MASKED, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_PASSWORD_LEN, ri, r,
Packit Service 646995
		      session.auth.password_length, IDBM_HIDE, num, 1);
Packit Service 646995
	__recinfo_str(SESSION_USERNAME_IN, ri, r,
Packit Service 646995
		      session.auth.username_in, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(SESSION_PASSWORD_IN, ri, r,
Packit Service 646995
		      session.auth.password_in, IDBM_MASKED, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_PASSWORD_IN_LEN, ri, r,
Packit Service 646995
		      session.auth.password_in_length, IDBM_HIDE, num, 1);
Packit Service 646995
	__recinfo_int_list(SESSION_CHAP_ALGS, ri, r,
Packit Service 646995
			   session.auth.chap_algs, IDBM_SHOW, chap_algs, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_REPLACEMENT_TMO, ri, r,
Packit Service 646995
		      session.timeo.replacement_timeout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_ABORT_TMO, ri, r,
Packit Service 646995
		      session.err_timeo.abort_timeout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_LU_RESET_TMO, ri, r,
Packit Service 646995
		      session.err_timeo.lu_reset_timeout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_TGT_RESET_TMO, ri, r,
Packit Service 646995
		      session.err_timeo.tgt_reset_timeout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_HOST_RESET_TMO, ri, r,
Packit Service 646995
		      session.err_timeo.host_reset_timeout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int_o2(SESSION_FAST_ABORT, ri, r,
Packit Service 646995
			 session.iscsi.FastAbort, IDBM_SHOW, "No", "Yes",
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_int_o2(SESSION_INITIAL_R2T, ri, r,
Packit Service 646995
			session.iscsi.InitialR2T, IDBM_SHOW,
Packit Service 646995
			"No", "Yes", num, 1);
Packit Service 646995
	__recinfo_int_o2(SESSION_IMM_DATA, ri, r,
Packit Service 646995
			session.iscsi.ImmediateData,
Packit Service 646995
			IDBM_SHOW, "No", "Yes", num, 1);
Packit Service 646995
	__recinfo_int(SESSION_FIRST_BURST, ri, r,
Packit Service 646995
		      session.iscsi.FirstBurstLength, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_MAX_BURST, ri, r,
Packit Service 646995
		      session.iscsi.MaxBurstLength, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_DEF_TIME2RETAIN, ri, r,
Packit Service 646995
		      session.iscsi.DefaultTime2Retain, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_DEF_TIME2WAIT, ri, r,
Packit Service 646995
		      session.iscsi.DefaultTime2Wait, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_MAX_CONNS, ri, r,
Packit Service 646995
		      session.iscsi.MaxConnections, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_MAX_R2T, ri, r,
Packit Service 646995
		      session.iscsi.MaxOutstandingR2T, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(SESSION_ERL, ri, r,
Packit Service 646995
		      session.iscsi.ERL, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int_o2(SESSION_SCAN, ri, r,
Packit Service 646995
			 session.scan, IDBM_SHOW, "manual", "auto",
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_int(SESSION_REOPEN_MAX, ri, r,
Packit Service 646995
			session.reopen_max, IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
	for (i = 0; i < ISCSI_CONN_MAX; i++) {
Packit Service 646995
		char key[NAME_MAXVAL];
Packit Service 646995
Packit Service 646995
		sprintf(key, CONN_ADDR, i);
Packit Service 646995
		__recinfo_str(key, ri, r, conn[i].address, IDBM_SHOW, num, 0);
Packit Service 646995
		sprintf(key, CONN_PORT, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].port, IDBM_SHOW, num, 0);
Packit Service 646995
		sprintf(key, CONN_STARTUP, i);
Packit Service 646995
		__recinfo_int_o3(key, ri, r, conn[i].startup, IDBM_SHOW,
Packit Service 646995
				 "manual", "automatic", "onboot", num, 1);
Packit Service 646995
		sprintf(key, CONN_WINDOW_SIZE, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].tcp.window_size,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, CONN_SERVICE_TYPE, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].tcp.type_of_service,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, CONN_LOGOUT_TMO, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].timeo.logout_timeout,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, CONN_LOGIN_TMO, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].timeo.login_timeout,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, CONN_AUTH_TMO, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].timeo.auth_timeout,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
		sprintf(key, CONN_NOP_INT, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].timeo.noop_out_interval,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, CONN_NOP_TMO, i);
Packit Service 646995
		__recinfo_int(key, ri, r, conn[i].timeo.noop_out_timeout,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
		sprintf(key, CONN_MAX_XMIT_DLEN, i);
Packit Service 646995
		__recinfo_int(key, ri, r,
Packit Service 646995
			conn[i].iscsi.MaxXmitDataSegmentLength, IDBM_SHOW,
Packit Service 646995
			num, 1);
Packit Service 646995
		sprintf(key, CONN_MAX_RECV_DLEN, i);
Packit Service 646995
		__recinfo_int(key, ri, r,
Packit Service 646995
			conn[i].iscsi.MaxRecvDataSegmentLength, IDBM_SHOW,
Packit Service 646995
			num, 1);
Packit Service 646995
		sprintf(key, CONN_HDR_DIGEST, i);
Packit Service 646995
		__recinfo_int_o4(key, ri, r, conn[i].iscsi.HeaderDigest,
Packit Service 646995
				 IDBM_SHOW, "None", "CRC32C", "CRC32C,None",
Packit Service 646995
				 "None,CRC32C", num, 1);
Packit Service 646995
		sprintf(key, CONN_DATA_DIGEST, i);
Packit Service 646995
		__recinfo_int_o4(key, ri, r, conn[i].iscsi.DataDigest, IDBM_SHOW,
Packit Service 646995
				 "None", "CRC32C", "CRC32C,None",
Packit Service 646995
				 "None,CRC32C", num, 1);
Packit Service 646995
		sprintf(key, CONN_IFMARKER, i);
Packit Service 646995
		__recinfo_int_o2(key, ri, r, conn[i].iscsi.IFMarker, IDBM_SHOW,
Packit Service 646995
				"No", "Yes", num, 1);
Packit Service 646995
		sprintf(key, CONN_OFMARKER, i);
Packit Service 646995
		__recinfo_int_o2(key, ri, r, conn[i].iscsi.OFMarker, IDBM_SHOW,
Packit Service 646995
				"No", "Yes", num, 1);
Packit Service 646995
	}
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_recinfo_iface(iface_rec_t *r, recinfo_t *ri)
Packit Service 646995
{
Packit Service 646995
	int num = 0;
Packit Service 646995
	int iface_type;
Packit Service 646995
Packit Service 646995
	iface_type = iface_get_iptype(r);
Packit Service 646995
Packit Service 646995
	__recinfo_str(IFACE_ISCSINAME, ri, r, name, IDBM_SHOW, num, 0);
Packit Service 646995
	__recinfo_str(IFACE_NETNAME, ri, r, netdev, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_IPADDR, ri, r, ipaddress, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_PREFIX_LEN, ri, r, prefix_len, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_HWADDR, ri, r, hwaddress, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TRANSPORTNAME, ri, r, transport_name,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_INAME, ri, r, iname, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_STATE, ri, r, state, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_VLAN_ID, ri, r, vlan_id, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_VLAN_PRIORITY, ri, r, vlan_priority,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_VLAN_STATE, ri, r, vlan_state, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_int(IFACE_NUM, ri, r, iface_num, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_MTU, ri, r, mtu, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_PORT, ri, r, port, IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
	if (iface_type == ISCSI_IFACE_TYPE_IPV4) {
Packit Service 646995
		__recinfo_str(IFACE_BOOT_PROTO, ri, r, bootproto, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_SUBNET_MASK, ri, r, subnet_mask, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_GATEWAY, ri, r, gateway, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_ALT_CID, ri, r,
Packit Service 646995
			      dhcp_alt_client_id_state, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_ALT_CID_STR, ri, r, dhcp_alt_client_id,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_DNS, ri, r, dhcp_dns, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_LEARN_IQN, ri, r, dhcp_learn_iqn,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_REQ_VID, ri, r,
Packit Service 646995
			      dhcp_req_vendor_id_state, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_VID, ri, r, dhcp_vendor_id_state,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_VID_STR, ri, r, dhcp_vendor_id,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_DHCP_SLP_DA, ri, r, dhcp_slp_da, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_FRAGMENTATION, ri, r, fragmentation,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_GRAT_ARP, ri, r, gratuitous_arp, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_IN_FORWARD, ri, r, incoming_forwarding,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_TOS_STATE, ri, r, tos_state, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_TOS, ri, r, tos, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_TTL, ri, r, ttl, IDBM_SHOW, num, 1);
Packit Service 646995
	} else if (iface_type == ISCSI_IFACE_TYPE_IPV6) {
Packit Service 646995
		__recinfo_str(IFACE_IPV6_AUTOCFG, ri, r, ipv6_autocfg,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_LINKLOCAL_AUTOCFG, ri, r, linklocal_autocfg,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_ROUTER_AUTOCFG, ri, r, router_autocfg,
Packit Service 646995
			      IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_str(IFACE_LINKLOCAL, ri, r, ipv6_linklocal, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(IFACE_ROUTER, ri, r, ipv6_router, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_DUP_ADDR_DETECT_CNT, ri, r,
Packit Service 646995
				dup_addr_detect_cnt, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_FLOW_LABEL, ri, r, flow_label, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		__recinfo_str(IFACE_GRAT_NEIGHBOR_ADV, ri, r,
Packit Service 646995
			      gratuitous_neighbor_adv, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_HOP_LIMIT, ri, r, hop_limit, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		__recinfo_str(IFACE_MLD, ri, r, mld, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_ND_REACHABLE_TMO, ri, r,
Packit Service 646995
				 nd_reachable_tmo, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_ND_REXMIT_TIME, ri, r, nd_rexmit_time,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_ND_STALE_TMO, ri, r, nd_stale_tmo,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint32(IFACE_RTR_ADV_LINK_MTU, ri, r,
Packit Service 646995
				 router_adv_link_mtu, IDBM_SHOW, num, 1);
Packit Service 646995
		__recinfo_uint8(IFACE_TRAFFIC_CLASS, ri, r, traffic_class,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	__recinfo_str(IFACE_DELAYED_ACK, ri, r, delayed_ack, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TCP_NAGLE, ri, r, nagle, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TCP_WSF_STATE, ri, r, tcp_wsf_state, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_TCP_WSF, ri, r, tcp_wsf, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_TCP_TIMER_SCALE, ri, r, tcp_timer_scale,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_TCP_TIMESTAMP, ri, r, tcp_timestamp, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_REDIRECT, ri, r, redirect, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_DEF_TMF_TMO, ri, r, def_task_mgmt_tmo, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_str(IFACE_HDRDGST, ri, r, header_digest, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DATADGST, ri, r, data_digest, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_IMM_DATA, ri, r, immediate_data, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_INITIAL_R2T, ri, r, initial_r2t, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DSEQ_INORDER, ri, r, data_seq_inorder, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DPDU_INORDER, ri, r, data_pdu_inorder, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_uint8(IFACE_ERL, ri, r, erl, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint32(IFACE_MAX_RECV_DLEN, ri, r, max_recv_dlength,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint32(IFACE_FIRST_BURST, ri, r, first_burst_len, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_uint16(IFACE_MAX_R2T, ri, r, max_out_r2t, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint32(IFACE_MAX_BURST, ri, r, max_burst_len, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_str(IFACE_CHAP_AUTH, ri, r, chap_auth, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_BIDI_CHAP, ri, r, bidi_chap, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_STRICT_LOGIN_COMP, ri, r, strict_login_comp,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DISCOVERY_AUTH, ri, r, discovery_auth, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(IFACE_DISCOVERY_LOGOUT, ri, r, discovery_logout,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_recinfo_host_chap(struct iscsi_chap_rec *r, recinfo_t *ri)
Packit Service 646995
{
Packit Service 646995
	int num = 0;
Packit Service 646995
Packit Service 646995
	__recinfo_uint16(HOST_AUTH_INDEX, ri, r, chap_tbl_idx, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
Packit Service 646995
	if (r->chap_type == CHAP_TYPE_OUT) {
Packit Service 646995
		__recinfo_str(HOST_AUTH_USERNAME, ri, r, username, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(HOST_AUTH_PASSWORD, ri, r, password, IDBM_MASKED,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_int(HOST_AUTH_PASSWORD_LEN, ri, r, password_length,
Packit Service 646995
			      IDBM_HIDE, num, 1);
Packit Service 646995
	} else {
Packit Service 646995
		__recinfo_str(HOST_AUTH_USERNAME_IN, ri, r, username, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		__recinfo_str(HOST_AUTH_PASSWORD_IN, ri, r, password,
Packit Service 646995
			      IDBM_MASKED, num, 1);
Packit Service 646995
		__recinfo_int(HOST_AUTH_PASSWORD_IN_LEN, ri, r, password_length,
Packit Service 646995
			      IDBM_HIDE, num, 1);
Packit Service 646995
	}
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_recinfo_flashnode(struct flashnode_rec *r, recinfo_t *ri)
Packit Service 646995
{
Packit Service 646995
	int num = 0;
Packit Service 646995
	int i;
Packit Service 646995
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_AUTO_SND_TGT_DISABLE, ri, r,
Packit Service 646995
			sess.auto_snd_tgt_disable, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_DISCOVERY_SESS, ri, r,
Packit Service 646995
			sess.discovery_session, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_PORTAL_TYPE, ri, r, sess.portal_type,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_ENTRY_EN, ri, r,
Packit Service 646995
			sess.entry_enable, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_IMM_DATA_EN, ri, r, sess.immediate_data,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_INITIAL_R2T_EN, ri, r, sess.initial_r2t,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_DATASEQ_INORDER, ri, r,
Packit Service 646995
			sess.data_seq_in_order, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_PDU_INORDER, ri, r,
Packit Service 646995
			sess.data_pdu_in_order, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_CHAP_AUTH_EN, ri, r, sess.chap_auth_en,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_DISCOVERY_LOGOUT_EN, ri, r,
Packit Service 646995
			sess.discovery_logout_en, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_BIDI_CHAP_EN, ri, r, sess.bidi_chap_en,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_DISCOVERY_AUTH_OPTIONAL, ri, r,
Packit Service 646995
			sess.discovery_auth_optional, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_ERL, ri, r, sess.erl, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint32(FLASHNODE_SESS_FIRST_BURST, ri, r,
Packit Service 646995
			 sess.first_burst_len, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_DEF_TIME2WAIT, ri, r,
Packit Service 646995
			 sess.def_time2wait, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_DEF_TIME2RETAIN, ri, r,
Packit Service 646995
			 sess.def_time2retain, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_MAX_R2T, ri, r,
Packit Service 646995
			 sess.max_outstanding_r2t, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_ISID, ri, r, sess.isid, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_TSID, ri, r, sess.tsid, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_uint32(FLASHNODE_SESS_MAX_BURST, ri, r, sess.max_burst_len,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_DEF_TASKMGMT_TMO, ri, r,
Packit Service 646995
			 sess.def_taskmgmt_tmo, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_ALIAS, ri, r, sess.targetalias, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_NAME, ri, r, sess.targetname, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_DISCOVERY_PARENT_IDX, ri, r,
Packit Service 646995
			 sess.discovery_parent_idx, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_DISCOVERY_PARENT_TYPE, ri, r,
Packit Service 646995
		      sess.discovery_parent_type, IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_TPGT, ri, r, sess.tpgt, IDBM_SHOW,
Packit Service 646995
			 num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_CHAP_OUT_IDX, ri, r, sess.chap_out_idx,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint16(FLASHNODE_SESS_CHAP_IN_IDX, ri, r, sess.chap_in_idx,
Packit Service 646995
			 IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_USERNAME, ri, r, sess.username, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_USERNAME_IN, ri, r, sess.username_in,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_PASSWORD, ri, r, sess.password, IDBM_SHOW,
Packit Service 646995
		      num, 1);
Packit Service 646995
	__recinfo_str(FLASHNODE_SESS_PASSWORD_IN, ri, r, sess.password_in,
Packit Service 646995
		      IDBM_SHOW, num, 1);
Packit Service 646995
	__recinfo_uint8(FLASHNODE_SESS_IS_BOOT_TGT, ri, r, sess.is_boot_target,
Packit Service 646995
			IDBM_SHOW, num, 1);
Packit Service 646995
Packit Service 646995
	for (i = 0; i < ISCSI_CONN_MAX; i++) {
Packit Service 646995
		char key[NAME_MAXVAL];
Packit Service 646995
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_IS_FW_ASSIGNED_IPV6, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].is_fw_assigned_ipv6,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_HDR_DGST_EN, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].header_digest_en, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_DATA_DGST_EN, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].data_digest_en, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_SNACK_REQ_EN, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].snack_req_en, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_STAT, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_stat,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_NAGLE_DISABLE, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].tcp_nagle_disable,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_WSF_DISABLE, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].tcp_wsf_disable, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_TIMER_SCALE, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].tcp_timer_scale, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_TIMESTAMP_EN, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].tcp_timestamp_en,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_IP_FRAG_DISABLE, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].fragment_disable, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_MAX_XMIT_DLENGTH, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].max_xmit_dlength,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_MAX_RECV_DLENGTH, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].max_recv_dlength,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_KEEPALIVE_TMO, i);
Packit Service 646995
		__recinfo_uint16(key, ri, r, conn[i].keepalive_tmo, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_PORT, i);
Packit Service 646995
		__recinfo_uint16(key, ri, r, conn[i].port, IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_IPADDR, i);
Packit Service 646995
		__recinfo_str(key, ri, r, conn[i].ipaddress, IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_REDIRECT_IPADDR, i);
Packit Service 646995
		__recinfo_str(key, ri, r, conn[i].redirect_ipaddr, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_MAX_SEGMENT_SIZE, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].max_segment_size,
Packit Service 646995
				 IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_LOCAL_PORT, i);
Packit Service 646995
		__recinfo_uint16(key, ri, r, conn[i].local_port, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_IPV4_TOS, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].ipv4_tos, IDBM_SHOW,
Packit Service 646995
				num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_IPV6_TC, i);
Packit Service 646995
		__recinfo_uint8(key, ri, r, conn[i].ipv6_traffic_class,
Packit Service 646995
				IDBM_SHOW, num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_IPV6_FLOW_LABEL, i);
Packit Service 646995
		__recinfo_uint16(key, ri, r, conn[i].ipv6_flow_lbl, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_LINK_LOCAL_IPV6, i);
Packit Service 646995
		__recinfo_str(key, ri, r, conn[i].link_local_ipv6, IDBM_SHOW,
Packit Service 646995
			      num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_XMIT_WSF, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].tcp_xmit_wsf, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_TCP_RECV_WSF, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].tcp_recv_wsf, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_STATSN, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].stat_sn, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
		sprintf(key, FLASHNODE_CONN_EXP_STATSN, i);
Packit Service 646995
		__recinfo_uint32(key, ri, r, conn[i].exp_stat_sn, IDBM_SHOW,
Packit Service 646995
				 num, 1);
Packit Service 646995
	}
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
recinfo_t *idbm_recinfo_alloc(int max_keys)
Packit Service 646995
{
Packit Service 646995
	recinfo_t *info;
Packit Service 646995
Packit Service 646995
	info = malloc(sizeof(recinfo_t)*max_keys);
Packit Service 646995
	if (!info)
Packit Service 646995
		return NULL;
Packit Service 646995
	memset(info, 0, sizeof(recinfo_t)*max_keys);
Packit Service 646995
	return info;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_print(int type, void *rec, int show, FILE *f)
Packit Service 646995
{
Packit Service 646995
	int i;
Packit Service 646995
	recinfo_t *info;
Packit Service 646995
Packit Service 646995
	info = idbm_recinfo_alloc(MAX_KEYS);
Packit Service 646995
	if (!info)
Packit Service 646995
		return;
Packit Service 646995
Packit Service 646995
	switch (type) {
Packit Service 646995
	case IDBM_PRINT_TYPE_DISCOVERY:
Packit Service 646995
		idbm_recinfo_discovery((discovery_rec_t*)rec, info);
Packit Service 646995
		break;
Packit Service 646995
	case IDBM_PRINT_TYPE_NODE:
Packit Service 646995
		idbm_recinfo_node((node_rec_t*)rec, info);
Packit Service 646995
		break;
Packit Service 646995
	case IDBM_PRINT_TYPE_IFACE:
Packit Service 646995
		idbm_recinfo_iface((struct iface_rec *)rec, info);
Packit Service 646995
		break;
Packit Service 646995
	case IDBM_PRINT_TYPE_HOST_CHAP:
Packit Service 646995
		idbm_recinfo_host_chap((struct iscsi_chap_rec *)rec, info);
Packit Service 646995
		break;
Packit Service 646995
	case IDBM_PRINT_TYPE_FLASHNODE:
Packit Service 646995
		idbm_recinfo_flashnode((struct flashnode_rec *)rec, info);
Packit Service 646995
		break;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	fprintf(f, "%s\n", ISCSI_BEGIN_REC);
Packit Service 646995
	for (i = 0; i < MAX_KEYS; i++) {
Packit Service 646995
		if (!info[i].visible)
Packit Service 646995
			continue;
Packit Service 646995
		if (!show && info[i].visible == IDBM_MASKED) {
Packit Service 646995
			if (*(char*)info[i].data) {
Packit Service 646995
				fprintf(f, "%s = ********\n", info[i].name);
Packit Service 646995
				continue;
Packit Service 646995
			}
Packit Service 646995
			/* fall through */
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		if (strlen(info[i].value))
Packit Service 646995
			fprintf(f, "%s = %s\n", info[i].name, info[i].value);
Packit Service 646995
		else if (f == stdout)
Packit Service 646995
			fprintf(f, "%s = <empty>\n", info[i].name);
Packit Service 646995
	}
Packit Service 646995
	fprintf(f, "%s\n", ISCSI_END_REC);
Packit Service 646995
Packit Service 646995
	free(info);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static void
Packit Service 646995
idbm_setup_session_defaults(struct iscsi_session_operational_config *conf)
Packit Service 646995
{
Packit Service 646995
	conf->InitialR2T = 0;
Packit Service 646995
	conf->ImmediateData = 1;
Packit Service 646995
	conf->FirstBurstLength = DEF_INI_FIRST_BURST_LEN;
Packit Service 646995
	conf->MaxBurstLength = DEF_INI_MAX_BURST_LEN;
Packit Service 646995
	conf->DefaultTime2Wait = ISCSI_DEF_TIME2WAIT;
Packit Service 646995
	conf->DefaultTime2Retain = 0;
Packit Service 646995
	conf->MaxConnections = 1;
Packit Service 646995
	conf->MaxOutstandingR2T = 1;
Packit Service 646995
	conf->ERL = 0;
Packit Service 646995
	conf->FastAbort = 1;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static void idbm_setup_conn_defaults(struct iscsi_conn_operational_config *conf)
Packit Service 646995
{
Packit Service 646995
	conf->MaxXmitDataSegmentLength = 0;
Packit Service 646995
	conf->MaxRecvDataSegmentLength = DEF_INI_MAX_RECV_SEG_LEN;
Packit Service 646995
	conf->HeaderDigest = CONFIG_DIGEST_NEVER;
Packit Service 646995
	conf->DataDigest = CONFIG_DIGEST_NEVER;
Packit Service 646995
	conf->IFMarker = 0;
Packit Service 646995
	conf->OFMarker = 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static void
Packit Service 646995
idbm_discovery_setup_defaults(discovery_rec_t *rec, discovery_type_e type)
Packit Service 646995
{
Packit Service 646995
	memset(rec, 0, sizeof(discovery_rec_t));
Packit Service 646995
Packit Service 646995
	rec->startup = ISCSI_STARTUP_MANUAL;
Packit Service 646995
	rec->type = type;
Packit Service 646995
	rec->iscsid_req_tmo = -1;
Packit Service 646995
	switch (type) {
Packit Service 646995
	case DISCOVERY_TYPE_SENDTARGETS:
Packit Service 646995
		rec->u.sendtargets.discoveryd_poll_inval = 30;
Packit Service 646995
		rec->u.sendtargets.use_discoveryd = 0;
Packit Service 646995
		rec->u.sendtargets.reopen_max = 5;
Packit Service 646995
		rec->u.sendtargets.auth.authmethod = 0;
Packit Service 646995
		rec->u.sendtargets.auth.password_length = 0;
Packit Service 646995
		rec->u.sendtargets.auth.password_in_length = 0;
Packit Service 646995
		/* TYPE_INT_LIST fields should be initialized to ~0 to indicate unset values */
Packit Service 646995
		memset(rec->u.sendtargets.auth.chap_algs, ~0, sizeof(rec->u.sendtargets.auth.chap_algs));
Packit Service 646995
		rec->u.sendtargets.auth.chap_algs[0] = AUTH_CHAP_ALG_MD5;
Packit Service 646995
		rec->u.sendtargets.conn_timeo.login_timeout=15;
Packit Service 646995
		rec->u.sendtargets.conn_timeo.auth_timeout = 45;
Packit Service 646995
		rec->u.sendtargets.conn_timeo.active_timeout=30;
Packit Service 646995
		idbm_setup_session_defaults(&rec->u.sendtargets.session_conf);
Packit Service 646995
		idbm_setup_conn_defaults(&rec->u.sendtargets.conn_conf);
Packit Service 646995
		/* override def setting */
Packit Service 646995
		rec->u.sendtargets.conn_conf.MaxRecvDataSegmentLength =
Packit Service 646995
						DEF_INI_DISC_MAX_RECV_SEG_LEN;
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_SLP:
Packit Service 646995
		rec->u.slp.interfaces = NULL;
Packit Service 646995
		rec->u.slp.scopes = NULL;
Packit Service 646995
		rec->u.slp.poll_interval = 5 * 60;	/* 5 minutes */
Packit Service 646995
		rec->u.slp.auth.authmethod = 0;
Packit Service 646995
		rec->u.slp.auth.password_length = 0;
Packit Service 646995
		rec->u.slp.auth.password_in_length = 0;
Packit Service 646995
		rec->u.slp.auth.password_in_length = 0;
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_ISNS:
Packit Service 646995
		rec->u.isns.use_discoveryd = 0;
Packit Service 646995
		rec->u.isns.discoveryd_poll_inval = -1;
Packit Service 646995
		break;
Packit Service 646995
	default:
Packit Service 646995
		break;
Packit Service 646995
	}
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_rec_update_param(recinfo_t *info, char *name, char *value,
Packit Service 646995
			  int line_number)
Packit Service 646995
{
Packit Service 646995
	int i;
Packit Service 646995
	int passwd_done = 0;
Packit Service 646995
	char passwd_len[8];
Packit Service 646995
	char *tmp_value, *token;
Packit Service 646995
	bool *found;
Packit Service 646995
	int *tmp_data;
Packit Service 646995
Packit Service 646995
setup_passwd_len:
Packit Service 646995
	for (i=0; i
Packit Service 646995
		if (!strcmp(name, info[i].name)) {
Packit Service 646995
			int j,k;
Packit Service 646995
			struct int_list_tbl *tbl;
Packit Service 646995
Packit Service 646995
			log_debug(7, "updated '%s', '%s' => '%s'", name,
Packit Service 646995
				  info[i].value, value);
Packit Service 646995
			/* parse recinfo by type */
Packit Service 646995
			switch (info[i].type) {
Packit Service 646995
			case TYPE_INT:
Packit Service 646995
				if (!info[i].data)
Packit Service 646995
					continue;
Packit Service 646995
Packit Service 646995
				*(int*)info[i].data =
Packit Service 646995
					strtoul(value, NULL, 10);
Packit Service 646995
				goto updated;
Packit Service 646995
			case TYPE_UINT8:
Packit Service 646995
				if (!info[i].data)
Packit Service 646995
					continue;
Packit Service 646995
Packit Service 646995
				*(uint8_t *)info[i].data =
Packit Service 646995
					strtoul(value, NULL, 10);
Packit Service 646995
				goto updated;
Packit Service 646995
			case TYPE_UINT16:
Packit Service 646995
				if (!info[i].data)
Packit Service 646995
					continue;
Packit Service 646995
Packit Service 646995
				*(uint16_t *)info[i].data =
Packit Service 646995
					strtoul(value, NULL, 10);
Packit Service 646995
				goto updated;
Packit Service 646995
			case TYPE_UINT32:
Packit Service 646995
				if (!info[i].data)
Packit Service 646995
					continue;
Packit Service 646995
Packit Service 646995
				*(uint32_t *)info[i].data =
Packit Service 646995
					strtoul(value, NULL, 10);
Packit Service 646995
				goto updated;
Packit Service 646995
			case TYPE_STR:
Packit Service 646995
				if (!info[i].data)
Packit Service 646995
					continue;
Packit Service 646995
Packit Service 646995
				strlcpy((char*)info[i].data,
Packit Service 646995
					value, info[i].data_len);
Packit Service 646995
				goto updated;
Packit Service 646995
			case TYPE_INT_O:
Packit Service 646995
				for (j=0; j
Packit Service 646995
					if (!strcmp(value, info[i].opts[j])) {
Packit Service 646995
						if (!info[i].data)
Packit Service 646995
							continue;
Packit Service 646995
Packit Service 646995
						*(int*)info[i].data = j;
Packit Service 646995
						goto updated;
Packit Service 646995
					}
Packit Service 646995
				}
Packit Service 646995
				/* internal error if reached ?? */
Packit Service 646995
				break;
Packit Service 646995
			case TYPE_INT_LIST:
Packit Service 646995
				if (!info[i].data)
Packit Service 646995
					continue;
Packit Service 646995
				tbl = (void *)info[i].opts[0];
Packit Service 646995
				/* strsep is destructive, make a copy to work with */
Packit Service 646995
				tmp_value = strdup(value);
Packit Service 646995
				k = 0;
Packit Service 646995
				tmp_data = malloc(info[i].data_len);
Packit Service 646995
				memset(tmp_data, ~0, info[i].data_len);
Packit Service 646995
				found = calloc(info[i].numopts, sizeof(bool));
Packit Service 646995
Packit Service 646995
next_token:			while ((token = strsep(&tmp_value, ", \n"))) {
Packit Service 646995
					if (!strlen(token))
Packit Service 646995
						continue;
Packit Service 646995
					if ((k * (int)sizeof(int)) >= (info[i].data_len)) {
Packit Service 646995
						log_warning("Too many values set for '%s'"
Packit Service 646995
						            ", continuing without processing them all",
Packit Service 646995
						            info[i].name);
Packit Service 646995
						break;
Packit Service 646995
					}
Packit Service 646995
					for (j = 0; j < info[i].numopts; j++) {
Packit Service 646995
						if (!strcmp(token, tbl[j].name)) {
Packit Service 646995
							if ((found[j])) {
Packit Service 646995
								log_warning("Ignoring repeated "
Packit Service 646995
								            "value '%s' "
Packit Service 646995
								            "for '%s'", token,
Packit Service 646995
								            info[i].name);
Packit Service 646995
								goto next_token;
Packit Service 646995
							}
Packit Service 646995
							((int*)tmp_data)[k++] = tbl[j].value;
Packit Service 646995
							found[j] = true;
Packit Service 646995
							goto next_token;
Packit Service 646995
						}
Packit Service 646995
					}
Packit Service 646995
					log_warning("Ignoring unknown value '%s'"
Packit Service 646995
					            " for '%s'", token, info[i].name);
Packit Service 646995
				}
Packit Service 646995
				memcpy(info[i].data, tmp_data, info[i].data_len);
Packit Service 646995
				free(tmp_value);
Packit Service 646995
				free(tmp_data);
Packit Service 646995
				tmp_value = NULL;
Packit Service 646995
				tmp_data = NULL;
Packit Service 646995
				token = NULL;
Packit Service 646995
				goto updated;
Packit Service 646995
			}
Packit Service 646995
			if (line_number) {
Packit Service 646995
				log_warning("config file line %d contains "
Packit Service 646995
					    "unknown value format '%s' for "
Packit Service 646995
					    "parameter name '%s'",
Packit Service 646995
					    line_number, value, name);
Packit Service 646995
			} else {
Packit Service 646995
				log_error("unknown value format '%s' for "
Packit Service 646995
					  "parameter name '%s'", value, name);
Packit Service 646995
			}
Packit Service 646995
			break;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	return ISCSI_ERR_INVAL;
Packit Service 646995
Packit Service 646995
updated:
Packit Service 646995
	strlcpy((char*)info[i].value, value, VALUE_MAXVAL);
Packit Service 646995
Packit Service 646995
#define check_password_param(_param) \
Packit Service 646995
	if (!passwd_done && !strcmp(#_param, name)) { \
Packit Service 646995
		passwd_done = 1; \
Packit Service 646995
		name = #_param "_length"; \
Packit Service 646995
		snprintf(passwd_len, 8, "%.7" PRIi32, (int)strlen(value) & 0xffff); \
Packit Service 646995
		value = passwd_len; \
Packit Service 646995
		goto setup_passwd_len; \
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	check_password_param(node.session.auth.password);
Packit Service 646995
	check_password_param(node.session.auth.password_in);
Packit Service 646995
	check_password_param(discovery.sendtargets.auth.password);
Packit Service 646995
	check_password_param(discovery.sendtargets.auth.password_in);
Packit Service 646995
	check_password_param(discovery.slp.auth.password);
Packit Service 646995
	check_password_param(discovery.slp.auth.password_in);
Packit Service 646995
	check_password_param(host.auth.password);
Packit Service 646995
	check_password_param(host.auth.password_in);
Packit Service 646995
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * TODO: we can also check for valid values here.
Packit Service 646995
 */
Packit Service 646995
int idbm_verify_param(recinfo_t *info, char *name)
Packit Service 646995
{
Packit Service 646995
	int i;
Packit Service 646995
Packit Service 646995
	for (i = 0; i < MAX_KEYS; i++) {
Packit Service 646995
		if (strcmp(name, info[i].name))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		log_debug(7, "verify %s %d", name, info[i].can_modify);
Packit Service 646995
		if (info[i].can_modify)
Packit Service 646995
			return 0;
Packit Service 646995
		else {
Packit Service 646995
			log_error("Cannot modify %s. It is used to look up "
Packit Service 646995
				  "the record and cannot be changed.", name);
Packit Service 646995
			return ISCSI_ERR_INVAL;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	log_error("Cannot modify %s. Invalid param name.", name);
Packit Service 646995
	return ISCSI_ERR_INVAL;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_recinfo_config(recinfo_t *info, FILE *f)
Packit Service 646995
{
Packit Service 646995
	char name[NAME_MAXVAL];
Packit Service 646995
	char value[VALUE_MAXVAL];
Packit Service 646995
	char *line, *nl, buffer[2048];
Packit Service 646995
	int line_number = 0;
Packit Service 646995
	int c = 0, i;
Packit Service 646995
Packit Service 646995
	fseek(f, 0, SEEK_SET);
Packit Service 646995
Packit Service 646995
	/* process the config file */
Packit Service 646995
	do {
Packit Service 646995
		line = fgets(buffer, sizeof (buffer), f);
Packit Service 646995
		line_number++;
Packit Service 646995
		if (!line)
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		nl = line + strlen(line) - 1;
Packit Service 646995
		if (*nl != '\n') {
Packit Service 646995
			log_warning("Config file line %d too long.",
Packit Service 646995
			       line_number);
Packit Service 646995
			continue;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		line = strstrip(line);
Packit Service 646995
		/* process any non-empty, non-comment lines */
Packit Service 646995
		if (!*line || *line == '\0' || *line ==  '\n' || *line == '#')
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		/* parse name */
Packit Service 646995
		i=0; nl = line; *name = 0;
Packit Service 646995
		while (*nl && !isspace(c = *nl) && *nl != '=') {
Packit Service 646995
			*(name+i) = *nl; i++; nl++;
Packit Service 646995
		}
Packit Service 646995
		if (!*nl) {
Packit Service 646995
			log_warning("config file line %d do not has value",
Packit Service 646995
			       line_number);
Packit Service 646995
			continue;
Packit Service 646995
		}
Packit Service 646995
		*(name+i)=0; nl++;
Packit Service 646995
		/* skip after-name traling spaces */
Packit Service 646995
		while (*nl && isspace(c = *nl)) nl++;
Packit Service 646995
		if (*nl && *nl != '=') {
Packit Service 646995
			log_warning("config file line %d has not '=' sepa",
Packit Service 646995
			       line_number);
Packit Service 646995
			continue;
Packit Service 646995
		}
Packit Service 646995
		/* skip '=' sepa */
Packit Service 646995
		nl++;
Packit Service 646995
		/* skip after-sepa traling spaces */
Packit Service 646995
		while (*nl && isspace(c = *nl)) nl++;
Packit Service 646995
		if (!*nl) {
Packit Service 646995
			log_warning("config file line %d do not has value",
Packit Service 646995
			       line_number);
Packit Service 646995
			continue;
Packit Service 646995
		}
Packit Service 646995
		/* parse value */
Packit Service 646995
		i=0; *value = 0;
Packit Service 646995
		while (*nl) {
Packit Service 646995
			*(value+i) = *nl; i++; nl++;
Packit Service 646995
		}
Packit Service 646995
		*(value+i) = 0;
Packit Service 646995
Packit Service 646995
		idbm_rec_update_param(info, name, value, line_number);
Packit Service 646995
	} while (line);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * TODO: remove db's copy of nrec and infos
Packit Service 646995
 */
Packit Service 646995
static void idbm_sync_config(void)
Packit Service 646995
{
Packit Service 646995
	char *config_file;
Packit Service 646995
	FILE *f;
Packit Service 646995
Packit Service 646995
	/* in case of no configuration file found we just
Packit Service 646995
	 * initialize default node and default discovery records
Packit Service 646995
	 * from hard-coded default values */
Packit Service 646995
	idbm_node_setup_defaults(&db->nrec);
Packit Service 646995
	idbm_discovery_setup_defaults(&db->drec_st, DISCOVERY_TYPE_SENDTARGETS);
Packit Service 646995
	idbm_discovery_setup_defaults(&db->drec_slp, DISCOVERY_TYPE_SLP);
Packit Service 646995
	idbm_discovery_setup_defaults(&db->drec_isns, DISCOVERY_TYPE_ISNS);
Packit Service 646995
Packit Service 646995
	idbm_recinfo_discovery(&db->drec_st, db->dinfo_st);
Packit Service 646995
	idbm_recinfo_discovery(&db->drec_slp, db->dinfo_slp);
Packit Service 646995
	idbm_recinfo_discovery(&db->drec_isns, db->dinfo_isns);
Packit Service 646995
	idbm_recinfo_node(&db->nrec, db->ninfo);
Packit Service 646995
Packit Service 646995
	if (!db->get_config_file) {
Packit Service 646995
		log_debug(1, "Could not get config file. No config file fn");
Packit Service 646995
		return;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	config_file = db->get_config_file();
Packit Service 646995
	if (!config_file) {
Packit Service 646995
		log_debug(1, "Could not get config file for sync config");
Packit Service 646995
		return;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	f = fopen(config_file, "r");
Packit Service 646995
	if (!f) {
Packit Service 646995
		log_debug(1, "cannot open configuration file %s. "
Packit Service 646995
			  "Default location is %s.",
Packit Service 646995
			  config_file, CONFIG_FILE);
Packit Service 646995
		return;
Packit Service 646995
	}
Packit Service 646995
	log_debug(5, "updating defaults from '%s'", config_file);
Packit Service 646995
Packit Service 646995
	idbm_recinfo_config(db->dinfo_st, f);
Packit Service 646995
	idbm_recinfo_config(db->dinfo_slp, f);
Packit Service 646995
	idbm_recinfo_config(db->dinfo_isns, f);
Packit Service 646995
	idbm_recinfo_config(db->ninfo, f);
Packit Service 646995
	fclose(f);
Packit Service 646995
Packit Service 646995
	/* update password lengths */
Packit Service 646995
	if (*db->drec_st.u.sendtargets.auth.password)
Packit Service 646995
		db->drec_st.u.sendtargets.auth.password_length =
Packit Service 646995
			strlen((char*)db->drec_st.u.sendtargets.auth.password);
Packit Service 646995
	if (*db->drec_st.u.sendtargets.auth.password_in)
Packit Service 646995
		db->drec_st.u.sendtargets.auth.password_in_length =
Packit Service 646995
		     strlen((char*)db->drec_st.u.sendtargets.auth.password_in);
Packit Service 646995
	if (*db->drec_slp.u.slp.auth.password)
Packit Service 646995
		db->drec_slp.u.slp.auth.password_length =
Packit Service 646995
			strlen((char*)db->drec_slp.u.slp.auth.password);
Packit Service 646995
	if (*db->drec_slp.u.slp.auth.password_in)
Packit Service 646995
		db->drec_slp.u.slp.auth.password_in_length =
Packit Service 646995
			strlen((char*)db->drec_slp.u.slp.auth.password_in);
Packit Service 646995
	if (*db->nrec.session.auth.password)
Packit Service 646995
		db->nrec.session.auth.password_length =
Packit Service 646995
			strlen((char*)db->nrec.session.auth.password);
Packit Service 646995
	if (*db->nrec.session.auth.password_in)
Packit Service 646995
		db->nrec.session.auth.password_in_length =
Packit Service 646995
			strlen((char*)db->nrec.session.auth.password_in);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_node_setup_from_conf(node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	memset(rec, 0, sizeof(*rec));
Packit Service 646995
	idbm_node_setup_defaults(rec);
Packit Service 646995
	idbm_sync_config();
Packit Service 646995
	memcpy(rec, &db->nrec, sizeof(*rec));
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_discovery_info(discovery_rec_t *rec, int show)
Packit Service 646995
{
Packit Service 646995
	idbm_print(IDBM_PRINT_TYPE_DISCOVERY, rec, show, stdout);
Packit Service 646995
	return 1;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_node_info(void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	int show = *((int *)data);
Packit Service 646995
Packit Service 646995
	idbm_print(IDBM_PRINT_TYPE_NODE, rec, show, stdout);
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_host_chap_info(struct iscsi_chap_rec *chap)
Packit Service 646995
{
Packit Service 646995
	/* User only calls this to print chap so always print */
Packit Service 646995
	idbm_print(IDBM_PRINT_TYPE_HOST_CHAP, chap, 1, stdout);
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_flashnode_info(struct flashnode_rec *fnode)
Packit Service 646995
{
Packit Service 646995
	idbm_print(IDBM_PRINT_TYPE_FLASHNODE, fnode, 1, stdout);
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_node_flat(__attribute__((unused))void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	if (strchr(rec->conn[0].address, '.'))
Packit Service 646995
		printf("%s:%d,%d %s\n", rec->conn[0].address, rec->conn[0].port,
Packit Service 646995
			rec->tpgt, rec->name);
Packit Service 646995
	else
Packit Service 646995
		printf("[%s]:%d,%d %s\n", rec->conn[0].address,
Packit Service 646995
		       rec->conn[0].port, rec->tpgt, rec->name);
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_node_tree(struct node_rec *last_rec, struct node_rec *rec,
Packit Service 646995
			 char *prefix)
Packit Service 646995
{
Packit Service 646995
	if (!last_rec || strcmp(last_rec->name, rec->name)) {
Packit Service 646995
		printf("%sTarget: %s\n", prefix, rec->name);
Packit Service 646995
		if (last_rec)
Packit Service 646995
			memset(last_rec, 0, sizeof(node_rec_t));
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (!last_rec ||
Packit Service 646995
	     ((strcmp(last_rec->conn[0].address, rec->conn[0].address) ||
Packit Service 646995
	     last_rec->conn[0].port != rec->conn[0].port))) {
Packit Service 646995
		if (strchr(rec->conn[0].address, '.'))
Packit Service 646995
			printf("%s\tPortal: %s:%d,%d\n", prefix,
Packit Service 646995
			       rec->conn[0].address,
Packit Service 646995
			       rec->conn[0].port, rec->tpgt);
Packit Service 646995
		else
Packit Service 646995
			printf("%s\tPortal: [%s]:%d,%d\n", prefix,
Packit Service 646995
			       rec->conn[0].address,
Packit Service 646995
			       rec->conn[0].port, rec->tpgt);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (last_rec)
Packit Service 646995
		memcpy(last_rec, rec, sizeof(node_rec_t));
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_node_and_iface_tree(void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	idbm_print_node_tree(data, rec, "");
Packit Service 646995
	printf("\t\tIface Name: %s\n", rec->iface.name);
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int
Packit Service 646995
get_params_from_disc_link(char *link, char **target, char **tpgt,
Packit Service 646995
			  char **address, char **port, char **ifaceid)
Packit Service 646995
{
Packit Service 646995
	(*target) = link;
Packit Service 646995
	*address = strchr(*target, ',');
Packit Service 646995
	if (!(*address))
Packit Service 646995
		return ISCSI_ERR_INVAL;
Packit Service 646995
	*(*address)++ = '\0';
Packit Service 646995
	*port = strchr(*address, ',');
Packit Service 646995
	if (!(*port))
Packit Service 646995
		return ISCSI_ERR_INVAL;
Packit Service 646995
	*(*port)++ = '\0';
Packit Service 646995
	*tpgt = strchr(*port, ',');
Packit Service 646995
	if (!(*tpgt))
Packit Service 646995
		return ISCSI_ERR_INVAL;
Packit Service 646995
	*(*tpgt)++ = '\0';
Packit Service 646995
	*ifaceid = strchr(*tpgt, ',');
Packit Service 646995
	if (!(*ifaceid))
Packit Service 646995
		return ISCSI_ERR_INVAL;
Packit Service 646995
	*(*ifaceid)++ = '\0';
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_lock(void)
Packit Service 646995
{
Packit Service 646995
	int fd, i, ret;
Packit Service 646995
Packit Service 646995
	if (db->refs > 0) {
Packit Service 646995
		db->refs++;
Packit Service 646995
		return 0;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (access(LOCK_DIR, F_OK) != 0) {
Packit Service 646995
		if (mkdir(LOCK_DIR, 0660) != 0) {
Packit Service 646995
			log_error("Could not open %s: %s", LOCK_DIR,
Packit Service 646995
				  strerror(errno));
Packit Service 646995
			return ISCSI_ERR_IDBM;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	fd = open(LOCK_FILE, O_RDWR | O_CREAT, 0666);
Packit Service 646995
	if (fd >= 0)
Packit Service 646995
		close(fd);
Packit Service 646995
Packit Service 646995
	for (i = 0; i < 3000; i++) {
Packit Service 646995
		ret = link(LOCK_FILE, LOCK_WRITE_FILE);
Packit Service 646995
		if (ret == 0)
Packit Service 646995
			break;
Packit Service 646995
Packit Service 646995
		if (errno != EEXIST) {
Packit Service 646995
			log_error("Maybe you are not root?");
Packit Service 646995
			log_error("Could not lock discovery DB: %s: %s",
Packit Service 646995
					LOCK_WRITE_FILE, strerror(errno));
Packit Service 646995
			return ISCSI_ERR_IDBM;
Packit Service 646995
		} else if (i == 0)
Packit Service 646995
			log_debug(2, "Waiting for discovery DB lock");
Packit Service 646995
Packit Service 646995
		usleep(10000);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	db->refs = 1;
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_unlock(void)
Packit Service 646995
{
Packit Service 646995
	if (db->refs > 1) {
Packit Service 646995
		db->refs--;
Packit Service 646995
		return;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	db->refs = 0;
Packit Service 646995
	unlink(LOCK_WRITE_FILE);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * Backwards Compat:
Packit Service 646995
 * If the portal is a file then we are doing the old style default
Packit Service 646995
 * session behavior (svn pre 780).
Packit Service 646995
 */
Packit Service 646995
static FILE *idbm_open_rec_r(char *portal, char *config)
Packit Service 646995
{
Packit Service 646995
	struct stat statb;
Packit Service 646995
Packit Service 646995
	log_debug(5, "Looking for config file %s config %s.", portal, config);
Packit Service 646995
Packit Service 646995
	if (stat(portal, &statb)) {
Packit Service 646995
		log_debug(5, "Could not stat %s err %d.", portal, errno);
Packit Service 646995
		return NULL;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (S_ISDIR(statb.st_mode)) {
Packit Service 646995
		strlcat(portal, "/", PATH_MAX);
Packit Service 646995
		strlcat(portal, config, PATH_MAX);
Packit Service 646995
	}
Packit Service 646995
	return fopen(portal, "r");
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * When the disable_lock param is true, the idbm_lock/idbm_unlock needs
Packit Service 646995
 * to be holt by the caller, this will avoid overwriting each other in
Packit Service 646995
 * case of updating(read-modify-write) the recs in parallel.
Packit Service 646995
 */
Packit Service 646995
static int __idbm_rec_read(node_rec_t *out_rec, char *conf, bool disable_lock)
Packit Service 646995
{
Packit Service 646995
	recinfo_t *info;
Packit Service 646995
	FILE *f;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	info = idbm_recinfo_alloc(MAX_KEYS);
Packit Service 646995
	if (!info)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	if (!disable_lock) {
Packit Service 646995
		rc = idbm_lock();
Packit Service 646995
		if (rc)
Packit Service 646995
			goto free_info;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	f = fopen(conf, "r");
Packit Service 646995
	if (!f) {
Packit Service 646995
		log_debug(5, "Could not open %s err %s", conf,
Packit Service 646995
			  strerror(errno));
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto unlock;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	memset(out_rec, 0, sizeof(*out_rec));
Packit Service 646995
	idbm_node_setup_defaults(out_rec);
Packit Service 646995
	idbm_recinfo_node(out_rec, info);
Packit Service 646995
	idbm_recinfo_config(info, f);
Packit Service 646995
	fclose(f);
Packit Service 646995
Packit Service 646995
unlock:
Packit Service 646995
	if (!disable_lock)
Packit Service 646995
		idbm_unlock();
Packit Service 646995
free_info:
Packit Service 646995
	free(info);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * When the disable_lock param is true, the idbm_lock/idbm_unlock needs
Packit Service 646995
 * to be holt by the caller, this will avoid overwriting each other in
Packit Service 646995
 * case of updating(read-modify-write) the recs in parallel.
Packit Service 646995
 */
Packit Service 646995
int
Packit Service 646995
idbm_rec_read(node_rec_t *out_rec, char *targetname, int tpgt,
Packit Service 646995
	      char *ip, int port, struct iface_rec *iface, bool disable_lock)
Packit Service 646995
{
Packit Service 646995
	struct stat statb;
Packit Service 646995
	char *portal;
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	portal = calloc(1, PATH_MAX);
Packit Service 646995
	if (!portal)
Packit Service 646995
		return ISCSI_ERR_IDBM;
Packit Service 646995
Packit Service 646995
	/* try old style portal as config */
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 targetname, ip, port);
Packit Service 646995
	log_debug(5, "rec read looking for config file %s.", portal);
Packit Service 646995
	if (!stat(portal, &statb))
Packit Service 646995
		goto read;
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
Packit Service 646995
		 targetname, ip, port, tpgt, iface->name);
Packit Service 646995
	log_debug(5, "rec read looking for config file %s.", portal);
Packit Service 646995
	if (!strlen(iface->name)) {
Packit Service 646995
		rc = ISCSI_ERR_INVAL;
Packit Service 646995
		goto free_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (stat(portal, &statb)) {
Packit Service 646995
		log_debug(5, "Could not stat %s: %s.", portal, strerror(errno));
Packit Service 646995
		free(portal);
Packit Service 646995
		return ISCSI_ERR_IDBM;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
read:
Packit Service 646995
	rc = __idbm_rec_read(out_rec, portal, disable_lock);
Packit Service 646995
free_portal:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int print_discovered_flat(void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct discovery_rec *drec = data;
Packit Service 646995
Packit Service 646995
	if (rec->disc_type != drec->type)
Packit Service 646995
		goto no_match;
Packit Service 646995
Packit Service 646995
	if (drec->type == DISCOVERY_TYPE_SENDTARGETS ||
Packit Service 646995
	    drec->type == DISCOVERY_TYPE_ISNS) {
Packit Service 646995
		if (rec->disc_port != drec->port ||
Packit Service 646995
		    strcmp(rec->disc_address, drec->address))
Packit Service 646995
			goto no_match;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	idbm_print_node_flat(NULL, rec);
Packit Service 646995
	return 0;
Packit Service 646995
no_match:
Packit Service 646995
	return -1;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
struct discovered_tree_info {
Packit Service 646995
	struct discovery_rec *drec;
Packit Service 646995
	struct node_rec *last_rec;
Packit Service 646995
};
Packit Service 646995
Packit Service 646995
static int print_discovered_tree(void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct discovered_tree_info *tree_info = data;
Packit Service 646995
	struct discovery_rec *drec = tree_info->drec;
Packit Service 646995
Packit Service 646995
	if (rec->disc_type != drec->type)
Packit Service 646995
		goto no_match;
Packit Service 646995
Packit Service 646995
	if (strlen(drec->address)) {
Packit Service 646995
		if (rec->disc_port != drec->port ||
Packit Service 646995
		    strcmp(rec->disc_address, drec->address))
Packit Service 646995
			goto no_match;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	idbm_print_node_and_iface_tree(tree_info->last_rec, rec);
Packit Service 646995
	return 0;
Packit Service 646995
no_match:
Packit Service 646995
	return -1;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int idbm_print_discovered(discovery_rec_t *drec, int info_level)
Packit Service 646995
{
Packit Service 646995
	int num_found = 0;
Packit Service 646995
Packit Service 646995
	if (info_level < 1)
Packit Service 646995
		idbm_for_each_rec(&num_found, drec, print_discovered_flat, false);
Packit Service 646995
	else {
Packit Service 646995
		struct discovered_tree_info tree_info;
Packit Service 646995
		struct node_rec last_rec;
Packit Service 646995
Packit Service 646995
		memset(&last_rec, 0, sizeof(struct node_rec));
Packit Service 646995
Packit Service 646995
		tree_info.drec = drec;
Packit Service 646995
		tree_info.last_rec = &last_rec;
Packit Service 646995
Packit Service 646995
		idbm_for_each_rec(&num_found, &tree_info, print_discovered_tree, false);
Packit Service 646995
	}
Packit Service 646995
	return num_found;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int idbm_for_each_drec(int type, char *config_root, void *data,
Packit Service 646995
			      idbm_drec_op_fn *fn)
Packit Service 646995
{
Packit Service 646995
	DIR *entity_dirfd;
Packit Service 646995
	struct dirent *entity_dent;
Packit Service 646995
	int found = 0;
Packit Service 646995
	discovery_rec_t drec;
Packit Service 646995
	char *tmp_port;
Packit Service 646995
Packit Service 646995
	entity_dirfd = opendir(config_root);
Packit Service 646995
	if (!entity_dirfd)
Packit Service 646995
		return found;
Packit Service 646995
Packit Service 646995
	while ((entity_dent = readdir(entity_dirfd))) {
Packit Service 646995
		if (!strcmp(entity_dent->d_name, ".") ||
Packit Service 646995
		    !strcmp(entity_dent->d_name, ".."))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		log_debug(5, "found %s", entity_dent->d_name);
Packit Service 646995
Packit Service 646995
		tmp_port = strchr(entity_dent->d_name, ',');
Packit Service 646995
		if (!tmp_port)
Packit Service 646995
			continue;
Packit Service 646995
		/*
Packit Service 646995
		 * pre 872 tools dumped the target portal symlinks in the isns
Packit Service 646995
		 * dir instead of the server. If we find one of those links
Packit Service 646995
		 * (by checking if there is a valid port) we skip it.
Packit Service 646995
		 */
Packit Service 646995
		if (strchr(tmp_port, ':') || strchr(tmp_port, '.'))
Packit Service 646995
			continue;
Packit Service 646995
		*tmp_port++ = '\0';
Packit Service 646995
Packit Service 646995
		memset(&drec, 0, sizeof(drec));
Packit Service 646995
		if (idbm_discovery_read(&drec, type, entity_dent->d_name,
Packit Service 646995
					atoi(tmp_port))) {
Packit Service 646995
			log_error("Could not read discovery record for "
Packit Service 646995
				  "%s:%s.", entity_dent->d_name, tmp_port);
Packit Service 646995
			continue;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		if (!fn(data, &drec))
Packit Service 646995
			found++;
Packit Service 646995
	}
Packit Service 646995
	closedir(entity_dirfd);
Packit Service 646995
	return found;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_for_each_st_drec(void *data, idbm_drec_op_fn *fn)
Packit Service 646995
{
Packit Service 646995
	return idbm_for_each_drec(DISCOVERY_TYPE_SENDTARGETS, ST_CONFIG_DIR,
Packit Service 646995
				  data, fn);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_for_each_isns_drec(void *data, idbm_drec_op_fn *fn)
Packit Service 646995
{
Packit Service 646995
	return idbm_for_each_drec(DISCOVERY_TYPE_ISNS, ISNS_CONFIG_DIR,
Packit Service 646995
				  data, fn);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int __idbm_print_all_by_drec(void *data, struct discovery_rec *drec)
Packit Service 646995
{
Packit Service 646995
	int info_level = *(int *)data;
Packit Service 646995
Packit Service 646995
	if (info_level >= 1) {
Packit Service 646995
		printf("DiscoveryAddress: %s,%d\n",
Packit Service 646995
		       drec->address, drec->port);
Packit Service 646995
		idbm_print_discovered(drec, info_level);
Packit Service 646995
	} else
Packit Service 646995
		printf("%s:%d via %s\n", drec->address, drec->port,
Packit Service 646995
		       drec->type == DISCOVERY_TYPE_ISNS ?
Packit Service 646995
		       "isns" : "sendtargets");
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int idbm_print_all_st(int info_level)
Packit Service 646995
{
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	rc = idbm_for_each_st_drec(&info_level, __idbm_print_all_by_drec);
Packit Service 646995
	if (rc < 0)
Packit Service 646995
		return 0;
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int idbm_print_all_isns(int info_level)
Packit Service 646995
{
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	rc = idbm_for_each_isns_drec(&info_level, __idbm_print_all_by_drec);
Packit Service 646995
	if (rc < 0)
Packit Service 646995
		return 0;
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_print_all_discovery(int info_level)
Packit Service 646995
{
Packit Service 646995
	discovery_rec_t *drec;
Packit Service 646995
	int found = 0, tmp;
Packit Service 646995
Packit Service 646995
	if (info_level < 1) {
Packit Service 646995
		found = idbm_print_all_st(info_level);
Packit Service 646995
		found += idbm_print_all_isns(info_level);
Packit Service 646995
		return found;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	drec = calloc(1, sizeof(*drec));
Packit Service 646995
	if (!drec)
Packit Service 646995
		return 0;
Packit Service 646995
Packit Service 646995
	tmp = 0;
Packit Service 646995
	printf("SENDTARGETS:\n");
Packit Service 646995
	tmp = idbm_print_all_st(info_level);
Packit Service 646995
	if (!tmp)
Packit Service 646995
		printf("No targets found.\n");
Packit Service 646995
	found += tmp;
Packit Service 646995
	tmp = 0;
Packit Service 646995
Packit Service 646995
	printf("iSNS:\n");
Packit Service 646995
	tmp = idbm_print_all_isns(info_level);
Packit Service 646995
	if (!tmp) {
Packit Service 646995
		/*
Packit Service 646995
		 * pre 872 tools did not store the server ip,port so
Packit Service 646995
		 * we drop down here, to just look for target portals.
Packit Service 646995
		 */
Packit Service 646995
		drec->type = DISCOVERY_TYPE_ISNS;
Packit Service 646995
		tmp = idbm_print_discovered(drec, info_level);
Packit Service 646995
		if (!tmp)
Packit Service 646995
			printf("No targets found.\n");
Packit Service 646995
	}
Packit Service 646995
	found += tmp;
Packit Service 646995
	tmp = 0;
Packit Service 646995
Packit Service 646995
	printf("STATIC:\n");
Packit Service 646995
	drec->type = DISCOVERY_TYPE_STATIC;
Packit Service 646995
	tmp = idbm_print_discovered(drec, info_level);
Packit Service 646995
	if (!tmp)
Packit Service 646995
		printf("No targets found.\n");
Packit Service 646995
	found += tmp;
Packit Service 646995
	tmp = 0;
Packit Service 646995
Packit Service 646995
	printf("FIRMWARE:\n");
Packit Service 646995
	drec->type = DISCOVERY_TYPE_FW;
Packit Service 646995
	tmp = idbm_print_discovered(drec, info_level);
Packit Service 646995
	if (!tmp)
Packit Service 646995
		printf("No targets found.\n");
Packit Service 646995
	found += tmp;
Packit Service 646995
Packit Service 646995
	free(drec);
Packit Service 646995
	return found;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/**
Packit Service 646995
 * idbm_for_each_iface - iterate over bound iface recs
Packit Service 646995
 * @found: nr of recs found so far
Packit Service 646995
 * @data: data pointer passed to fn
Packit Service 646995
 * @fn: iterator function ran over each bound iface rec
Packit Service 646995
 * @targetname: rec's target name
Packit Service 646995
 * @tpgt: rec's portal group tag
Packit Service 646995
 * @ip: rec's ip address
Packit Service 646995
 * @port: rec's port
Packit Service 646995
 *
Packit Service 646995
 * This will run fn over all recs with the {targetname,tpgt,ip,port}
Packit Service 646995
 * id. It does not iterate over the ifaces setup in /etc/iscsi/ifaces.
Packit Service 646995
 *
Packit Service 646995
 * fn should return -1 if it skipped the rec, an ISCSI_ERR error code if
Packit Service 646995
 * the operation failed or 0 if fn was run successfully.
Packit Service 646995
 */
Packit Service 646995
static int idbm_for_each_iface(int *found, void *data, idbm_iface_op_fn *fn,
Packit Service 646995
			       char *targetname, int tpgt, char *ip, int port,
Packit Service 646995
			       bool ruw_lock)
Packit Service 646995
{
Packit Service 646995
	DIR *iface_dirfd;
Packit Service 646995
	struct dirent *iface_dent;
Packit Service 646995
	struct stat statb;
Packit Service 646995
	node_rec_t rec;
Packit Service 646995
	int rc = 0;
Packit Service 646995
	char *portal;
Packit Service 646995
Packit Service 646995
	portal = calloc(1, PATH_MAX);
Packit Service 646995
	if (!portal)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	if (tpgt >= 0)
Packit Service 646995
		goto read_iface;
Packit Service 646995
Packit Service 646995
	/* old style portal as a config */
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR, targetname,
Packit Service 646995
		 ip, port);
Packit Service 646995
	if (stat(portal, &statb)) {
Packit Service 646995
		log_error("iface iter could not stat %s.", portal);
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto free_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	rc = __idbm_rec_read(&rec, portal, ruw_lock);
Packit Service 646995
	if (rc)
Packit Service 646995
		goto free_portal;
Packit Service 646995
Packit Service 646995
	rc = fn(data, &rec);
Packit Service 646995
	if (!rc)
Packit Service 646995
		(*found)++;
Packit Service 646995
	else if (rc == -1)
Packit Service 646995
		rc = 0;
Packit Service 646995
	goto free_portal;
Packit Service 646995
Packit Service 646995
read_iface:
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 targetname, ip, port, tpgt);
Packit Service 646995
Packit Service 646995
	iface_dirfd = opendir(portal);
Packit Service 646995
	if (!iface_dirfd) {
Packit Service 646995
		log_error("iface iter could not read dir %s.", portal);
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto free_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	while ((iface_dent = readdir(iface_dirfd))) {
Packit Service 646995
		int curr_rc;
Packit Service 646995
Packit Service 646995
		if (!strcmp(iface_dent->d_name, ".") ||
Packit Service 646995
		    !strcmp(iface_dent->d_name, ".."))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		log_debug(5, "iface iter found %s.", iface_dent->d_name);
Packit Service 646995
		memset(portal, 0, PATH_MAX);
Packit Service 646995
		snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
Packit Service 646995
			 targetname, ip, port, tpgt, iface_dent->d_name);
Packit Service 646995
		if (__idbm_rec_read(&rec, portal, ruw_lock))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		curr_rc = fn(data, &rec);
Packit Service 646995
		/* less than zero means it was not a match */
Packit Service 646995
		if (curr_rc > 0 && !rc)
Packit Service 646995
			rc = curr_rc;
Packit Service 646995
		else if (curr_rc == 0)
Packit Service 646995
			(*found)++;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	closedir(iface_dirfd);
Packit Service 646995
free_portal:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * backwards compat
Packit Service 646995
 * The portal could be a file or dir with interfaces
Packit Service 646995
 */
Packit Service 646995
int idbm_for_each_portal(int *found, void *data, idbm_portal_op_fn *fn,
Packit Service 646995
			 char *targetname, bool ruw_lock)
Packit Service 646995
{
Packit Service 646995
	DIR *portal_dirfd;
Packit Service 646995
	struct dirent *portal_dent;
Packit Service 646995
	int rc = 0;
Packit Service 646995
	char *portal;
Packit Service 646995
Packit Service 646995
	portal = calloc(1, PATH_MAX);
Packit Service 646995
	if (!portal)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, targetname);
Packit Service 646995
	portal_dirfd = opendir(portal);
Packit Service 646995
	if (!portal_dirfd) {
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto done;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	while ((portal_dent = readdir(portal_dirfd))) {
Packit Service 646995
		char *tmp_port, *tmp_tpgt;
Packit Service 646995
		int curr_rc;
Packit Service 646995
Packit Service 646995
		if (!strcmp(portal_dent->d_name, ".") ||
Packit Service 646995
		    !strcmp(portal_dent->d_name, ".."))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		log_debug(5, "found %s", portal_dent->d_name);
Packit Service 646995
		tmp_port = strchr(portal_dent->d_name, ',');
Packit Service 646995
		if (!tmp_port)
Packit Service 646995
			continue;
Packit Service 646995
		*tmp_port++ = '\0';
Packit Service 646995
		tmp_tpgt = strchr(tmp_port, ',');
Packit Service 646995
		if (tmp_tpgt)
Packit Service 646995
			*tmp_tpgt++ = '\0';
Packit Service 646995
Packit Service 646995
		curr_rc = fn(found, data, targetname,
Packit Service 646995
			tmp_tpgt ? atoi(tmp_tpgt) : -1,
Packit Service 646995
			portal_dent->d_name, atoi(tmp_port),
Packit Service 646995
			ruw_lock);
Packit Service 646995
		/* less than zero means it was not a match */
Packit Service 646995
		if (curr_rc > 0 && !rc)
Packit Service 646995
			rc = curr_rc;
Packit Service 646995
	}
Packit Service 646995
	closedir(portal_dirfd);
Packit Service 646995
done:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_for_each_node(int *found, void *data, idbm_node_op_fn *fn, bool ruw_lock)
Packit Service 646995
{
Packit Service 646995
	DIR *node_dirfd;
Packit Service 646995
	struct dirent *node_dent;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	*found = 0;
Packit Service 646995
Packit Service 646995
	node_dirfd = opendir(NODE_CONFIG_DIR);
Packit Service 646995
	if (!node_dirfd)
Packit Service 646995
		/* on start up node dir may not be created */
Packit Service 646995
		return 0;
Packit Service 646995
Packit Service 646995
	while ((node_dent = readdir(node_dirfd))) {
Packit Service 646995
		int curr_rc;
Packit Service 646995
Packit Service 646995
		if (!strcmp(node_dent->d_name, ".") ||
Packit Service 646995
		    !strcmp(node_dent->d_name, ".."))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
		log_debug(5, "searching %s", node_dent->d_name);
Packit Service 646995
		curr_rc = fn(found, data, node_dent->d_name, ruw_lock);
Packit Service 646995
		/* less than zero means it was not a match */
Packit Service 646995
		if (curr_rc > 0 && !rc)
Packit Service 646995
			rc = curr_rc;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	closedir(node_dirfd);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int iface_fn(void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct rec_op_data *op_data = data;
Packit Service 646995
Packit Service 646995
	return op_data->fn(op_data->data, rec);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int portal_fn(int *found, void *data, char *targetname,
Packit Service 646995
		     int tpgt, char *ip, int port, bool ruw_lock)
Packit Service 646995
{
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	if (ruw_lock) {
Packit Service 646995
		rc = idbm_lock();
Packit Service 646995
		if (rc)
Packit Service 646995
			return rc;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	rc = idbm_for_each_iface(found, data, iface_fn, targetname,
Packit Service 646995
			         tpgt, ip, port, ruw_lock);
Packit Service 646995
	if (ruw_lock)
Packit Service 646995
		idbm_unlock();
Packit Service 646995
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int node_fn(int *found, void *data, char *targetname, bool ruw_lock)
Packit Service 646995
{
Packit Service 646995
	return idbm_for_each_portal(found, data, portal_fn, targetname, ruw_lock);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_for_each_rec(int *found, void *data, idbm_iface_op_fn *fn, bool ruw_lock)
Packit Service 646995
{
Packit Service 646995
	struct rec_op_data op_data;
Packit Service 646995
Packit Service 646995
	memset(&op_data, 0, sizeof(struct rec_op_data));
Packit Service 646995
	op_data.data = data;
Packit Service 646995
	op_data.fn = fn;
Packit Service 646995
Packit Service 646995
	return idbm_for_each_node(found, &op_data, node_fn, ruw_lock);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static struct {
Packit Service 646995
	char *config_root;
Packit Service 646995
	char *config_name;
Packit Service 646995
} disc_type_to_config_vals[] = {
Packit Service 646995
	{ ST_CONFIG_DIR, ST_CONFIG_NAME },
Packit Service 646995
	{ ISNS_CONFIG_DIR, ISNS_CONFIG_NAME },
Packit Service 646995
};
Packit Service 646995
Packit Service 646995
int
Packit Service 646995
idbm_discovery_read(discovery_rec_t *out_rec, int drec_type,
Packit Service 646995
		    char *addr, int port)
Packit Service 646995
{
Packit Service 646995
	recinfo_t *info;
Packit Service 646995
	char *portal;
Packit Service 646995
	int rc = 0;
Packit Service 646995
	FILE *f;
Packit Service 646995
Packit Service 646995
	if (drec_type > 1)
Packit Service 646995
		return ISCSI_ERR_INVAL;
Packit Service 646995
Packit Service 646995
	memset(out_rec, 0, sizeof(discovery_rec_t));
Packit Service 646995
	out_rec->iscsid_req_tmo = -1;
Packit Service 646995
Packit Service 646995
	info = idbm_recinfo_alloc(MAX_KEYS);
Packit Service 646995
	if (!info)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	portal = malloc(PATH_MAX);
Packit Service 646995
	if (!portal) {
Packit Service 646995
		rc = ISCSI_ERR_NOMEM;
Packit Service 646995
		goto free_info;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s,%d",
Packit Service 646995
		 disc_type_to_config_vals[drec_type].config_root,
Packit Service 646995
		 addr, port);
Packit Service 646995
	log_debug(5, "Looking for config file %s", portal);
Packit Service 646995
Packit Service 646995
	rc = idbm_lock();
Packit Service 646995
	if (rc)
Packit Service 646995
		goto free_info;
Packit Service 646995
Packit Service 646995
	f = idbm_open_rec_r(portal,
Packit Service 646995
			    disc_type_to_config_vals[drec_type].config_name);
Packit Service 646995
	if (!f) {
Packit Service 646995
		log_debug(1, "Could not open %s: %s", portal,
Packit Service 646995
			  strerror(errno));
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto unlock;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	idbm_discovery_setup_defaults(out_rec, drec_type);
Packit Service 646995
	idbm_recinfo_discovery(out_rec, info);
Packit Service 646995
	idbm_recinfo_config(info, f);
Packit Service 646995
	fclose(f);
Packit Service 646995
Packit Service 646995
unlock:
Packit Service 646995
	idbm_unlock();
Packit Service 646995
free_info:
Packit Service 646995
	free(portal);
Packit Service 646995
	free(info);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * Backwards Compat:
Packit Service 646995
 * If the portal is a file then we are doing the old style default
Packit Service 646995
 * session behavior (svn pre 780).
Packit Service 646995
 */
Packit Service 646995
static FILE *idbm_open_rec_w(char *portal, char *config)
Packit Service 646995
{
Packit Service 646995
	struct stat statb;
Packit Service 646995
	FILE *f;
Packit Service 646995
	int err;
Packit Service 646995
Packit Service 646995
	log_debug(5, "Looking for config file %s", portal);
Packit Service 646995
Packit Service 646995
	err = stat(portal, &statb);
Packit Service 646995
	if (err)
Packit Service 646995
		goto mkdir_portal;
Packit Service 646995
Packit Service 646995
	if (!S_ISDIR(statb.st_mode)) {
Packit Service 646995
		/*
Packit Service 646995
		 * Old style portal as a file. Let's update it.
Packit Service 646995
		 */
Packit Service 646995
		if (unlink(portal)) {
Packit Service 646995
			log_error("Could not convert %s to %s/%s. "
Packit Service 646995
				 "err %d", portal, portal,
Packit Service 646995
				  config, errno);
Packit Service 646995
			return NULL;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
mkdir_portal:
Packit Service 646995
		if (mkdir(portal, 0660) != 0) {
Packit Service 646995
			log_error("Could not make dir %s err %d",
Packit Service 646995
				  portal, errno);
Packit Service 646995
			return NULL;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	strlcat(portal, "/", PATH_MAX);
Packit Service 646995
	strlcat(portal, config, PATH_MAX);
Packit Service 646995
	f = fopen(portal, "w");
Packit Service 646995
	if (!f)
Packit Service 646995
		log_error("Could not open %s err %d", portal, errno);
Packit Service 646995
	return f;
Packit Service 646995
}
Packit Service 646995
Packit Service d00439
static int idbm_rec_write_new(node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct stat statb;
Packit Service 646995
	FILE *f;
Packit Service 646995
	char *portal;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	portal = malloc(PATH_MAX);
Packit Service 646995
	if (!portal) {
Packit Service 646995
		log_error("Could not alloc portal");
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port);
Packit Service 5c9eca
Packit Service 646995
	rc = stat(portal, &statb);
Packit Service 646995
	if (rc) {
Packit Service 646995
		rc = 0;
Packit Service 646995
		/*
Packit Service 646995
		 * older iscsiadm versions had you create the config then set
Packit Service 646995
		 * set the tgpt. In new versions you must pass all the info in
Packit Service 646995
		 * from the start
Packit Service 646995
		 */
Packit Service 5c9eca
		goto mkdir_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (!S_ISDIR(statb.st_mode)) {
Packit Service 646995
		/*
Packit Service 646995
		 * Old style portal as a file, but with tpgt. Let's update it.
Packit Service 646995
		 */
Packit Service 646995
		if (unlink(portal)) {
Packit Service 646995
			log_error("Could not convert %s: %s", portal,
Packit Service 646995
				  strerror(errno));
Packit Service 646995
			rc = ISCSI_ERR_IDBM;
Packit Service d00439
			goto free_portal;
Packit Service 646995
		}
Packit Service 646995
	} else {
Packit Service 646995
		rc = ISCSI_ERR_INVAL;
Packit Service d00439
		goto free_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
mkdir_portal:
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt);
Packit Service 646995
	if (stat(portal, &statb)) {
Packit Service 646995
		if (mkdir(portal, 0660) != 0) {
Packit Service 646995
			log_error("Could not make dir %s: %s",
Packit Service 646995
				  portal, strerror(errno));
Packit Service 646995
			rc = ISCSI_ERR_IDBM;
Packit Service d00439
			goto free_portal;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt,
Packit Service 646995
		 rec->iface.name);
Packit Service d00439
Packit Service 646995
	f = fopen(portal, "w");
Packit Service 646995
	if (!f) {
Packit Service 646995
		log_error("Could not open %s: %s", portal, strerror(errno));
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service d00439
		goto free_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f);
Packit Service 646995
	fclose(f);
Packit Service d00439
free_portal:
Packit Service d00439
	free(portal);
Packit Service d00439
	return rc;
Packit Service d00439
}
Packit Service d00439
Packit Service d00439
static int idbm_rec_write_old(node_rec_t *rec)
Packit Service d00439
{
Packit Service d00439
	FILE *f;
Packit Service d00439
	char *portal;
Packit Service d00439
	int rc = 0;
Packit Service d1f683
	glob_t globbuf;
Packit Service d1f683
	size_t i;
Packit Service d1f683
	int tpgt = PORTAL_GROUP_TAG_UNKNOWN;
Packit Service d00439
Packit Service d00439
	portal = malloc(PATH_MAX);
Packit Service d00439
	if (!portal) {
Packit Service d00439
		log_error("Could not alloc portal");
Packit Service d00439
		return ISCSI_ERR_NOMEM;
Packit Service d00439
	}
Packit Service d1f683
Packit Service d1f683
	/* check for newer portal dir with tpgt */
Packit Service d1f683
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,*", NODE_CONFIG_DIR,
Packit Service d1f683
		 rec->name, rec->conn[0].address, rec->conn[0].port);
Packit Service d1f683
	rc = glob(portal, GLOB_ONLYDIR, NULL, &globbuf);
Packit Service d1f683
	if (!rc) {
Packit Service d1f683
		if (globbuf.gl_pathc > 1)
Packit Service d1f683
			log_warning("multiple tpg records for portal "
Packit Service d1f683
				    "%s/%s:%d found", rec->name,
Packit Service d1f683
				    rec->conn[0].address, rec->conn[0].port);
Packit Service d1f683
		/* set pattern for sscanf matching of tpgt */
Packit Service d1f683
		snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%%u", NODE_CONFIG_DIR,
Packit Service d1f683
			 rec->name, rec->conn[0].address, rec->conn[0].port);
Packit Service d1f683
		for (i = 0; i < globbuf.gl_pathc; i++) {
Packit Service d1f683
			rc = sscanf(globbuf.gl_pathv[i], portal, &tpgt);
Packit Service d1f683
			if (rc == 1)
Packit Service d1f683
				break;
Packit Service d1f683
		}
Packit Service d1f683
		if (tpgt == PORTAL_GROUP_TAG_UNKNOWN)
Packit Service d1f683
			log_warning("glob match on existing records, "
Packit Service d1f683
				    "but no valid tpgt found");
Packit Service d1f683
	}
Packit Service d1f683
	globfree(&globbuf);
Packit Service d1f683
	rc = 0;
Packit Service d1f683
Packit Service d1f683
	/* if a tpgt was selected from an old record, write entry in new format */
Packit Service d1f683
	if (tpgt != PORTAL_GROUP_TAG_UNKNOWN) {
Packit Service d1f683
		log_warning("using tpgt %u from existing record", tpgt);
Packit Service d1f683
		rec->tpgt = tpgt;
Packit Service d1f683
		rc = idbm_remove_disc_to_node_link(rec, portal);
Packit Service d1f683
		free(portal);
Packit Service d1f683
		return idbm_rec_write_new(rec);
Packit Service d1f683
	}
Packit Service d1f683
Packit Service d00439
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
Packit Service d00439
		 rec->name, rec->conn[0].address, rec->conn[0].port);
Packit Service d00439
Packit Service d00439
	f = fopen(portal, "w");
Packit Service d00439
	if (!f) {
Packit Service d00439
		log_error("Could not open %s: %sd", portal, strerror(errno));
Packit Service d00439
		rc = ISCSI_ERR_IDBM;
Packit Service d00439
		goto free_portal;
Packit Service d00439
	}
Packit Service d00439
	idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f);
Packit Service d00439
	fclose(f);
Packit Service d00439
free_portal:
Packit Service d00439
	free(portal);
Packit Service d00439
	return rc;
Packit Service d00439
}
Packit Service d00439
Packit Service d00439
/*
Packit Service d00439
 * When the disable_lock param is true, the idbm_lock/idbm_unlock needs
Packit Service d00439
 * to be holt by the caller, this will avoid overwriting each other in
Packit Service d00439
 * case of updating(read-modify-write) the recs in parallel.
Packit Service d00439
 */
Packit Service d00439
static int idbm_rec_write(node_rec_t *rec, bool disable_lock)
Packit Service d00439
{
Packit Service d00439
	char *portal;
Packit Service d00439
	int rc = 0;
Packit Service d00439
Packit Service d00439
	portal = malloc(PATH_MAX);
Packit Service d00439
	if (!portal) {
Packit Service d00439
		log_error("Could not alloc portal");
Packit Service d00439
		return ISCSI_ERR_NOMEM;
Packit Service d00439
	}
Packit Service d00439
Packit Service d00439
	snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR);
Packit Service d00439
	if (access(portal, F_OK) != 0) {
Packit Service d00439
		if (mkdir(portal, 0660) != 0) {
Packit Service d00439
			log_error("Could not make %s: %s", portal,
Packit Service d00439
				  strerror(errno));
Packit Service d00439
			rc = ISCSI_ERR_IDBM;
Packit Service d00439
			goto free_portal;
Packit Service d00439
		}
Packit Service d00439
	}
Packit Service d00439
Packit Service d00439
	snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name);
Packit Service d00439
	if (access(portal, F_OK) != 0) {
Packit Service d00439
		if (mkdir(portal, 0660) != 0) {
Packit Service d00439
			log_error("Could not make %s: %s", portal,
Packit Service d00439
				  strerror(errno));
Packit Service d00439
			rc = ISCSI_ERR_IDBM;
Packit Service d00439
			goto free_portal;
Packit Service d00439
		}
Packit Service d00439
	}
Packit Service d00439
Packit Service d00439
	if (!disable_lock) {
Packit Service d00439
		rc = idbm_lock();
Packit Service d00439
		if (rc)
Packit Service d00439
			goto free_portal;
Packit Service d00439
	}
Packit Service d00439
Packit Service d00439
	if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN)
Packit Service d00439
		/* old style portal as config */
Packit Service d00439
		rc = idbm_rec_write_old(rec);
Packit Service d00439
	else
Packit Service d00439
		rc = idbm_rec_write_new(rec);
Packit Service d00439
Packit Service 646995
	if (!disable_lock)
Packit Service 646995
		idbm_unlock();
Packit Service 646995
free_portal:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int
Packit Service 646995
idbm_discovery_write(discovery_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	FILE *f;
Packit Service 646995
	char *portal;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	if (rec->type > 1)
Packit Service 646995
		return ISCSI_ERR_INVAL;
Packit Service 646995
Packit Service 646995
	portal = malloc(PATH_MAX);
Packit Service 646995
	if (!portal) {
Packit Service 646995
		log_error("Could not alloc portal");
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	rc = idbm_lock();
Packit Service 646995
	if (rc)
Packit Service 646995
		goto free_portal;
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s",
Packit Service 646995
		 disc_type_to_config_vals[rec->type].config_root);
Packit Service 646995
	if (access(portal, F_OK) != 0) {
Packit Service 646995
		if (mkdir(portal, 0660) != 0) {
Packit Service 646995
			log_error("Could not make %s: %s", portal,
Packit Service 646995
				  strerror(errno));
Packit Service 646995
			rc = ISCSI_ERR_IDBM;
Packit Service 646995
			goto unlock;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s,%d",
Packit Service 646995
		 disc_type_to_config_vals[rec->type].config_root,
Packit Service 646995
		 rec->address, rec->port);
Packit Service 646995
Packit Service 646995
	f = idbm_open_rec_w(portal,
Packit Service 646995
			    disc_type_to_config_vals[rec->type].config_name);
Packit Service 646995
	if (!f) {
Packit Service 646995
		log_error("Could not open %s: %s", portal, strerror(errno));
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto unlock;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	idbm_print(IDBM_PRINT_TYPE_DISCOVERY, rec, 1, f);
Packit Service 646995
	fclose(f);
Packit Service 646995
unlock:
Packit Service 646995
	idbm_unlock();
Packit Service 646995
free_portal:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_add_discovery(discovery_rec_t *newrec)
Packit Service 646995
{
Packit Service 646995
	discovery_rec_t rec;
Packit Service 646995
Packit Service 646995
	if (!idbm_discovery_read(&rec, newrec->type, newrec->address,
Packit Service 646995
				newrec->port)) {
Packit Service 646995
		log_debug(7, "disc rec already exists");
Packit Service 646995
		/* fall through */
Packit Service 646995
	} else
Packit Service 646995
		log_debug(7, "adding new DB record");
Packit Service 646995
Packit Service 646995
	return idbm_discovery_write(newrec);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int setup_disc_to_node_link(char *disc_portal, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct stat statb;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	switch (rec->disc_type) {
Packit Service 646995
	case DISCOVERY_TYPE_SENDTARGETS:
Packit Service 646995
		/* st dir setup when we create its discovery node */
Packit Service 646995
		snprintf(disc_portal, PATH_MAX, "%s/%s,%d/%s,%s,%d,%d,%s",
Packit Service 646995
			 ST_CONFIG_DIR,
Packit Service 646995
			 rec->disc_address, rec->disc_port, rec->name,
Packit Service 646995
			 rec->conn[0].address, rec->conn[0].port, rec->tpgt,
Packit Service 646995
			 rec->iface.name);
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_FW:
Packit Service 646995
		if (access(FW_CONFIG_DIR, F_OK) != 0) {
Packit Service 646995
			if (mkdir(FW_CONFIG_DIR, 0660) != 0) {
Packit Service 646995
				log_error("Could not make %s: %s",
Packit Service 646995
					  FW_CONFIG_DIR, strerror(errno));
Packit Service 646995
				rc = ISCSI_ERR_IDBM;
Packit Service 646995
			}
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
Packit Service 646995
			 FW_CONFIG_DIR, rec->name,
Packit Service 646995
			 rec->conn[0].address, rec->conn[0].port, rec->tpgt,
Packit Service 646995
			 rec->iface.name);
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_STATIC:
Packit Service 646995
		if (access(STATIC_CONFIG_DIR, F_OK) != 0) {
Packit Service 646995
			if (mkdir(STATIC_CONFIG_DIR, 0660) != 0) {
Packit Service 646995
				log_error("Could not make %s; %s",
Packit Service 646995
					  STATIC_CONFIG_DIR, strerror(errno));
Packit Service 646995
				rc = ISCSI_ERR_IDBM;
Packit Service 646995
			}
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
Packit Service 646995
			 STATIC_CONFIG_DIR, rec->name,
Packit Service 646995
			 rec->conn[0].address, rec->conn[0].port, rec->tpgt,
Packit Service 646995
			 rec->iface.name);
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_ISNS:
Packit Service 646995
		if (access(ISNS_CONFIG_DIR, F_OK) != 0) {
Packit Service 646995
			if (mkdir(ISNS_CONFIG_DIR, 0660) != 0) {
Packit Service 646995
				log_error("Could not make %s: %s",
Packit Service 646995
					  ISNS_CONFIG_DIR, strerror(errno));
Packit Service 646995
				rc = ISCSI_ERR_IDBM;
Packit Service 646995
			}
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		/*
Packit Service 646995
		 * Older tools lumped all portals together in the
Packit Service 646995
		 * isns config dir. In 2.0-872, the isns dir added
Packit Service 646995
		 * a isns server (ddress and port) dir like sendtargets.
Packit Service 646995
		 *
Packit Service 646995
		 * If we found a older style link we return that so it
Packit Service 646995
		 * can be removed. If this function is called for
Packit Service 646995
		 * addition of a rec then the older link should have been
Packit Service 646995
		 * removed and we break down below.
Packit Service 646995
		 */
Packit Service 646995
		snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
Packit Service 646995
			 ISNS_CONFIG_DIR,
Packit Service 646995
			 rec->name, rec->conn[0].address,
Packit Service 646995
			 rec->conn[0].port, rec->tpgt, rec->iface.name);
Packit Service 646995
		if (!stat(disc_portal, &statb)) {
Packit Service 646995
			log_debug(7, "using old style isns dir %s.",
Packit Service 646995
				  disc_portal);
Packit Service 646995
			break;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		snprintf(disc_portal, PATH_MAX, "%s/%s,%d",
Packit Service 646995
			 ISNS_CONFIG_DIR, rec->disc_address, rec->disc_port);
Packit Service 646995
		if (!stat(disc_portal, &statb) && S_ISDIR(statb.st_mode)) {
Packit Service 646995
			/*
Packit Service 646995
			 * if there is a dir for this isns server then
Packit Service 646995
			 * assume we are using the new style links
Packit Service 646995
			 */
Packit Service 646995
			snprintf(disc_portal, PATH_MAX,
Packit Service 646995
				 "%s/%s,%d/%s,%s,%d,%d,%s",
Packit Service 646995
				 ISNS_CONFIG_DIR, rec->disc_address,
Packit Service 646995
				 rec->disc_port, rec->name,
Packit Service 646995
				 rec->conn[0].address, rec->conn[0].port,
Packit Service 646995
				 rec->tpgt, rec->iface.name);
Packit Service 646995
			break;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		/* adding a older link */
Packit Service 646995
		snprintf(disc_portal, PATH_MAX, "%s/%s,%s,%d,%d,%s",
Packit Service 646995
			 ISNS_CONFIG_DIR, rec->name, rec->conn[0].address,
Packit Service 646995
			 rec->conn[0].port, rec->tpgt, rec->iface.name);
Packit Service 646995
		break;
Packit Service 646995
	case DISCOVERY_TYPE_SLP:
Packit Service 646995
	default:
Packit Service 646995
		rc = ISCSI_ERR_INVAL;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_add_node(node_rec_t *newrec, discovery_rec_t *drec, int overwrite)
Packit Service 646995
{
Packit Service 646995
	node_rec_t rec;
Packit Service 646995
	char *node_portal = NULL, *disc_portal;
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	rc = idbm_lock();
Packit Service 646995
	if (rc)
Packit Service 646995
		return rc;
Packit Service 646995
Packit Service 646995
	if (!idbm_rec_read(&rec, newrec->name, newrec->tpgt,
Packit Service 646995
			   newrec->conn[0].address, newrec->conn[0].port,
Packit Service 646995
			   &newrec->iface, true)) {
Packit Service 646995
		if (!overwrite) {
Packit Service 646995
			rc = 0;
Packit Service 646995
			goto unlock;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		rc = idbm_delete_node(&rec);
Packit Service 646995
		if (rc)
Packit Service 646995
			goto unlock;
Packit Service 646995
		log_debug(7, "overwriting existing record");
Packit Service 646995
	} else
Packit Service 646995
		log_debug(7, "adding new DB record");
Packit Service 646995
Packit Service 646995
	if (drec) {
Packit Service 646995
		newrec->disc_type = drec->type;
Packit Service 646995
		newrec->disc_port = drec->port;
Packit Service 646995
		strcpy(newrec->disc_address, drec->address);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	rc = idbm_rec_write(newrec, true);
Packit Service 646995
	/*
Packit Service 646995
	 * if a old app passed in a bogus tpgt then we do not create links
Packit Service 646995
	 * since it will set a different tpgt in another iscsiadm call
Packit Service 646995
	 */
Packit Service 646995
	if (rc || !drec || newrec->tpgt == PORTAL_GROUP_TAG_UNKNOWN)
Packit Service 646995
		goto unlock;
Packit Service 646995
Packit Service 646995
	node_portal = calloc(2, PATH_MAX);
Packit Service 646995
	if (!node_portal) {
Packit Service 646995
		rc = ISCSI_ERR_NOMEM;
Packit Service 646995
		goto unlock;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	disc_portal = node_portal + PATH_MAX;
Packit Service 646995
	snprintf(node_portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 newrec->name, newrec->conn[0].address, newrec->conn[0].port,
Packit Service 646995
		 newrec->tpgt);
Packit Service 646995
	rc = setup_disc_to_node_link(disc_portal, newrec);
Packit Service 646995
	if (rc)
Packit Service 646995
		goto unlock;
Packit Service 646995
Packit Service 646995
	log_debug(7, "node addition making link from %s to %s", node_portal,
Packit Service 646995
		 disc_portal);
Packit Service 646995
Packit Service 646995
	if (symlink(node_portal, disc_portal)) {
Packit Service 646995
		if (errno == EEXIST)
Packit Service 646995
			log_debug(7, "link from %s to %s exists", node_portal,
Packit Service 646995
				  disc_portal);
Packit Service 646995
		else {
Packit Service 646995
			rc = ISCSI_ERR_IDBM;
Packit Service 646995
			log_error("Could not make link from disc source %s to "
Packit Service 646995
				 "node %s: %s", disc_portal, node_portal,
Packit Service 646995
				 strerror(errno));
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
unlock:
Packit Service 646995
	idbm_unlock();
Packit Service 646995
	free(node_portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int idbm_bind_iface_to_nodes(idbm_disc_nodes_fn *disc_node_fn,
Packit Service 646995
				    void *data, struct iface_rec *iface,
Packit Service 646995
				    struct list_head *bound_recs)
Packit Service 646995
{
Packit Service 646995
	struct node_rec *rec, *tmp;
Packit Service 646995
	struct list_head new_recs;
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	INIT_LIST_HEAD(&new_recs);
Packit Service 646995
	rc = disc_node_fn(data, iface, &new_recs);
Packit Service 646995
	if (rc)
Packit Service 646995
		return rc;
Packit Service 646995
Packit Service 646995
	list_for_each_entry_safe(rec, tmp, &new_recs, list) {
Packit Service 646995
		list_del_init(&rec->list);
Packit Service 646995
		list_add_tail(&rec->list, bound_recs);
Packit Service 646995
		iface_copy(&rec->iface, iface);
Packit Service 646995
	}
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int
Packit Service 646995
discovery_error_fatal(int err)
Packit Service 646995
{
Packit Service 646995
	switch (err) {
Packit Service 646995
	/* No error */
Packit Service 646995
	case ISCSI_SUCCESS:
Packit Service 646995
	/* Transport errors or timeouts are not fatal */
Packit Service 646995
	case ISCSI_ERR_TRANS:
Packit Service 646995
	case ISCSI_ERR_TRANS_TIMEOUT:
Packit Service 646995
		return 0;
Packit Service 646995
	}
Packit Service 646995
	return 1;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_bind_ifaces_to_nodes(idbm_disc_nodes_fn *disc_node_fn,
Packit Service 646995
			      void *data, struct list_head *ifaces,
Packit Service 646995
			      struct list_head *bound_recs)
Packit Service 646995
{
Packit Service 646995
	struct list_head def_ifaces;
Packit Service 646995
	struct node_rec *rec, *tmp_rec;
Packit Service 646995
	struct iface_rec *iface, *tmp_iface;
Packit Service 646995
	struct iscsi_transport *t;
Packit Service 646995
	int rc = 0, found = 0;
Packit Service 646995
Packit Service 646995
	INIT_LIST_HEAD(&def_ifaces);
Packit Service 646995
Packit Service 646995
	if (!ifaces || list_empty(ifaces)) {
Packit Service 646995
		iface_link_ifaces(&def_ifaces);
Packit Service 646995
Packit Service 646995
		list_for_each_entry_safe(iface, tmp_iface, &def_ifaces, list) {
Packit Service 646995
			list_del(&iface->list);
Packit Service 646995
			t = iscsi_sysfs_get_transport_by_name(iface->transport_name);
Packit Service 646995
			/*
Packit Service 646995
			 * only auto bind to software iscsi if it is
Packit Service 646995
			 * not the default iface (that is handled below)
Packit Service 646995
			 */
Packit Service 646995
			if (!t || strcmp(t->name, DEFAULT_TRANSPORT) ||
Packit Service 646995
			    !strcmp(iface->name, DEFAULT_IFACENAME)) {
Packit Service 646995
				free(iface);
Packit Service 646995
				continue;
Packit Service 646995
			}
Packit Service 646995
Packit Service 646995
			rc = idbm_bind_iface_to_nodes(disc_node_fn, data, iface,
Packit Service 646995
						      bound_recs);
Packit Service 646995
			free(iface);
Packit Service 646995
			if (discovery_error_fatal(rc))
Packit Service 646995
				goto fail;
Packit Service 646995
			found = 1;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		/* create default iface with old/default behavior */
Packit Service 646995
		if (!found) {
Packit Service 646995
			struct iface_rec def_iface;
Packit Service 646995
Packit Service 646995
			memset(&def_iface, 0, sizeof(struct iface_rec));
Packit Service 646995
			iface_setup_defaults(&def_iface);
Packit Service 646995
			return idbm_bind_iface_to_nodes(disc_node_fn, data,
Packit Service 646995
							&def_iface, bound_recs);
Packit Service 646995
		}
Packit Service 646995
	} else {
Packit Service 646995
		list_for_each_entry(iface, ifaces, list) {
Packit Service 646995
			if (strcmp(iface->name, DEFAULT_IFACENAME) &&
Packit Service 646995
			    !iface_is_valid(iface)) {
Packit Service 646995
				log_error("iface %s is not valid. Will not "
Packit Service 646995
					  "bind node to it. Iface settings "
Packit Service 646995
					  iface_fmt, iface->name,
Packit Service 646995
					  iface_str(iface));
Packit Service 646995
				continue;
Packit Service 646995
			}
Packit Service 646995
Packit Service 646995
			rc = idbm_bind_iface_to_nodes(disc_node_fn, data, iface,
Packit Service 646995
						      bound_recs);
Packit Service 646995
			if (discovery_error_fatal(rc))
Packit Service 646995
				goto fail;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
	return 0;
Packit Service 646995
Packit Service 646995
fail:
Packit Service 646995
	list_for_each_entry_safe(iface, tmp_iface, &def_ifaces, list) {
Packit Service 646995
		list_del(&iface->list);
Packit Service 646995
		free(iface);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	list_for_each_entry_safe(rec, tmp_rec, bound_recs, list) {
Packit Service 646995
		list_del(&rec->list);
Packit Service 646995
		free(rec);
Packit Service 646995
	}
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static void idbm_rm_disc_node_links(char *disc_dir)
Packit Service 646995
{
Packit Service 646995
	char *target = NULL, *tpgt = NULL, *port = NULL;
Packit Service 646995
	char *address = NULL, *iface_id = NULL;
Packit Service 646995
	DIR *disc_dirfd;
Packit Service 646995
	struct dirent *disc_dent;
Packit Service 646995
	node_rec_t *rec;
Packit Service 646995
Packit Service 646995
	rec = calloc(1, sizeof(*rec));
Packit Service 646995
	if (!rec)
Packit Service 646995
		return;
Packit Service 646995
Packit Service 646995
	disc_dirfd = opendir(disc_dir);
Packit Service 646995
	if (!disc_dirfd)
Packit Service 646995
		goto free_rec;
Packit Service 646995
Packit Service 646995
	/* rm links to nodes */
Packit Service 646995
	while ((disc_dent = readdir(disc_dirfd))) {
Packit Service 646995
		if (!strcmp(disc_dent->d_name, ".") ||
Packit Service 646995
		    !strcmp(disc_dent->d_name, ".."))
Packit Service 646995
			continue;
Packit Service 646995
Packit Service 646995
Packit Service 646995
		if (get_params_from_disc_link(disc_dent->d_name, &target, &tpgt,
Packit Service 646995
					      &address, &port, &iface_id)) {
Packit Service 646995
			log_error("Improperly formed disc to node link");
Packit Service 646995
			continue;
Packit Service 646995
		}
Packit Service 646995
Packit Service 646995
		log_debug(5, "disc removal removing link %s %s %s %s",
Packit Service 646995
			  target, address, port, iface_id);
Packit Service 646995
Packit Service 646995
		memset(rec, 0, sizeof(*rec));
Packit Service 646995
		strlcpy(rec->name, target, TARGET_NAME_MAXLEN);
Packit Service 646995
		rec->tpgt = atoi(tpgt);
Packit Service 646995
		rec->conn[0].port = atoi(port);
Packit Service 646995
		strlcpy(rec->conn[0].address, address, NI_MAXHOST);
Packit Service 646995
		strlcpy(rec->iface.name, iface_id, ISCSI_MAX_IFACE_LEN);
Packit Service 646995
Packit Service 646995
		if (idbm_delete_node(rec))
Packit Service 646995
			log_error("Could not delete node %s/%s/%s,%s/%s",
Packit Service 646995
				  NODE_CONFIG_DIR, target, address, port,
Packit Service 646995
				  iface_id);
Packit Service 646995
 	}
Packit Service 646995
Packit Service 646995
	closedir(disc_dirfd);
Packit Service 646995
free_rec:
Packit Service 646995
	free(rec);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_delete_discovery(discovery_rec_t *drec)
Packit Service 646995
{
Packit Service 646995
	char *portal;
Packit Service 646995
	struct stat statb;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	portal = calloc(1, PATH_MAX);
Packit Service 646995
	if (!portal)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s,%d",
Packit Service 646995
		 disc_type_to_config_vals[drec->type].config_root,
Packit Service 646995
		 drec->address, drec->port);
Packit Service 646995
	log_debug(5, "Removing config file %s", portal);
Packit Service 646995
Packit Service 646995
	if (stat(portal, &statb)) {
Packit Service 646995
		log_debug(5, "Could not stat %s to delete disc err %d",
Packit Service 646995
			  portal, errno);
Packit Service 646995
		goto free_portal;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (S_ISDIR(statb.st_mode)) {
Packit Service 646995
		strlcat(portal, "/", PATH_MAX);
Packit Service 646995
		strlcat(portal,
Packit Service 646995
			disc_type_to_config_vals[drec->type].config_name,
Packit Service 646995
			PATH_MAX);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	if (unlink(portal))
Packit Service 646995
		log_debug(5, "Could not remove %s err %d", portal, errno);
Packit Service 646995
Packit Service 646995
	memset(portal, 0, PATH_MAX);
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s,%d",
Packit Service 646995
		 disc_type_to_config_vals[drec->type].config_root,
Packit Service 646995
		 drec->address, drec->port);
Packit Service 646995
	idbm_rm_disc_node_links(portal);
Packit Service 646995
Packit Service 646995
	/* rm portal dir */
Packit Service 646995
	if (S_ISDIR(statb.st_mode)) {
Packit Service 646995
		memset(portal, 0, PATH_MAX);
Packit Service 646995
		snprintf(portal, PATH_MAX, "%s/%s,%d",
Packit Service 646995
			 disc_type_to_config_vals[drec->type].config_root,
Packit Service 646995
			 drec->address, drec->port);
Packit Service 646995
		rmdir(portal);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
free_portal:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/*
Packit Service 646995
 * Backwards Compat or SLP:
Packit Service 646995
 * if there is no link then this is pre svn 780 version where
Packit Service 646995
 * we did not link the disc source and node
Packit Service 646995
 */
Packit Service 646995
static int idbm_remove_disc_to_node_link(node_rec_t *rec,
Packit Service 646995
					 char *portal)
Packit Service 646995
{
Packit Service 646995
	int rc = 0;
Packit Service 646995
	struct stat statb;
Packit Service 646995
	node_rec_t *tmprec;
Packit Service 646995
Packit Service 646995
	tmprec = malloc(sizeof(*tmprec));
Packit Service 646995
	if (!tmprec)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	memset(portal, 0, PATH_MAX);
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt,
Packit Service 646995
		 rec->iface.name);
Packit Service 646995
Packit Service 646995
	rc = __idbm_rec_read(tmprec, portal, false);
Packit Service 646995
	if (rc) {
Packit Service 646995
		/* old style recs will not have tpgt or a link so skip */
Packit Service 646995
		rc = 0;
Packit Service 646995
		goto done;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	log_debug(7, "found drec %s %d",
Packit Service 646995
		  tmprec->disc_address, tmprec->disc_port);
Packit Service 646995
	/* rm link from discovery source to node */
Packit Service 646995
	memset(portal, 0, PATH_MAX);
Packit Service 646995
	rc = setup_disc_to_node_link(portal, tmprec);
Packit Service 646995
	if (rc)
Packit Service 646995
		goto done;
Packit Service 646995
Packit Service 646995
	rc = idbm_lock();
Packit Service 646995
	if (rc)
Packit Service 646995
		goto done;
Packit Service 646995
Packit Service 646995
	if (!stat(portal, &statb)) {
Packit Service 646995
		if (unlink(portal)) {
Packit Service 646995
			log_error("Could not remove link %s: %s",
Packit Service 646995
				  portal, strerror(errno));
Packit Service 646995
			rc = ISCSI_ERR_IDBM;
Packit Service 646995
		} else
Packit Service 646995
			log_debug(7, "rmd %s", portal);
Packit Service 646995
	} else
Packit Service 646995
		log_debug(7, "Could not stat %s", portal);
Packit Service 646995
	idbm_unlock();
Packit Service 646995
Packit Service 646995
done:
Packit Service 646995
	free(tmprec);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
static int st_disc_filter(const struct dirent *dir)
Packit Service 646995
{
Packit Service 646995
	return strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..") &&
Packit Service 646995
		strcmp(dir->d_name, ST_CONFIG_NAME);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_delete_node(node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct stat statb;
Packit Service 646995
	char *portal;
Packit Service 646995
	int rc = 0, dir_rm_rc = 0;
Packit Service 646995
Packit Service 646995
	portal = calloc(1, PATH_MAX);
Packit Service 646995
	if (!portal)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	rc = idbm_remove_disc_to_node_link(rec, portal);
Packit Service 646995
	if (rc)
Packit Service 646995
		goto free_portal;
Packit Service 646995
Packit Service 646995
	memset(portal, 0, PATH_MAX);
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port);
Packit Service 646995
	log_debug(5, "Removing config file %s iface id %s",
Packit Service 646995
		  portal, rec->iface.name);
Packit Service 646995
Packit Service 646995
	rc = idbm_lock();
Packit Service 646995
	if (rc)
Packit Service 646995
		goto free_portal;
Packit Service 646995
Packit Service 646995
	if (!stat(portal, &statb))
Packit Service 646995
		goto rm_conf;
Packit Service 646995
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port,
Packit Service 646995
		 rec->tpgt, rec->iface.name);
Packit Service 646995
	log_debug(5, "Removing config file %s", portal);
Packit Service 646995
Packit Service 646995
	if (!stat(portal, &statb))
Packit Service 646995
		goto rm_conf;
Packit Service 646995
Packit Service 646995
	log_error("Could not stat %s to delete node: %s",
Packit Service 646995
		  portal, strerror(errno));
Packit Service 646995
	rc = ISCSI_ERR_IDBM;
Packit Service 646995
	goto unlock;
Packit Service 646995
Packit Service 646995
rm_conf:
Packit Service 646995
	if (unlink(portal)) {
Packit Service 646995
		log_error("Could not remove %s: %s", portal, strerror(errno));
Packit Service 646995
		rc = ISCSI_ERR_IDBM;
Packit Service 646995
		goto unlock;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	memset(portal, 0, PATH_MAX);
Packit Service 646995
	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
Packit Service 646995
		 rec->name, rec->conn[0].address, rec->conn[0].port,
Packit Service 646995
		 rec->tpgt);
Packit Service 646995
	if (!stat(portal, &statb)) {
Packit Service 646995
		struct dirent **namelist;
Packit Service 646995
		int n, i;
Packit Service 646995
Packit Service 646995
		memset(portal, 0, PATH_MAX);
Packit Service 646995
		snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d", NODE_CONFIG_DIR,
Packit Service 646995
			 rec->name, rec->conn[0].address, rec->conn[0].port,
Packit Service 646995
			 rec->tpgt);
Packit Service 646995
		n = scandir(portal, &namelist, st_disc_filter, alphasort);
Packit Service 646995
		if (n < 0)
Packit Service 646995
			goto free_portal;
Packit Service 646995
		if (n == 0)
Packit Service 646995
			dir_rm_rc = rmdir(portal);
Packit Service 646995
Packit Service 646995
		for (i = 0; i < n; i++)
Packit Service 646995
			free(namelist[i]);
Packit Service 646995
		free(namelist);
Packit Service 646995
	}
Packit Service 646995
	/* rm target dir */
Packit Service 646995
	if (!dir_rm_rc) {
Packit Service 646995
		memset(portal, 0, PATH_MAX);
Packit Service 646995
		snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name);
Packit Service 646995
		rmdir(portal);
Packit Service 646995
	}
Packit Service 646995
unlock:
Packit Service 646995
	idbm_unlock();
Packit Service 646995
free_portal:
Packit Service 646995
	free(portal);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void
Packit Service 646995
idbm_sendtargets_defaults(struct iscsi_sendtargets_config *cfg)
Packit Service 646995
{
Packit Service 646995
	idbm_sync_config();
Packit Service 646995
	memcpy(cfg, &db->drec_st.u.sendtargets,
Packit Service 646995
	       sizeof(struct iscsi_sendtargets_config));
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void
Packit Service 646995
idbm_isns_defaults(struct iscsi_isns_config *cfg)
Packit Service 646995
{
Packit Service 646995
	idbm_sync_config();
Packit Service 646995
	memcpy(cfg, &db->drec_isns.u.isns,
Packit Service 646995
	       sizeof(struct iscsi_isns_config));
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void
Packit Service 646995
idbm_slp_defaults(struct iscsi_slp_config *cfg)
Packit Service 646995
{
Packit Service 646995
	memcpy(cfg, &db->drec_slp.u.slp,
Packit Service 646995
	       sizeof(struct iscsi_slp_config));
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int
Packit Service 646995
idbm_session_autoscan(struct iscsi_session *session)
Packit Service 646995
{
Packit Service 646995
	if (session)
Packit Service 646995
		return session->nrec.session.scan;
Packit Service 646995
	return db->nrec.session.scan;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
struct user_param *idbm_alloc_user_param(char *name, char *value)
Packit Service 646995
{
Packit Service 646995
	struct user_param *param;
Packit Service 646995
Packit Service 646995
	param = calloc(1, sizeof(*param));
Packit Service 646995
	if (!param)
Packit Service 646995
		return NULL;
Packit Service 646995
Packit Service 646995
	INIT_LIST_HEAD(&param->list);
Packit Service 646995
Packit Service 646995
	param->name = strdup(name);
Packit Service 646995
	if (!param->name)
Packit Service 646995
		goto free_param;
Packit Service 646995
Packit Service 646995
	param->value = strdup(value);
Packit Service 646995
	if (!param->value)
Packit Service 646995
		goto free_name;
Packit Service 646995
Packit Service 646995
	return param;
Packit Service 646995
Packit Service 646995
free_name:
Packit Service 646995
	free(param->name);
Packit Service 646995
free_param:
Packit Service 646995
	free(param);
Packit Service 646995
	return NULL;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_node_set_rec_from_param(struct list_head *params, node_rec_t *rec,
Packit Service 646995
				 int verify)
Packit Service 646995
{
Packit Service 646995
	struct user_param *param;
Packit Service 646995
	recinfo_t *info;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	if (list_empty(params))
Packit Service 646995
		return 0;
Packit Service 646995
Packit Service 646995
	info = idbm_recinfo_alloc(MAX_KEYS);
Packit Service 646995
	if (!info)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	idbm_recinfo_node(rec, info);
Packit Service 646995
Packit Service 646995
	if (verify) {
Packit Service 646995
		list_for_each_entry(param, params, list) {
Packit Service 646995
			rc = idbm_verify_param(info, param->name);
Packit Service 646995
			if (rc)
Packit Service 646995
				goto free_info;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	list_for_each_entry(param, params, list) {
Packit Service 646995
		rc = idbm_rec_update_param(info, param->name, param->value, 0);
Packit Service 646995
		if (rc) {
Packit Service 646995
			if (rc == ISCSI_ERR_INVAL)
Packit Service 646995
				log_error("Unknown parameter %s.", param->name);
Packit Service 646995
			goto free_info;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
free_info:
Packit Service 646995
	free(info);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_node_set_param(void *data, node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	int rc;
Packit Service 646995
Packit Service 646995
	rc = idbm_node_set_rec_from_param(data, rec, 1);
Packit Service 646995
	if (rc)
Packit Service 646995
		return rc;
Packit Service 646995
Packit Service 646995
	return idbm_rec_write(rec, true);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_discovery_set_param(void *data, discovery_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	struct list_head *params = data;
Packit Service 646995
	struct user_param *param;
Packit Service 646995
	recinfo_t *info;
Packit Service 646995
	int rc = 0;
Packit Service 646995
Packit Service 646995
	info = idbm_recinfo_alloc(MAX_KEYS);
Packit Service 646995
	if (!info)
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
Packit Service 646995
	idbm_recinfo_discovery((discovery_rec_t *)rec, info);
Packit Service 646995
Packit Service 646995
	list_for_each_entry(param, params, list) {
Packit Service 646995
		rc = idbm_verify_param(info, param->name);
Packit Service 646995
		if (rc)
Packit Service 646995
			goto free_info;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	list_for_each_entry(param, params, list) {
Packit Service 646995
		rc = idbm_rec_update_param(info, param->name, param->value, 0);
Packit Service 646995
		if (rc)
Packit Service 646995
			goto free_info;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	rc = idbm_discovery_write((discovery_rec_t *)rec);
Packit Service 646995
	if (rc)
Packit Service 646995
		goto free_info;
Packit Service 646995
Packit Service 646995
free_info:
Packit Service 646995
	free(info);
Packit Service 646995
	return rc;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
int idbm_init(idbm_get_config_file_fn *fn)
Packit Service 646995
{
Packit Service 646995
	/* make sure root db dir is there */
Packit Service 646995
	if (access(ISCSI_CONFIG_ROOT, F_OK) != 0) {
Packit Service 646995
		if (mkdir(ISCSI_CONFIG_ROOT, 0660) != 0) {
Packit Service 646995
			log_error("Could not make %s %d", ISCSI_CONFIG_ROOT,
Packit Service 646995
				   errno);
Packit Service 646995
			return errno;
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	db = malloc(sizeof(idbm_t));
Packit Service 646995
	if (!db) {
Packit Service 646995
		log_error("out of memory on idbm allocation");
Packit Service 646995
		return ISCSI_ERR_NOMEM;
Packit Service 646995
	}
Packit Service 646995
	memset(db, 0, sizeof(idbm_t));
Packit Service 646995
	db->get_config_file = fn;
Packit Service 646995
	return 0;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_terminate(void)
Packit Service 646995
{
Packit Service 646995
	if (db)
Packit Service 646995
		free(db);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/**
Packit Service 646995
 * idbm_create_rec - allocate and setup a node record
Packit Service 646995
 * @targetname: target name
Packit Service 646995
 * @tgpt: target portal group
Packit Service 646995
 * @ip: ip address of portal
Packit Service 646995
 * @port: port of portal
Packit Service 646995
 * @iface: iscsi iface info
Packit Service 646995
 * @verbose: flag indicating whether to log ifaces setup errors
Packit Service 646995
 *
Packit Service 646995
 * The iface only needs to have the name set. This function will
Packit Service 646995
 * read in the other values.
Packit Service 646995
 */
Packit Service 646995
struct node_rec *idbm_create_rec(char *targetname, int tpgt, char *ip,
Packit Service 646995
				 int port, struct iface_rec *iface,
Packit Service 646995
				 int verbose)
Packit Service 646995
{
Packit Service 646995
	struct node_rec *rec;
Packit Service 646995
Packit Service 646995
	rec = calloc(1, sizeof(*rec));
Packit Service 646995
	if (!rec) {
Packit Service 646995
		log_error("Could not not allocate memory to create node "
Packit Service 646995
			  "record.");
Packit Service 646995
		return NULL;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	idbm_node_setup_defaults(rec);
Packit Service 646995
	if (targetname)
Packit Service 646995
		strlcpy(rec->name, targetname, TARGET_NAME_MAXLEN);
Packit Service 646995
	rec->tpgt = tpgt;
Packit Service 646995
	rec->conn[0].port = port;
Packit Service 646995
	if (ip)
Packit Service 646995
		strlcpy(rec->conn[0].address, ip, NI_MAXHOST);
Packit Service 646995
	memset(&rec->iface, 0, sizeof(struct iface_rec));
Packit Service 646995
	if (iface) {
Packit Service 646995
		iface_copy(&rec->iface, iface);
Packit Service 646995
		if (strlen(iface->name)) {
Packit Service 646995
			if (iface_conf_read(&rec->iface)) {
Packit Service 646995
				if (verbose)
Packit Service 646995
					log_error("Could not read iface info "
Packit Service 646995
						  "for %s.", iface->name);
Packit Service 646995
				goto free_rec;
Packit Service 646995
			}
Packit Service 646995
		}
Packit Service 646995
	}
Packit Service 646995
	return rec;
Packit Service 646995
free_rec:
Packit Service 646995
	free(rec);
Packit Service 646995
	return NULL;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
struct node_rec *idbm_create_rec_from_boot_context(struct boot_context *context)
Packit Service 646995
{
Packit Service 646995
	struct node_rec *rec;
Packit Service 646995
Packit Service 646995
	/* tpgt hard coded to 1 ??? */
Packit Service 646995
	rec = idbm_create_rec(context->targetname, 1,
Packit Service 646995
			      context->target_ipaddr, context->target_port,
Packit Service 646995
			      NULL, 1);
Packit Service 646995
	if (!rec) {
Packit Service 646995
		log_error("Could not setup rec for fw discovery login.");
Packit Service 646995
		return NULL;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	iface_setup_defaults(&rec->iface);
Packit Service 646995
	strlcpy(rec->session.auth.username, context->chap_name,
Packit Service 646995
		sizeof(context->chap_name));
Packit Service 646995
	strlcpy((char *)rec->session.auth.password, context->chap_password,
Packit Service 646995
		sizeof(context->chap_password));
Packit Service 646995
	strlcpy(rec->session.auth.username_in, context->chap_name_in,
Packit Service 646995
		sizeof(context->chap_name_in));
Packit Service 646995
	strlcpy((char *)rec->session.auth.password_in,
Packit Service 646995
		context->chap_password_in,
Packit Service 646995
		sizeof(context->chap_password_in));
Packit Service 646995
	rec->session.auth.password_length =
Packit Service 646995
				strlen((char *)context->chap_password);
Packit Service 646995
	rec->session.auth.password_in_length =
Packit Service 646995
				strlen((char *)context->chap_password_in);
Packit Service 646995
	strlcpy(rec->session.boot_root, context->boot_root,
Packit Service 646995
		sizeof(context->boot_root));
Packit Service 646995
	strlcpy(rec->session.boot_nic, context->boot_nic,
Packit Service 646995
		sizeof(context->boot_nic));
Packit Service 646995
	strlcpy(rec->session.boot_target, context->boot_target,
Packit Service 646995
		sizeof(context->boot_target));
Packit Service 646995
Packit Service 646995
	iface_setup_from_boot_context(&rec->iface, context);
Packit Service 646995
Packit Service 646995
	return rec;
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
void idbm_node_setup_defaults(node_rec_t *rec)
Packit Service 646995
{
Packit Service 646995
	int i;
Packit Service 646995
Packit Service 646995
	memset(rec, 0, sizeof(node_rec_t));
Packit Service 646995
Packit Service 646995
	INIT_LIST_HEAD(&rec->list);
Packit Service 646995
Packit Service 646995
	rec->tpgt = PORTAL_GROUP_TAG_UNKNOWN;
Packit Service 646995
	rec->disc_type = DISCOVERY_TYPE_STATIC;
Packit Service 646995
	rec->leading_login = 0;
Packit Service 646995
	rec->session.cmds_max = CMDS_MAX;
Packit Service 646995
	rec->session.xmit_thread_priority = XMIT_THREAD_PRIORITY;
Packit Service 646995
	rec->session.initial_cmdsn = 0;
Packit Service 646995
	rec->session.queue_depth = QUEUE_DEPTH;
Packit Service 646995
	rec->session.nr_sessions = 1;
Packit Service 646995
	rec->session.initial_login_retry_max = DEF_INITIAL_LOGIN_RETRIES_MAX;
Packit Service 646995
	rec->session.reopen_max = DEF_SESSION_REOPEN_MAX;
Packit Service 646995
	rec->session.auth.authmethod = 0;
Packit Service 646995
	/* TYPE_INT_LIST fields should be initialized to ~0 to indicate unset values */
Packit Service 646995
	memset(rec->session.auth.chap_algs, ~0, sizeof(rec->session.auth.chap_algs));
Packit Service 646995
	rec->session.auth.chap_algs[0] = AUTH_CHAP_ALG_MD5;
Packit Service 646995
	rec->session.auth.password_length = 0;
Packit Service 646995
	rec->session.auth.password_in_length = 0;
Packit Service 646995
	rec->session.err_timeo.abort_timeout = DEF_ABORT_TIMEO;
Packit Service 646995
	rec->session.err_timeo.lu_reset_timeout = DEF_LU_RESET_TIMEO;
Packit Service 646995
	rec->session.err_timeo.tgt_reset_timeout = DEF_TGT_RESET_TIMEO;
Packit Service 646995
	rec->session.err_timeo.host_reset_timeout = DEF_HOST_RESET_TIMEO;
Packit Service 646995
	rec->session.timeo.replacement_timeout = DEF_REPLACEMENT_TIMEO;
Packit Service 646995
	rec->session.info = NULL;
Packit Service 646995
	rec->session.sid = 0;
Packit Service 646995
	rec->session.multiple = 0;
Packit Service 646995
	rec->session.scan = DEF_INITIAL_SCAN;
Packit Service 646995
	idbm_setup_session_defaults(&rec->session.iscsi);
Packit Service 646995
Packit Service 646995
	for (i=0; i
Packit Service 646995
		rec->conn[i].startup = ISCSI_STARTUP_MANUAL;
Packit Service 646995
		rec->conn[i].port = ISCSI_LISTEN_PORT;
Packit Service 646995
		rec->conn[i].tcp.window_size = TCP_WINDOW_SIZE;
Packit Service 646995
		rec->conn[i].tcp.type_of_service = 0;
Packit Service 646995
		rec->conn[i].timeo.login_timeout= DEF_LOGIN_TIMEO;
Packit Service 646995
		rec->conn[i].timeo.logout_timeout= DEF_LOGOUT_TIMEO;
Packit Service 646995
		rec->conn[i].timeo.auth_timeout = 45;
Packit Service 646995
Packit Service 646995
		rec->conn[i].timeo.noop_out_interval = DEF_NOOP_OUT_INTERVAL;
Packit Service 646995
		rec->conn[i].timeo.noop_out_timeout = DEF_NOOP_OUT_TIMEO;
Packit Service 646995
Packit Service 646995
		idbm_setup_conn_defaults(&rec->conn[i].iscsi);
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	iface_setup_defaults(&rec->iface);
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
struct node_rec *
Packit Service 646995
idbm_find_rec_in_list(struct list_head *rec_list, char *targetname, char *addr,
Packit Service 646995
		      int port, struct iface_rec *iface)
Packit Service 646995
{
Packit Service 646995
	struct node_rec *rec;
Packit Service 646995
Packit Service 646995
	list_for_each_entry(rec, rec_list, list) {
Packit Service 646995
		if (__iscsi_match_session(rec, targetname, addr, port, iface,
Packit Service 646995
					  MATCH_ANY_SID))
Packit Service 646995
			return rec;
Packit Service 646995
	}
Packit Service 646995
Packit Service 646995
	return NULL;
Packit Service 646995
}